【发布时间】: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