复制 Excel 工作表的最有效方法?

Most effective way to duplicate an Excel worksheet?

我正在进行一个升级 WPF 程序的项目,该程序必须经常与 Excel sheet 一起使用。它使用 Closedxml 和 Excel 互操作来操作 Excel 文件和添加数据。

经过一些追踪,我发现了一个非常慢的函数。它使用与其他类似功能相同的方法,但其他一切都运行良好。问题是 Closedxml.copyto() 占用了 85% 的处理能力。

目的很简单,如果有新的记录需要打印,就取一个Excel sheet作为模板。它会将第一个 sheet 复制到新的 sheet 然后将数据写入其中。

如果您对如何加快此类过程有任何想法,请告诉我!

                    foreach (object[] row in rows)
                    {
                        if (Common.integer(row[0]) < from_no || Common.integer(row[0]) > to_no)
                        {
                            continue;
                        }
                        sheetNum++;
                        if (sheetNum != 1)
                        {

这部分使用了 85% 的工艺功率

                            sheet_edit.CopyTo(sheetNum.ToString());
                            sheet_edit = book.Worksheet(sheetNum);
                        }

                        sheet_edit.Name = row[0].ToString();

                        ct.ThrowIfCancellationRequested();
                        w.ReportProgress(progCnt * 100 / maxCnt);
                        progCnt++;}

非常感谢!

PS:抱歉我的英语不好!

PS:对于任何对我的问题投反对票的人,请告诉我原因?是没有帮助还是...其他原因?

PS: 我搜索了一整天,但找不到任何答案。方法倒是不少,但都不符合我的需要。

使用互操作:速度不是很快。

使用 openxml:这意味着我编写了更多代码并且不太容易集成到该程序

使用closedXML.copyRange:当然更快,但它不会复制列宽、行高……这意味着更多的代码、模式处理……所以不是更快。

我决定在循环中使用 dianogtics.process(print),第一个 sheet 将在每个循环中重复使用。它有点快,但我们无法选择打印机或打印机设置...将自动使用默认打印机和设置。

我可以向我的客户解释这一点,我认为这是可以接受的。 但是我还在等答案..我你碰巧知道如何加快这种过程,请告诉我!!

您可以使用 Excel Interop 来执行相同的操作,而不是使用 ClosedXml 来复制 sheet 。下面是复制作品的示例代码sheet

Excel.Application xlApp = Marshal.GetActiveObject("Excel.Application") as Excel.Application;
Excel.Workbook xlWb = xlApp.ActiveWorkbook as Excel.Workbook;
Excel.Worksheet xlSht = xlWb.Sheets[1];
xlSht.Copy(Type.Missing, xlWb.Sheets[xlWb.Sheets.Count]); 
xlWb.Sheets[xlWb.Sheets.Count].Name = "NEW SHEET";        

ClosedXML 必须将每个对象(单元格、样式、图片等)从源复制到目标。如果您有数千个单元格,那么这将消耗您的 CPU 个周期。

您应该确保您的源工作表只包含您真正需要的单元格和样式。根据我的经验,我见过许多 Excel 模板,这些模板在奇怪的工作表地址处包含许多未使用的样式和空单元格。

如果我是你,我会尽可能在 ClosedXML 中重新创建模板(即使只是一次性过程)。这将确保您的模板尽可能小。 ClosedXML 尚不支持所有功能,因此在创建模板后,您可能需要添加元素(例如图表)。然后在您的进一步处理中使用该保存的模板。它应该比您现在使用的更小更快(我的猜测)。

您可以尝试的其他选项:.xlsx 文件只是一个 .zip 包。您可以查看文件中的底层 XML 并确定要复制多少个单元格或样式。

您还可以下载 ClosedXML 源代码并缩小到底是哪种元素占用了资源。

免责声明:我是一个封闭的XML项目维护者。