使用OpenXML,Microsoft建议使用SAX方法:
https://msdn.microsoft.com/en-us/library/office/gg575571.aspx
因此,不是将整个文档DOM加载到内存中,而是可以使用OpenXmlReader
以串行方式读取文件。例如:
WorkbookPart workbookPart = spreadsheetDocument.WorkbookPart;
WorksheetPart worksheetPart = workbookPart.WorksheetParts.First();
OpenXmlReader reader = OpenXmlReader.Create(worksheetPart);
string text;
while (reader.Read())
{
if (reader.ElementType == typeof(CellValue))
{
text = reader.GetText();
Console.Write(text + " ");
}
}
但是如果您的单元格具有SharedString
数据类型,那么这种情况就会失败。这些是与共享字符串表中的工作表数据分开存储的,据我所知,没有真正的方法可以避免必须加载整个共享字符串表。例如,我可以这样做:
var sharedStrings = wbPart.SharedStringTablePart.SharedStringTable.Cast<SharedStringItem>()
.Select(i => i.Text.Text).ToArray();
然后我可以做类似的事情:
var row = reader.LoadCurrentElement() as Row;
var cells = row.Descendants<Cell>();
var cellValues = cells.Select(c => c.DataType != null
&& c.DataType == CellValues.SharedString ?
sharedStrings[int.Parse(c.CellValue.Text)] : c.CellValue.Text).ToArray();
哪个有效,但是我必须加载整个共享字符串表,如果该文件有很多唯一字符串,这可能会非常大。是否有更有效的方法来处理查找共享字符串作为文件的每一行的过程?