【问题标题】:How to copy templated sheet from excel file to active workbook如何将模板表从excel文件复制到活动工作簿
【发布时间】:2019-03-28 23:10:03
【问题描述】:

我正在为 Excel 编写 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 实例中打开一个新工作表,并且该工作表应该是模板的精确克隆

【问题讨论】:

    标签: c# excel vsto office-interop


    【解决方案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();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多