C# Excel互操作应用图表模板

C# Excel互操作应用图表模板,c#,excel,office-interop,excel-interop,C#,Excel,Office Interop,Excel Interop,问题概述: 我正在使用C#和“本机”excel支持(microsoft.office.interop.excel)以及库为客户自动生成报告(excel) 我的客户在图表设计方面不是很灵活,所以我的图表必须与他们的完全相同 没问题,我使用Excel 2010导出了他们的图表模板 什么不起作用: 我无法通过代码应用任何图表模板 我尝试过的: 1-EPPlus:不支持将模板加载到图表 2-InteropExcel:应用模板时失败,引发异常,以下是我的代码: Application ex

问题概述:

我正在使用C#和“本机”excel支持(microsoft.office.interop.excel)以及库为客户自动生成报告(excel)

我的客户在图表设计方面不是很灵活,所以我的图表必须与他们的完全相同

没问题,我使用Excel 2010导出了他们的图表模板

什么不起作用:

我无法通过代码应用任何图表模板

我尝试过的:

1-EPPlus:不支持将模板加载到图表

2-InteropExcel:应用模板时失败,引发异常,以下是我的代码:

        Application excelApp = null;
        Workbook    workbook = null;
        Microsoft.Office.Interop.Excel.Worksheet worksheet = null;

        try
        {
            excelApp  = new Microsoft.Office.Interop.Excel.Application();
            workbook  = excelApp.Workbooks.Open(config.DiretorioRelatorio);
            worksheet = workbook.Sheets[Consts.RECOVERED_SHEET];

            string template = config["templatePath"]; // .crtx file

            ChartObjects charts = worksheet.ChartObjects ();
            ChartObject chart   = ((ChartObject)charts.Item (0));
            chart.Chart.ApplyChartTemplate(template);

        }
        catch (Exception ex)
        {
            Console.WriteLine (ex.Message);
        }
        finally
        {
            workbook.Save ();
            workbook.Close ();
            excelApp.Quit ();

            ReleaseObject (worksheet);
            ReleaseObject (workbook);
            ReleaseObject (excelApp);
        }
此代码会引发:

1-
excel互操作HRESULT:0x800A03EC
(将ChartObjects[0]强制转换为ChartObject时)

2-
消息筛选器指示应用程序正忙。(来自HRESULT的异常:0x8001010A(RPC_E_SERVERCALL_RETRYLATER))

TL:DR:

如何使用C#将文件中的图表模板应用于电子表格中的现有图表

编辑:


Pastebin代码:

VBA中的索引不是以零为基础的,因此当从.Net转到Excel Interop时,即使C#中的索引是以1为起点,也要以1为起点,所以请更改以下内容:

ChartObject chart   = ((ChartObject)charts.Item (0));
为此:

ChartObject chart   = ((ChartObject)charts.Item (1));

我试着换了一个,转换问题解决了,但我在调用excel应用程序时仍然有问题,比如90%的时候。在调用excel应用程序的interop com之前,我杀死了所有已处理的excel.exe,但它仍然引发了一个异常,如上所述:RPC_E_SERVERCALL_retrylater这很奇怪,我做了很多interop的工作,但从未看到过这个错误,你是否在线程化?对该方法的调用是在STA线程中完成的,从主线程调用。在启动STA线程之后,主线程将等待它结束(根据方法的返回,我决定是否重试)。当在主线程内调用方法时,同样的问题也会发生,方法的方式是:代码示例中是否遗漏了代码?您是在一个位置声明应用程序对象,然后在另一个位置使用它(可能会将它传递到此方法中),还是在使用它之前声明它?使用pastebin代码编辑的问题可能会帮助您了解我在做什么以及我是如何做的