【问题标题】:Get Tables (workparts) of a sheet of excel by OpenXML SDK通过 OpenXML SDK 获取一张 excel 的表格(工作部分)
【发布时间】:2013-01-22 07:37:36
【问题描述】:

我在一张 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 表格,但是如何在每张表格中获取工作部件,例如我的 3 个表格,我应该可以在这些表格上进行迭代,有人知道吗?有什么建议吗?

【问题讨论】:

  • @SiddharthRout 我实际上读过这篇文章,但我不想只迭代行和单元格,我需要迭代任何工作表的各个部分,就像我在工作表上有 3 个表并且需要迭代它们,意味着每个表必须是一个单独的对象。
  • 你看到他回答Using LINQ to Query Tables in Excel 2007的第二个链接了吗
  • @SiddharthRout 第二个链接描述了读取一个excel文件,其中两张表中有两张表,因此可以逐张分开,但正如我所说我需要一张两张表,没有任何解释关于它。

标签: c# excel c#-4.0 openxml openxml-sdk


【解决方案1】:

这有帮助吗?

// 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 下)。让你知道。

【讨论】:

  • 那么如何逐表获取单元格的值?有什么办法吗?
  • 就像我说的,单元格值不在 Table 中,而是在 SheetData 对象中。只需在 Stack Overflow 上搜索如何操作即可。这是一个开始:stackoverflow.com/questions/13161056/…
  • 假设从 Table 对象,您知道范围是 B2:D3。然后,您必须从 SheetData 遍历单元格 B2 到 D3 以获取单元格值。这可能很乏味。
【解决方案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 
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多