【问题标题】:Populate table with OpenXml使用 OpenXml 填充表
【发布时间】:2021-07-21 19:05:16
【问题描述】:

我想创建一个 Excel 模板文件,然后打开它并使用 OpenXml 代码中的数据填充它。

是否可以在 Excel 中创建表格,然后从代码中按名称填充该表格?

我希望能够按名称引用表。理想情况下,这将允许我插入行,并且表格会变得更高以容纳这些行。并且任何表格页眉或页脚都将保持不变。

我是使用 OpenXML 的新手。如果这是可能的,有人可以指点我一些关于如何做到这一点的文档吗?

【问题讨论】:

标签: c# excel openxml


【解决方案1】:

是的,这可以通过 OpenXml 实现。基本上,如果表格已经存在,您只需要写入所需的数据,找到表格,然后更新表格的Reference 属性以反映表格现在覆盖的单元格。

Table 存在于 TableDefinitionPart 中,可以从 Worksheetpart 中找到。这听起来很复杂,但找到正确的表也不错。

假设您在 A 列中有一个表格,除了标题之外没有其他数据,并且在现有的 Excel 文件中命名为 MyTable

下面会往表中添加一些数据:

using (SpreadsheetDocument spreadsheetDocument = SpreadsheetDocument.Open(filename, true))
{
    WorkbookPart workbookPart = spreadsheetDocument.WorkbookPart;
    Sheet sheet = workbookPart.Workbook.Descendants<Sheet>().Where(s => s.Name == "Sheet1").First();
    WorksheetPart worksheetPart = workbookPart.GetPartById(sheet.Id) as WorksheetPart;
    SheetData sheetData = worksheetPart.Worksheet.Elements<SheetData>().First();

    //write some new data
    for (int i = 1; i < 11; i++)
    {
        //rowIndex takes into account the header (i.e. we're filling A2-A11)
        uint rowIndex = (uint)i + 1;
        Row row = new Row() { RowIndex = rowIndex };
        Cell cell = new Cell() { CellReference = $"A{rowIndex}", CellValue = new CellValue(i), DataType = CellValues.Number };
        row.Append(cell);

        sheetData.Append(row);
    }
    //find the table
    Table table = worksheetPart.TableDefinitionParts.FirstOrDefault(t => t.Table.Name == "MyTable")?.Table;
    //update the reference of the table (11 is 10 data rows and 1 header)
    table.Reference = "A1:A11";
}

给出这样的结果:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-28
    • 2022-01-20
    相关资源
    最近更新 更多