【问题标题】:Excel exception HRESULT: 0x800A03EC from ChartArea.Copy()Excel 异常 HRESULT:来自 ChartArea.Copy() 的 0x800A03EC
【发布时间】:2015-04-01 16:51:38
【问题描述】:

我正在开发一个使用 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;

【问题讨论】:

  • 这是 ERROR_INVALID_FLAGS,因此可能不会在第一个异常中添加任何内容。由于它表示尺寸,我建议查看 ChartArea 属性的值,例如Height 和 Width 看看在这两种情况下发生了什么,作为一个远射,可以在 .Copy() 之前尝试 ChartArea.Select()?

标签: c# excel excel-interop


【解决方案1】:

Copy 的 documentation 表明 2003 版和 2010 版之间存在差异。

2003 年:

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

2010:

void Copy(
    Object Before,
    Object After
)

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

【讨论】:

    【解决方案2】:

    chart.Chart.ChartArea.Cut(); 您可以使用 cut 而不是复制,它不会给出任何异常

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-13
      • 2010-12-31
      • 1970-01-01
      • 2017-07-12
      • 2011-03-02
      相关资源
      最近更新 更多