Как скопировать шаблонный лист из файла Excel в активную книгу - PullRequest
0 голосов
/ 26 марта 2019

Я пишу VSTO для Excel.У меня следующая проблема: Все это происходит в приложении Excel

Мне нужно программно добавить новый лист, который должен выглядеть так же, как шаблон.У меня есть шаблон, из которого я могу скопировать ячейки и форматирование в новую добавленную ячейку.

Как я могу это сделать?

Я пробовал следующий способ, чтобы открыть приложение Excelсделать его невидимым для пользователя и открыть необходимый шаблон в этом приложении.Я просматриваю строки использованного диапазона и пытаюсь скопировать строку за строкой.Тем не менее, я сталкиваюсь с проблемами при открытии шаблона.Как только он открывается, в другой раз он генерирует исключение COM (не знаю, что это).

var activeExcel = (Workbook)Globals.ThisAddIn.Application.ActiveWorkbook;
            Sheet = (Worksheet) activeExcel.Worksheets.Add();
            Sheet.Name = "Счёт-фактура";

            var sourcePath = LocationHelperTool.GetTemplatePathByName("SystemInvoice.xlsx");
            try
            {
                var excelApp = new Application() { Visible = false };
                var workbook = excelApp.Workbooks.Open(sourcePath);
                var workSheets = workbook.Worksheets;
                const string sourceSheetName = "Счёт-фактура";
                var sourceSheet = (Worksheet)workSheets.Item[sourceSheetName];

                var sourceRange = sourceSheet.UsedRange;

                for (var i = 1; i <= sourceRange.Rows.Count; i++)
                {
                    var soRange = sourceRange.Rows[i];
                    var deRange = Sheet.Rows[i];
                    soRange.Copy(Type.Missing);
                    deRange.pasteSpecial(XlPasteType.xlPasteFormats);
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }
            finally
            {
                Clipboard.Clear();
                excelApp.Quit();
            }

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

1 Ответ

0 голосов
/ 28 марта 2019

Причина, по которой код запускается только один раз, заключается в том, что COM-объекты, которые он создает, не освобождаются - поэтому они не могут быть повторно использованы:

   var excelApp = new Application() { Visible = false };
   var workbook = excelApp.Workbooks.Open(sourcePath);
   var workSheets = workbook.Worksheets;
   const string sourceSheetName = "Счёт-фактура";
   var sourceSheet = (Worksheet)workSheets.Item[sourceSheetName];

В процессе очистки для этогоВ разделе кода вам нужно что-то вроде этих строк, где объекты высвобождаются в обратном порядке, в котором они были созданы (когда последнее зависит от более раннего).Затем освобожденные объекты необходимо собрать для сбора мусора, чтобы код больше не «видел» их.

sourceRange = null;
soRange = null;
deRange = null;
workbook.Close(false); //do not save changes
sourceSheet = null;
workSheets = null;
workbook = null;
excelApp.Quit();
excelApp = null;

GC.Collect();
GC.AwaitPendingFinalizers();
GC.Collect();
GC.AwaitPendingFinalizers();
...