Как распечатать с помощью шаблона в Excel из C #? - PullRequest
0 голосов
/ 03 апреля 2019

Я печатаю счета из форм c # и извлекаю данные из 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) создание новой рабочей книги, а затем я извлекаю эту рабочую книгу и распечатываю ее.

нормально с одним счетом, но проблема в том,

Если вы хотите распечатать несколько счетов, то это создаст много рабочих книг, а затем мне нужно их всех получить и распечатать. это также приводит к большим потерям памяти и кажется неправильным решением.

как я могу распечатать несколько счетов из C #, используя шаблон из Excel?

1 Ответ

0 голосов
/ 03 апреля 2019

Ваш код является звуком.Если у вас возникают проблемы с «утечкой» экземпляров Excel, зависших после запуска кода, есть два возможных решения.

Решение для одного экземпляра

Сделать xlApp уровнем формысобственность, которой вы владеете на протяжении всего срока действия вашей формы.Затем повторно используйте this.xlApp через вызовы вашего кода.Тогда будет только один экземпляр Excel в течение всей жизни вашей формы.

Вам может потребоваться использовать флаги, блокировку или объединение в пул, чтобы сделать этот поток безопасным (если ваш код должен быть потокобезопасным).

Решение с несколькими экземплярами

Может возникнуть проблема двух потоков, конкурирующих за использование Book2.xlsx в качестве одного и того же рабочего файла и вызывающих конфликты.В этом случае вместо Book2.xlsx создайте уникальное временное имя файла (см. Здесь) .

Чтобы избавиться от случайных экземпляров Excel, , как описано здесь вам нужно будет запустить сборщик мусора (GC.Collect(); GC.WaitForPendingFinalizers();), когда ваш код вернется к вызывающей стороне.

Решение с несколькими экземплярами, вероятно, будет медленнее, чем решение с одним экземпляром, посколькупреимущество памяти, заключающееся в отсутствии случайных экземпляров Excel, будет сведено на нет из-за затрат на создание и разбор экземпляра Excel.Application (по крайней мере, с точки зрения процессора и дискового ввода-вывода).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...