时间:2014-10-17 09:53:32 来源: 复制分享
Range cell = excel.Activesheet.Cells[1,1];
cell.CopyPicture(1,2);
Bitmap image = Clipboard.GetImage() as Bitmap;
if(image != null)
{
//可以在这里为所欲为。
}
调试,运行,一切Ok,完全没问题,提交代码(期间还做了无数额外代码,此处不提。)。(嘿嘿,这种小事能难得到楼主吗,得意的笑。)
然后24小时过去了,话说第二天到了。
刚一上班,楼主就兴冲冲的发邮件告诉大家:恭喜大家,excel的拍图功能完成啦,大家赶快享用(是enjoy)吧。
大家也都很配合,纷纷发来贺电:“楼主Nb啊”之类的。
楼主的虚荣心得到了极大的满足,表示很开心。沉浸在自我陶醉之中。。。
不多时,同组一MM惊呼楼主的名字,“楼主,楼主,你快来看看吧,你的拍图功能真的太……”。 在最后还有两个字没说出来的时候,楼主已经飞奔到MM的身边。话说此MM那可真是。。(嗯,先不说吧),“太给力吗”,楼主很自信的补充了剩下的几个字。 MM手指屏幕,“你的拍图怎么崩掉了。”, 果然,屏幕上一个NullReferenceException嚣张的躺在屏幕中央。 楼主果断调试代码,跟踪发现,确实是拍图出了问题,上面的Clipboard.GetImage() 返回了null。 怎么会呢, 楼主又反复运行了几次,结果一样,都是返回null。 楼主表示鸭梨很大。
不过,鸭梨归鸭梨,楼主是个不轻易服输的人,口头禅是:我就不信这个邪了。 这次也是,楼主一边说着口头禅,一边继续跟踪。
首先当然是要看看剪贴板的数据,看拷贝成功了没,
Clipboard.GetDataObject().GetFormats() 方法返回:
[0]: "EnhancedMetafile"
[1]: "MetaFilePict"
[2]: "Link"
看样子,应该是拷出来了。然后楼主通过这几个format来get数据,发现还是不成功。 这就奇怪了。
楼主很受打击,回到座位上继续调试。
相同的代码,在楼主的机器上就是好好的,为什么在MM的机器上就是null呢。
楼主在自己的机器上再次查看剪贴板数据。
用Clipboard.GetDataObject().GetFormats() 方法返回:
[0]: "System.Drawing.Bitmap"
[1]: "Bitmap"
[2]: "DeviceIndependentBitmap"
[3]: "Format17"
[4]: "Link"
咦,怎么和上面的不一样呢。楼主很果断的发现,楼主的机器上安装的是Excel2010,而mm的机器上安装的是excel2007. 原来是它们考出来的数据不一样。
果断Google之。 于是,经过若干次失败和跳转,楼主来到这里:http://support.microsoft.com/kb/323530/en-us/
方才恍然大悟,这里的大概意思是说,由于.Net的一些限制,一些旧的程序(比如这里遇到的Excel2007)复制到剪贴板的数据可能不可用,需要通过本地Api来使用。 我去。。。 msdn上也没见半个字的提醒。
楼主是个比较勤快的人,知道了这个,那还不赶快动手。
于是楼主写下了大概类似如下的代码:
调试,运行,成功。呵呵,又是得意的笑。提交代码(期间省略若干额外代码)。
楼主又一次兴冲冲的发邮件给大家:excel的拍图可以用啦,大家快来享用吧。
然后,大家很配合纷纷发来贺电,然后。。。。
然后。。。。
然后什么,然后没了,很抱歉让大家失望了,这次没出问题。搞定。得意的笑。
总结一下吧:
1. 第一点要注意的是,Excel2007和Excel2010的拷贝数据格式不一样,要特别注意。
2. 很显然,excel里面凡是带有CopyPIcture方法的对象,都可以这样拍图。 粗略的看了一下,很多对象 都有这个方法,Range,Shape,Chart等等。
3. 另外,对于Chart对象,它还有一个Export方法,可以直接导出成图片。
4. 辛勤的楼主把上面的方法稍稍包装了一个Win32ClipboardHelper, 使用其中的GetImage传入excel的hwnd,就可以从剪贴板里面取出图片了。 上传到附件中,供大家享用。
5. 最后,友情提醒,由于某些原因,上文中出现的代码都是示意代码,与真实项目无关,也不保证上面的代码能编译通过,大家领会精神,不可较真。