我正在使用Parsing and Reading Large Excel Files with the Open XML SDK提出的SAX方法,从datatable创建一个大型XLSX文件。我正在使用一个XLSX文件作为模板。那篇文章中描述的方法可以将新工作表替换为现有工作表,但是我想复制模板中工作表的标题行(包括字符串值、格式等),而不仅仅使用datatable的标题行,如原始代码所示。
我尝试了下面的代码,但生成的XLSX文件标题行没有文本——格式被复制了,但文本没有。我查看了工作表的XML文件,它看起来还不错(引用sharedStrings.xml文件,其中仍然定义了字符串)。Open XML SDK 2.0 Productivity Tool显示的反射代码结果有点奇怪:单元格似乎没有设置文本值:
尽管XML中写着:
OpenXmlReader使用的主要代码如下:
我尝试了下面的代码,但生成的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();
}
}
}