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