2014-01-02 7 views
2

Проблема Обзор:Excel Interop Нанести Chart Template

Я автоматизации генерации отчетов (Excel) для клиента с помощью C# с "родной" первенствовать поддержки (Microsoft.Office.Interop.Excel) и EPPlus библиотеку ,

Мой клиент не очень гибкий в отношении дизайна диаграмм, поэтому мои диаграммы должны иметь тот же стиль, что и у них.

Нет проблем, я экспортировали шаблоны диаграмм с помощью 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#?

EDIT:

Pastebin код: ExcelInteropProblem

ответ

2

Индексы в VBA не с нуля, поэтому при переходе от .Net к Excel Interop, вы начинаете в 1, даже если индексы в C# являются, так это изменить:

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

Для этого:

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

Я попытался изменить вместо одного, и проблема преобразования решена, но у меня все еще возникают проблемы при вызове приложения excel, например, в 90% случаев. Я убил все excel.exe, обработанные перед вызовом interop com для приложения excel, но он по-прежнему бросает мне исключение, как указано выше: RPC_E_SERVERCALL_RETRYLATER –

+0

Странно, я сделал много вещей в interop и никогда не видел эту ошибку. вы нанизаны вообще? – JMK

+0

Вызов этого метода выполняется в поток STA, вызываемый из основного потока. После запуска потока STA основной поток ждет, пока он не закончится (на основе возврата метода я решаю, следует ли повторять попытку или нет). Та же проблема возникает, когда метод вызывается внутри основного потока, кстати –