【发布时间】:2011-11-30 21:11:06
【问题描述】:
我正在使用Parsing and Reading Large Excel Files with the Open XML SDK 中提出的 SAX 方法从数据表创建一个大型 XLSX 文件。我正在使用 XLSX 文件作为模板。
该帖子中描述的方法可以很好地用新工作表替换现有工作表,但我想从模板中的工作表中复制标题行(字符串值、格式等),而不仅仅是使用与原始代码一样,从数据表中提取标题行。
我尝试了下面的代码,但 XLSX 文件的标题行中没有文本 - 格式被复制,而不是文本。我查看了工作表的 XML 文件,对我来说它看起来不错(引用 sharedStrings.xml 文件,它仍然具有字符串的定义)。来自Open XML SDK 2.0 Productivity Tool 的反射代码显示了一个稍微奇怪的结果:单元格似乎没有设置文本值:
cellValue1.Text = "";
即使 XML 说:
<x:c r="A1" s="4" t="s">
OpenXmlReader 使用的主要代码如下:
while (reader.Read())
{
if (reader.ElementType == typeof(SheetData))
{
if (reader.IsEndElement)
continue;
// Write sheet element
writer.WriteStartElement(new SheetData());
// copy header row from template
reader.Read();
do
{
if (reader.IsStartElement)
{
writer.WriteStartElement(reader);
}
else if (reader.IsEndElement)
{
writer.WriteEndElement();
}
reader.Read();
} while (!(reader.ElementType == typeof(Row) && reader.IsEndElement));
writer.WriteEndElement();
// Write data rows
foreach (DataRow dataRow in resultsTable.Rows)
{
// Write row element
Row r = new Row();
writer.WriteStartElement(r);
foreach (DataColumn dataCol in resultsTable.Columns)
{
Cell c = new Cell();
c.DataType = CellValues.String;
CellValue v = new CellValue(dataRow[dataCol].ToString());
c.Append(v);
// Write cell element
writer.WriteElement(c);
}
// End row
writer.WriteEndElement();
}
// End sheet
writer.WriteEndElement();
}
else
{
if (reader.IsStartElement)
{
writer.WriteStartElement(reader);
}
else if (reader.IsEndElement)
{
writer.WriteEndElement();
}
}
}
【问题讨论】:
-
这真的能处理所有数据类型(数字、布尔值、共享字符串、日期、时间跨度)吗? "c.DataType = CellValues.String;"
标签: c# excel sax openxml openxml-sdk