【问题标题】:Most effective way to duplicate an Excel worksheet?复制 Excel 工作表的最有效方法?
【发布时间】:2019-11-15 00:31:07
【问题描述】:

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

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

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

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

                    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:当然更快,但它不会复制列宽、行高……这意味着更多的代码、模式进程……所以不是更快。

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

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

【问题讨论】:

  • 您的意思是在同一个工作簿中复制工作表吗?或者您是否在复制工作簿本身,即文件?
  • 如果您使用 ClosedXML,为什么还要使用 interop?这就是让你慢下来的原因
  • The problem is Closedxml.copyto() eats up 85% of processing power. 仅当您在单核机器上工作时。此外,单线程操作在活动时会使用 100% 的 CPU,除非有东西中断它,例如 IO、Thread.Sleep() 等。
  • 在一个案例中,发布您的代码。没有代码本身就不可能帮助解决代码问题。代码也比好英语好得多
  • 嗨 JohnWu,我想在同一个工作簿中复制工作表,但它太慢了,我想让这个过程更快。

标签: c# wpf closedxml


【解决方案1】:

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

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

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

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

您还可以下载 ClosedXML 源并准确确定占用资源的元素类型。

免责声明:我是 ClosedXML 项目的维护者。

【讨论】:

  • 谢谢,这正是我需要的!我正在使用的这个文件并没有那么复杂,但它分布在数以千计的单元格上……我从来没有注意到这一点,因为它看起来很简单,而且我不是设计它的人……我不是互操作粉丝,而且我真的很喜欢使用 closeXML。先生,您一直在制作出色的产品!干杯!
【解决方案2】:

您可以使用 Excel Interop 来复制工作表,而不是使用 ClosedXml 来复制。下面是复制工作表的示例代码

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";        

【讨论】:

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