我正在写一个C#应用程序 .
其中一项任务是打开Excel电子表格并将图表表格粘贴到C#应用程序中 . 请注意我指的是一个CHART SHEET ...而不是普通工作表中嵌入的图表对象 .
我有理由想在这里做到准确 .
我使用普通的COM从C#到Excel进行通信......
using using Microsoft.Office.Interop.Excel;
在普通工作表中嵌入图表的情况下,API可以正常工作 . 我从工作簿中检索工作表,从工作表中获取chartObject并在chartObject上发布副本按预期工作,即剪贴板的内容就像从Excel本身启动了副本一样 .
处理图表时情况有所不同 . 我从工作簿中获取了Charts,然后获得了我感兴趣的Chart实例 . 一切都很好 . 但是,在此处对图表发出Copy()不会导致剪贴板看起来像是从Excel启动操作 . CopyPicture也没有帮助,因为pic真的被炸成了不成比例而剪贴板缺少通常的PNG,GIFF,JPEG格式 - Clipboard.getImage()返回null,而doI看到图像在剪贴板中 . Copy()仅在剪贴板上创建预览,数据对象和OLE私有数据格式而不是更多...
//this does not work - it is for chart sheets
Excel.Charts charts = wb.Charts;
Excel.Chart chart = charts["mychartname"];
chart.Copy(); or chart.CopyPicture(); <-- these do not work as expected...
// this works fine but only covers embedded charts
Excel.ChartObjects charts = ws.ChartObjects;
Excel.ChartObject chart = charts["mychartname"];
chart.Copy();
为什么ChartObject上的Copy与Chart上的Copy不同?复制()是一个微不足道的操作...并且看到它不在Chart上工作是一个巨大的惊喜......
有解决方法吗?无论复制操作是从我的C#app以编程方式启动还是通过Excel本身的用户操作,我基本上都希望剪贴板看起来一样 .
如果图表表听起来很陌生......它基本上只是一张表,上面只有一张图表 . 您可以先创建一个基本的嵌入式图表,然后将其(设计选项卡)移动到专用工作表 .
谢谢 .
1 回答
经过一些反复试验,我发现了一个简单且非常可接受的解决方案
而不是在Chart实例上调用Copy(),从Chart获取ChartArea并在其上调用Copy .
记得COM发布所有中间COM对象:)