我成功地用我的值替换了模板值,但是在我的过程中发生的是
这就是我尝试过的
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#打印多张账单?
答案 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而言)。