【问题标题】:how to print using template in excel from c#?如何在 c# 中使用 excel 中的模板进行打印?
【发布时间】:2019-04-03 14:44:09
【问题描述】:

我正在从 c# windows 窗体打印发票,从 MySql 获取数据。我想使用在 excel 中设计的模板。我想用原始值替换模板中的值,并使用该模板打印多张账单或多份账单副本。

我成功地用我的值替换了模板值,但我的过程中发生的事情是

这是我尝试过的

xlWorkBook = xlApp.Workbooks.Open(@"C:\\Book1");
xlWorkSheet = xlWorkBook.Worksheets.get_Item(1);
ReplaceValuesInTemplate(xlWorkSheet);
xlWorkBook.SaveAs("C:\\Book2"); //saving as new excel WorkBook-Book2
xlWorkBook = xlApp.Workbooks.Open(@"C:\\Book2"); //Fetching Book2
xlWorkSheet = xlWorkBook.Worksheets[1]; 
xlWorkSheet.PrintOut(From:1,To:1, Copies:2,Preview: false); //printing
xlApp.Quit();

1) 我从 c# 打开模板并将值替换为原始值 2)它创建一个新的工作簿,然后我获取该工作簿并打印它。

单张账单没问题,但问题是,

如果要打印多张账单,它将创建许多工作簿,而我需要将它们全部取出并打印。这也会造成大量内存浪费,而且似乎不是一个合适的解决方案。

如何使用 excel 中的模板从 c# 打印多个账单?

【问题讨论】:

    标签: c# excel


    【解决方案1】:

    您的代码是正确的。如果您在代码运行后遇到“泄漏”的 Excel 实例问题,有两种可能的解决方案。

    单实例解决方案

    xlApp 设为表单级属性,您在表单的整个生命周期内都持有该属性。然后在对代码的调用中重用this.xlApp。那么在您的表单的整个生命周期内将只有一个 Excel 实例。

    您可能需要使用标志、锁定或池来确保该线程安全(如果您的代码需要线程安全)。

    多实例解决方案

    您可能会遇到两个线程竞争使用Book2.xlsx 作为同一个工作文件并导致冲突的问题。在这种情况下,代替Book2.xlsx,生成一个唯一的临时文件名(see here)

    要摆脱杂散的 Excel 实例 as explained here,您需要在代码返回调用方时运行垃圾收集器 (GC.Collect(); GC.WaitForPendingFinalizers();)。

    多实例解决方案可能会比单实例解决方案慢,因为不保留 Excel 的杂散实例所带来的内存优势将被创建和拆除的成本所抵消 Excel.Application 实例(至少在 CPU 和磁盘 I/O 方面)。

    【讨论】:

    • 感谢您的回复。代码没有泄漏问题。我已经通过垃圾收集器照顾了。我想要打印多张账单的简单而真实的解决方案。
    • 我已经测试了您的代码并且它正在运行。您在为每张账单重复使用同一个文件时遇到不同的问题吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-01-22
    • 1970-01-01
    • 2010-11-30
    • 2021-10-07
    • 2010-10-30
    • 2014-03-07
    • 1970-01-01
    相关资源
    最近更新 更多