Я работаю над приложением С#, которое взаимодействует с экземпляром Excel, используя excel interop.dll v11.0. Я использую следующий код для копирования диаграммы из листа Excel в буфер обмена:
public Image ReadChart(Chart chartAccess) {
try {
Microsoft.Office.Interop.Excel.Worksheet sheet = workbook.Sheets[chartAccess.Sheet.Name];
Microsoft.Office.Interop.Excel.ChartObject chart = sheet.ChartObjects(chartAccess.Name);
chart.Chart.ChartArea.Copy(); // exception gets thrown here
return System.Windows.Forms.Clipboard.GetImage();
} catch (COMException) {
// display error dialog etc...
}
Это отлично работало с Excel 2007. Однако после перехода на Excel 2013 функция ChartArea.Copy() приводит к возникновению следующих исключений COMException:
Message: "Dimension not valid for chart type"
Stack Trace: System.RuntimeType.ForwardCallToInvokeMember(String memberName, BindingFlags flags, Object target, Int32[] aWrapperTypes, MessageData& msgData)
Microsoft.Office.Interop.Excel.ChartArea.Copy()
Message: "HRESULT: 0x800A03EC"
Stack Trace: System.RuntimeType.ForwardCallToInvokeMember(String memberName, BindingFlags flags, Object target, Int32[] aWrapperTypes, MessageData& msgData)
Microsoft.Office.Interop.Excel.ChartArea.Copy()
Это происходит только с листами excel старого формата .xls, файлы xlsm/xlsx работают нормально. Использование более новых версий interop.dll (v14.0 и v15.0) не помогло.
Любая помощь приветствуется!
РЕДАКТИРОВАТЬ:
Я решил проблему, используя следующий обходной путь:
// ...
chart.Chart.activate();
chart.Chart.Export(filename, "PNG", false);
using (Stream reader = File.OpenRead(filename)) {
image = Image.fromStream(stream);
}
return image;