Excel Interop应用图表模板

时间:2014-01-02 13:11:41

标签: c# excel office-interop excel-interop

问题概述:

我正在为使用C#并具有“本机”excel支持(microsoft.office.interop.excel)和EPPlus库的客户自动生成报告(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 interop HRESULT: 0x800A03EC(在将ChartObjects [0]转换为ChartObject时)

2 - The message filter indicated that the application is busy. (Exception from HRESULT: 0x8001010A (RPC_E_SERVERCALL_RETRYLATER))

TL:DR:

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

修改

Pastebin代码:ExcelInteropProblem

1 个答案:

答案 0 :(得分:2)

VBA中的索引不是基于零的,所以当从.Net转到Excel Interop时,即使C#中的索引是,也从1开始,所以改变这个:

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

对此:

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