C# OpenXML无助于读取与文档相反的大型Excel文件

C# OpenXML无助于读取与文档相反的大型Excel文件,c#,excel,openxml,C#,Excel,Openxml,报告说: The following code segment is used to read a very large Excel file using the DOM approach. 然后是一个例子。我使用它来实现读取700K行的相对较大的文件。我现在有这个代码: using (SpreadsheetDocument spreadsheetDocument = SpreadsheetDocument.Open(path, false)) { WorkbookPart wor

报告说:

The following code segment is used to read a very large Excel 
file using the DOM approach.
然后是一个例子。我使用它来实现读取700K行的相对较大的文件。我现在有这个代码:

using (SpreadsheetDocument spreadsheetDocument = SpreadsheetDocument.Open(path, false)) 
{
    WorkbookPart workbookPart = spreadsheetDocument.WorkbookPart;
    WorksheetPart worksheetPart = workbookPart.WorksheetParts.First();
    SheetData sheetData = worksheetPart.Worksheet.Elements<SheetData>().First();
    // no other code
}
给我的计数变量超过一百万行。然而,我在第一张纸上有14K,在第二张纸上有700K。这很奇怪。所以,我的额外问题是如何使用SAX方法仅解析包含数据的行。还有在OpenXML上读取大型Excel文件的最后一个谜团。其中一个家伙说:由于某种原因,工作表被向后枚举,所以我的三张表中的第一张实际上是索引3。所以,我最后一个额外的问题是如何得到你想要的床单。此时,我使用以下代码:

WorkbookPart workbookPart = spreadsheetDocument.WorkbookPart;
WorksheetPart worksheetPart =     workbookPart.WorksheetParts.First();

但是考虑到他们所说的,我不确定在我的情况下,我是否会得到第一份工作表

你似乎有几个问题,我会试着逐一解决

所以,我需要知道OpenXML是否真的有助于读取大型文件。如果没有,Interop没有帮助的替代方案是什么?我已经检查过了

是的,OpenXMLSDK非常适合读取大型文件,但是您可能需要使用SAX方法而不是DOM方法。从您引用的相同文档中:

但是,DOM方法需要将整个打开的XML部分加载到内存中,这可能会导致在处理非常大的文件时出现内存不足异常。。。。当需要处理非常大的文件时,考虑使用SAX。< /P> DOM方法将整个工作表加载到内存中,对于大型工作表,这可能导致内存不足异常。使用SAX方法,您可以依次读取每个元素,这大大减少了内存消耗

所以,我的额外问题是如何使用SAX方法仅解析包含数据的行

使用SDK只能获取包含数据的行,或者至少是XML中存在的行。您似乎将此问题作为一个单独的问题提出,我已经详细地回答了这个问题,但实际上您看到的是每个行元素的开始和结束都使用了问题中的代码。有关更多详细信息,请参见我对您问题的回答

所以,我最后一个额外的问题是如何得到你想要的床单

您需要按名称查找工作表,它是工作簿的后代。一旦您有了它,您就可以使用它的Id来获取工作表部件:


你似乎有几个问题,我会一个接一个地解决

所以,我需要知道OpenXML是否真的有助于读取大型文件。如果没有,Interop没有帮助的替代方案是什么?我已经检查过了

是的,OpenXMLSDK非常适合读取大型文件,但是您可能需要使用SAX方法而不是DOM方法。从您引用的相同文档中:

但是,DOM方法需要将整个打开的XML部分加载到内存中,这可能会导致在处理非常大的文件时出现内存不足异常。。。。当需要处理非常大的文件时,考虑使用SAX。< /P> DOM方法将整个工作表加载到内存中,对于大型工作表,这可能导致内存不足异常。使用SAX方法,您可以依次读取每个元素,这大大减少了内存消耗

所以,我的额外问题是如何使用SAX方法仅解析包含数据的行

使用SDK只能获取包含数据的行,或者至少是XML中存在的行。您似乎将此问题作为一个单独的问题提出,我已经详细地回答了这个问题,但实际上您看到的是每个行元素的开始和结束都使用了问题中的代码。有关更多详细信息,请参见我对您问题的回答

所以,我最后一个额外的问题是如何得到你想要的床单

您需要按名称查找工作表,它是工作簿的后代。一旦您有了它,您就可以使用它的Id来获取工作表部件:

OpenXmlReader reader = OpenXmlReader.Create(worksheetPart);
while (reader.Read())
{
    if (reader.ElementType == typeof(Row))
    {
        count++;
    }                                
}
WorkbookPart workbookPart = spreadsheetDocument.WorkbookPart;
WorksheetPart worksheetPart =     workbookPart.WorksheetParts.First();
using (SpreadsheetDocument spreadsheetDocument = SpreadsheetDocument.Open(filename, false))
{
    WorkbookPart workbookPart = spreadsheetDocument.WorkbookPart;

    Sheet sheet = workbookPart.Workbook.Descendants<Sheet>().Where(s => s.Name == sheetName).First();
    if (sheet != null)
    {
        WorksheetPart worksheetPart = workbookPart.GetPartById(sheet.Id) as WorksheetPart;

        //read worksheetPart...
    }
}