读取非常大的ex​​cel文件

我正在使用这篇文章来读取一个非常大的Excel文件,使用SAX方法。

https://msdn.microsoft.com/en-us/library/office/gg575571.aspx

由于客户端计算机内存不足,无法将值存储在DataTable或内存中。 尝试阅读并立即将商店价值读取到数据库中:

// The SAX approach. static void ReadExcelFileSAX(string fileName) { using (SpreadsheetDocument spreadsheetDocument = SpreadsheetDocument.Open(fileName, false)) { 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 + " "); } } Console.WriteLine(); Console.ReadKey(); } } 

例如,当我读这个excel文件:

 Test 1 22 345345 345345435 2333 333333 4444 4444444 324324 99999 

我得到这个输出:

 Blank 22 Blank 345345 Blank etc 

我不知道这些空白是从哪里来的。 试图把if语句放在那里testing空白,然后我错过了最后一个值99999。

那个读者似乎如此有限。 真的很感激一个build议,我的意思是任何东西!

OpenXmlReader将开始和结束元素视为独立项目。 这些可以通过检查IsStartElementIsEndElement属性来区分。

您的空白值是由GetText返回空string的末尾元素引起的。

你有2个选项来解决它。 首先你可以在循环中检查IsStartElement

 while (reader.Read()) { if (reader.ElementType == typeof(CellValue) && reader.IsStartElement) { text = reader.GetText(); Console.WriteLine(text + " "); } } 

或者,您可以使用LoadCurrentElement方法来加载整个元素,同时消耗您之前获得的开始和结束:

 while (reader.Read()) { if (reader.ElementType == typeof(CellValue)) { CellValue cellVal = (CellValue)reader.LoadCurrentElement(); Console.WriteLine(cellVal.Text); } }