【发布时间】:2014-08-11 17:46:43
【问题描述】:
编辑:
由于内存问题,我现在尝试使用:http://blogs.msdn.com/b/brian_jones/archive/2010/06/22/writing-large-excel-files-with-the-open-xml-sdk.aspx
但还是遇到了一些问题。
String strWham = strExtract + strExtract2012;
System.Data.SqlClient.SqlCommand objCmd = new System.Data.SqlClient.SqlCommand(strWham, objConn);
objCmd.CommandTimeout = 3000;
System.Data.SqlClient.SqlDataReader objReader;
objReader = objCmd.ExecuteReader();
string path = @"\\wsi\userdata\pterrazas\AccountingReports\ExpThrough201212.xlsx";
while (objReader.Read())
{
using (var myDoc = SpreadsheetDocument.Create(path, DocumentFormat.OpenXml.SpreadsheetDocumentType.Workbook))
{
WorkbookPart workbookPart = myDoc.WorkbookPart;
/* The next line causes the error:
** Error: Object Reference not set to an instance of an object**
*/
WorksheetPart worksheetPart = workbookPart.WorksheetParts.First();
string origninalSheetId = workbookPart.GetIdOfPart(worksheetPart);
WorksheetPart replacementPart = workbookPart.AddNewPart<WorksheetPart>();
string replacementPartId = workbookPart.GetIdOfPart(replacementPart);
OpenXmlReader reader = OpenXmlReader.Create(worksheetPart);
OpenXmlWriter writer = OpenXmlWriter.Create(replacementPart);
Row r = new Row();
Cell c = new Cell();
CellFormula f = new CellFormula();
f.CalculateCell = true;
f.Text = "RAND()";
c.Append(f);
CellValue v = new CellValue();
c.Append(v);
int numRows = 1;
int numCols = 1;
while (reader.Read())
{
if (reader.ElementType == typeof(SheetData))
{
if (reader.IsEndElement)
continue;
writer.WriteStartElement(new SheetData());
for (int row = 0; row < numRows; row++)
{
writer.WriteStartElement(r);
for (int col = 0; col < numCols; col++)
{
writer.WriteElement(c);
numCols++;
}
writer.WriteEndElement();
numRows++;
}
writer.WriteEndElement();
}
else
{
if (reader.IsStartElement)
{
writer.WriteStartElement(reader);
}
else if (reader.IsEndElement)
{
writer.WriteEndElement();
}
}
}
reader.Close();
writer.Close();
Sheet sheet = workbookPart.Workbook.Descendants<Sheet>().Where(s => s.Id.Value.Equals(origninalSheetId)).First();
sheet.Id.Value = replacementPartId;
workbookPart.DeletePart(worksheetPart);
}
}
objConn.Close();
}
catch (Exception ex)
无法将其正确配置为无异常运行!
感谢您的帮助!
【问题讨论】:
-
您是否尝试过逐行删除代码以查看是哪一行导致了问题?
-
根据性能报告,OpenXML 将所有这些数据存储在内存中,因为它通过(大量)并且我认为它正在最大化内存给定错误。
-
您需要使用您提供的链接中提到的类似 SAX 的方法。这将逐段写入 XML,而不必一次性将大部分文档存储在内存中。您从该链接中尝试了什么以及遇到了什么错误?
-
更新了使用 SAX-Like 方法时出现的问题。
标签: c# sql-server openxml sqldatareader