我需要从ASP.NET MVC网站生成一个非常大的Excel文件,但是使用Open XML SDK时遇到了内存限制。是否有一种内存高效的方法来生成这样的文件?
参考资料,我正在尝试生成一个带有约500,000行,每行有20列的电子表格。数据集本身可以很好地适应内存,但Open XML SDK会快速消耗所有可用内存。
参考资料,我正在尝试生成一个带有约500,000行,每行有20列的电子表格。数据集本身可以很好地适应内存,但Open XML SDK会快速消耗所有可用内存。
您可以以相对高效的方式使用Open XML SDK,诀窍是使用OpenXmlWriter类(在this CodeProject article中有更多细节)
我曾经在生成91列x 164,000行文件时遇到内存问题。使用OpenXmlWriter,我将内存消耗从2GB降至120MB,这对我来说已经足够了 :-)
通过代码示例查看:
标准(未优化)方法:
// Table header
Row headerRow = new Row();
foreach (string fieldName in fields)
{
Cell cell = new Cell();
cell.DataType = CellValues.String;
cell.CellValue = new CellValue(fieldName);
headerRow.AppendChild(cell);
}
sheetData.AppendChild(headerRow);
// Table rows
while (dataReader.Read())
{
Row dataRow = new Row();
foreach (string fieldName in fields)
{
Cell cell = new Cell();
cell.DataType = CellValues.String;
cell.CellValue = new CellValue(reader[fieldName].ToString());
dataRow.AppendChild(cell);
}
sheetData.AppendChild(dataRow);
}
OpenXmlWriter的方法:
using (var writer = OpenXmlWriter.Create(worksheetPart))
{
writer.WriteStartElement(new Worksheet());
writer.WriteStartElement(new SheetData());
// Table header
writer.WriteStartElement(new Row());
foreach (string fieldName in fields)
{
writer.WriteStartElement(new Cell() { DataType = CellValues.String });
writer.WriteElement(new CellValue(fieldName));
writer.WriteEndElement();
}
writer.WriteEndElement(); //end of Row tag
// Table rows
while (dataReader.Read())
{
writer.WriteStartElement(new Row());
foreach (string fieldName in fields)
{
writer.WriteStartElement(new Cell() { DataType = CellValues.String });
writer.WriteElement(new CellValue(dataReader[fieldName].ToString()));
writer.WriteEndElement();
}
writer.WriteEndElement(); //end of Row tag
}
writer.WriteEndElement(); //end of SheetData
writer.WriteEndElement(); //end of worksheet
writer.Close();
}