问题概述:
我正在为使用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
答案 0 :(得分:2)
VBA中的索引不是基于零的,所以当从.Net转到Excel Interop时,即使C#中的索引是,也从1开始,所以改变这个:
ChartObject chart = ((ChartObject)charts.Item (0));
对此:
ChartObject chart = ((ChartObject)charts.Item (1));