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

时间:2015-06-30 23:02:16

标签: c# excel openxml openxml-sdk large-data

我正在使用这篇文章来阅读一个非常大的ex​​cel文件,使用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。

那位读者似乎非常有限。真的很感激一个建议,我的意思是什么!

1 个答案:

答案 0 :(得分:1)

OpenXmlReader将start和end元素视为独立项。可以通过选中IsStartElementIsEndElement属性来区分这些属性。

您的空白值取决于GetText返回空字符串的结束元素。

您有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);
    }
}