【问题标题】:ClosedXML Insert data from List into existing proper Excel Table (named range) c#ClosedXML 将列表中的数据插入现有的正确 Excel 表(命名范围)c#
【发布时间】:2018-06-04 16:59:12
【问题描述】:

有一个类似的问题,似乎没有答案(也许没有答案)。如何从 Closed XML 中“更新”现有的 Excel 表(命名范围)。我知道如何获取表格信息,并删除现有数据(见下文)

    var ws = wb.Worksheet(sheetName);
    var table = ws.Table("data");
    table.Clear();

那么??我有一个名为“listdata”的列表,它与表头完全匹配......

我是否需要像这样一次遍历一个表(这似乎是一种浪费):

foreach (var item in listdata){table.InsertRowsBelow(1); ws.Cells(2,1).InsertData(item)}

我想如果你做这样的事情可能会更简单:

table.InsertRowsBelow(listdata.Count()); ws.Cells(2,1).InsertData(listdata);

或者有没有办法批量加载到“表”中(类似于 .AddRange(listdata) 或 .Union(listdata))。目前,我只是删除整个工作表,然后重新创建工作表并粘贴新表:

      wb.Worksheets.Delete(sheetName);
      var ws = wb.Worksheets.Add(sheetName);
      ws.Cell(1, 1).InsertTable(listdata, "data", true);

【问题讨论】:

    标签: c# excel closedxml


    【解决方案1】:

    据我所知,您在回答中讨论的方法是最简单的一种,即

    • 获取对表的引用
    • 删除其数据
    • 插入您的列表。

    InsertData 充当批量插入,它将采用任何 IEnumerable 集合并将整个集合输出到 Excel 电子表格中,从所选单元格开始。

    因此,例如,您可以这样做以从列表中填充表格(其中工作表的第一行是表格的标题行):

    private void PopulateTable(XLWorkbook wb, string workSheetName, string tableName, IEnumerable list)
    {
        var ws = wb.Worksheet(workSheetName);
        var table = ws.Table(tableName);
    
        ws.Cell(2, 1).InsertData(list);
    }
    

    Cell 也有一个InsertTable 函数,它会插入一个DataTable 而不是IEnumerable

    【讨论】:

      【解决方案2】:

      https://github.com/ClosedXML/ClosedXML/pull/932 中对IXLTable 进行了一些补充。您可能对IXLTable.ReplaceData(data)IXLTable.AppendData(data) 感兴趣。

      【讨论】:

      • 您好 Francois,我注意到 ReplaceData 与 InsertData 相比非常慢。我在 6 秒内插入 60k 个项目集合,而 ReplaceData 需要 12.5 分钟! (有或没有传播 arg)。我试图清除内容或行,然后 AppendData 但我总是得到错误。有更快的选择吗?谢谢!
      • (60k 行,9 列)
      • @kevinob 在 github repo 上记录一个问题并完整地完成问题模板,包括最小的可重现测试用例,我会研究它。
      猜你喜欢
      • 2016-08-15
      • 1970-01-01
      • 2019-06-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-26
      • 1970-01-01
      相关资源
      最近更新 更多