Bri*_*nga 5 c# asp.net excel out-of-memory
我需要从 ASP.NET MVC 站点生成一个非常大的 Excel 文件,但在使用 Open XML SDK 时遇到了内存限制。有没有一种内存有效的方法来生成这样的文件?
作为参考,我尝试生成一个包含大约 500,000 行、每行 20 列的电子表格。数据集本身很好地适合内存,但 Open XML SDK 很快就耗尽了我所有的可用内存。
您可以以相当有效的方式使用 Open XML SDK,诀窍是使用OpenXmlWriter类(在这篇 CodeProject 文章中您有更多详细信息)
我在生成 91 列 x 164,000 行的文件时遇到内存问题。使用 OpenXmlWriter,我的 RAM 消耗从 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);
}
Run Code Online (Sandbox Code Playgroud)
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();
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5116 次 |
| 最近记录: |