来自ChartArea.Copy()的Excel异常HRESULT:0x800A03EC

时间:2015-04-01 16:51:38

标签: c# excel excel-interop

我正在使用excel interop.dll v11.0与Excel实例交互的C#应用​​程序。 我正在使用以下代码将图表从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()会导致抛出以下COMExceptions:

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()

这只发生在旧的.xls格式的Excel工作表中,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;

2 个答案:

答案 0 :(得分:1)

复制的documentation表示版本2003和2010之间存在差异。

2003:

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

2010:

void Copy(
    Object Before,
    Object After
)

如您所见,参数在2003年是可选的,在后续版本中是强制性的。

答案 1 :(得分:0)

chart.Chart.ChartArea.Cut(); 而不是副本你可以使用cut它不会给出任何异常