使用OpenXML SDK获取Excel工作表的表格(工作部件)

3

我在 Excel 文件的一个表中有 3 个表格,我使用 OpenXML SDK 读取 Excel 文件,如下所示:

SpreadSheetDocument document = SpreadSheetDDocument.open(/*read it*/);
foreach(Sheet sheet in document.WorkbookPart.Workbook.Sheets)
{
   //I need each table or work part of sheet here
}

如您所见,我可以获取Excel中的每个工作表,但是如何获取每个工作表中的工作部件,例如我的三个表格,我应该可以在这些表格上进行迭代,请问有人知道如何实现吗?有什么建议吗?


https://dev59.com/RXE85IYBdhLWcg3wwWat - Siddharth Rout
@SiddharthRout 我确实阅读了这篇文章,但我不想仅迭代行和单元格,我需要迭代任何工作表的部分,比如我在一个工作表上有3个表,需要对它们进行迭代,也就是说每个表必须是一个单独的对象。 - Saeid
你看到答案中的第二个链接“使用LINQ查询Excel 2007表”了吗? - Siddharth Rout
@SiddharthRout 第二个链接描述了如何读取一个包含两个表格的Excel文件,这两个表格分别位于两个工作表中,因此可以通过工作表进行分离。但正如我所说,我需要将这两个表格放在同一个工作表中,关于这一点没有任何解释。 - Saeid
2个回答

8
这有帮助吗?
// true for editable
using (SpreadsheetDocument xl = SpreadsheetDocument.Open("yourfile.xlsx", true))
{
    foreach (WorksheetPart wsp in xl.WorkbookPart.WorksheetParts)
    {
        foreach (TableDefinitionPart tdp in wsp.TableDefinitionParts)
        {
            // for example
            // tdp.Table.AutoFilter = new AutoFilter() { Reference = "B2:D3" };
        }
    }
}

请注意,实际单元格数据不在Table对象中,而在SheetData中(位于WorksheetPart的Worksheet下)。这只是让你知道。


那么我如何逐个表格获取单元格的值?有什么方法吗? - Saeid
1
就像我说的那样,单元格的值不在表格中,而是在SheetData对象中。只需在Stack Overflow上搜索如何操作即可。这是一个起点:http://stackoverflow.com/questions/13161056/reading-data-from-excel-cells-using-openxml-sdk-2-0 - Vincent Tan
2
假设你知道表对象的范围是B2:D3。 然后,你将不得不遍历SheetData中的B2到D3单元格以获取单元格值。 这可能很繁琐。 - Vincent Tan

2
您可以从Excel中获取特定的表格。在@Vincent的回答中添加更多内容。
using (SpreadsheetDocument document= SpreadsheetDocument.Open("yourfile.xlsx", true))
{
    var workbookPart = document.WorkbookPart;
    var relationsShipId = workbookPart.Workbook.Descendants<Sheet>()
                    .FirstOrDefault(s => s.Name.Value.Trim().ToUpper() == "your sheetName")?.Id;

    var worksheetPart = (WorksheetPart)workbookPart.GetPartById(relationsShipId);

    TableDefinitionPart tableDefinitionPart = worksheetPart.TableDefinitionParts
                                                                       .FirstOrDefault(r =>
                                                                         r.Table.Name.Value.ToUpper() =="your Table Name");

    QueryTablePart queryTablePart = tableDefinitionPart.QueryTableParts.FirstOrDefault();

    Table excelTable = tableDefinitionPart.Table;

    var newCellRange = excelTable.Reference;
    var startCell = newCellRange.Value.Split(':')[0]; // you can have your own logic to find out row and column with this values
    var endCell = newCellRange.Value.Split(':')[1];// Then you can use them to extract values using regular open xml 
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接