如何将模板工作表从Excel文件复制到活动工作簿

时间:2019-03-26 12:09:08

标签: c# excel vsto office-interop

我正在为VSTO写VSTO。我有以下问题: 所有这些都将在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 :(得分:-1)

该代码仅运行一次的原因似乎是因为它实例化的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();