Исключение Excel HRESULT: 0x800A03EC из ChartArea.Copy()

Я работаю над приложением С#, которое взаимодействует с экземпляром 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;

person sisyphos    schedule 01.04.2015    source источник
comment
Это ERROR_INVALID_FLAGS, поэтому, скорее всего, ничего не добавляется к первому исключению. Поскольку в нем указаны размеры, я бы посоветовал посмотреть на значения свойств ChartArea, например. Height и Width, чтобы увидеть, что происходит в обоих случаях, и, возможно, попробуйте ChartArea.Select() перед .Copy()?   -  person Rup    schedule 01.04.2015


Ответы (2)


документация for Copy показывает, что существует разница между версиями 2003 и 2010.

2003:

void Copy(
    [In, Optional] object Before, 
    [In, Optional] object After
);

2010:

void Copy(
    Object Before,
    Object After
)

Как видите, аргументы были необязательными в 2003 году и обязательными в более поздней версии.

person Owen Ivory    schedule 02.10.2015

Диаграмма.Диаграмма.ОбластьДиаграммы.Вырезать(); вместо копирования вы можете использовать cut, это не даст никаких исключений

person Community    schedule 29.01.2018