我正在使用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;
答案 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它不会给出任何异常