如何使用C#在Excel中使用模板进行打印?

时间:2019-04-03 14:44:10

标签: c# excel

我正在从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#打印多张账单?

1 个答案:

答案 0 :(得分:0)

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

单实例解决方案

xlApp设置一个表单级属性,该属性将在表单的整个生命周期中保留。然后在对代码的调用之间重用this.xlApp。这样一来,在表单的整个生命周期中将只有一个Excel实例挂起。

您可能需要借助标志,锁定或缓冲池来确保此线程安全(如果您的代码需要是线程安全的)。

多实例解决方案

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

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

多实例解决方案可能会比单实例解决方案慢,因为创建和拆除 Excel.Application 实例(至少就CPU和磁盘I / O而言)。