阅读非常大的excel文件
本文关键字:excel 文件 非常 | 更新日期: 2023-09-27 18:00:37
我使用本文来读取一个非常大的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语句放在那里测试空格,然后我错过了最后一个值99999。
那个读者似乎太有限了。非常感谢你的建议,我是认真的!
OpenXmlReader
将开始和结束元素视为独立项。这些可以通过检查IsStartElement
和IsEndElement
属性来区分。
您的空值是由于GetText
返回空字符串的结束元素造成的。
你有两个选项来修复它。首先,你可以在循环中检查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);
}
}