西西軟件園多重安全檢測下載網(wǎng)站、值得信賴的軟件下載站!
軟件
軟件
文章
搜索

首頁西西教程軟件使用 → 把Excel中的單元格等對象保存成圖片的解決方案

把Excel中的單元格等對象保存成圖片的解決方案

相關(guān)軟件相關(guān)文章發(fā)表評論 來源:本站整理時間:2011/1/24 15:54:54字體大。A-A+

作者:佚名點擊:205次評論:0次標(biāo)簽: Excel

  • 類型:辦公軟件大小:72.1M語言:中文 評分:.9
  • 標(biāo)簽:
立即下載
 對于Excel中的很多對象,比如單元格(Cell),圖形(shape),圖表(chart)等等,有時需要將它們保存成一張圖片。就像截圖一樣。
最近做一個Excel相關(guān)的項目,項目中遇到一個很變態(tài)的需求, 需要對Excel中的一些對象進(jìn)行拍圖,比如,對一個單元格設(shè)置一些顏色之后拍圖,或者對一個圖表,報表拍成圖片。經(jīng)過比較曲折的經(jīng)歷,終于還是完成了。拿出來分享一下。
要做Excel,首先當(dāng)然是查看Excel的com對象模型。地址在這里:
http://msdn.microsoft.com/en-us/library/bb149081(v=office.12).aspx
這里說明一下:
官方的Excel2010對象參考沒有找到,點進(jìn)去就是死循環(huán),點來點去就是找不到,哪位神人找到了麻煩回復(fù)告知一下。 
Excel2003的對象模型,需要下下來安裝,比較麻煩,我也是安裝了之后才知道的,這里推薦大家就通過上面的網(wǎng)址查看Excel2007的模型就可以了。    實際上按照微軟的兼容慣例,Excel2010和Excel2003的差別應(yīng)該不大(是嗎?)。
然后是查看Range對象的成員,期待它有沒有什么現(xiàn)成的方法就爽了:http://msdn.microsoft.com/en-us/library/bb225606(v=office.12).aspx
查看了一圈,也沒發(fā)現(xiàn)類似什么 ExportImage,SaveImage之類的方法。表示沮喪,不過也是情理之中。
絕望之中發(fā)現(xiàn)了一個亮點,一個方法名字叫做CopyPicture。 看了一下方法說明,是要把對象當(dāng)作圖片拷到剪貼板里面。    呵呵,一個比較扭曲的想法誕生了,既然能拷到剪貼板里面,我再從剪貼板里面把圖片摳出來不就行了嗎。 
好,就這么定了,說干就干。
……
此處省略200字(怎么創(chuàng)建excel的com對象, 怎么取到Range對象就不說了,不知道的自己查,也可以回復(fù)提問。)
……
拿到Range對象之后。調(diào)用CopyPicture方法,需要兩個參數(shù)。第一個參數(shù)是XlPictureAppearance枚舉,1表示按照屏幕的樣子拷貝,2表示按照打印時的樣子拷貝。 第二個參數(shù)是XlCopyPictureFormat枚舉,2表示拷貝成位圖,-4147表示拷貝成矢量圖片。
于是乎,我寫了大概類似如下的代碼。

 Range cell = excel.Activesheet.Cells[1,1];
cell.CopyPicture(1,2);
Bitmap image = Clipboard.GetImage() as Bitmap;
if(image != null)
{
//可以在這里為所欲為。
}

調(diào)試,運行,一切Ok,完全沒問題,提交代碼(期間還做了無數(shù)額外代碼,此處不提。)。(嘿嘿,這種小事能難得到樓主嗎,得意的笑。)
然后24小時過去了,話說第二天到了。
剛一上班,樓主就興沖沖的發(fā)郵件告訴大家:恭喜大家,excel的拍圖功能完成啦,大家趕快享用(是enjoy)吧。
大家也都很配合,紛紛發(fā)來賀電:“樓主Nb啊”之類的。
樓主的虛榮心得到了極大的滿足,表示很開心。沉浸在自我陶醉之中。。。
不多時,同組一MM驚呼樓主的名字,“樓主,樓主,你快來看看吧,你的拍圖功能真的太……”。 在最后還有兩個字沒說出來的時候,樓主已經(jīng)飛奔到MM的身邊。話說此MM那可真是。。(嗯,先不說吧),“太給力嗎”,樓主很自信的補充了剩下的幾個字。 MM手指屏幕,“你的拍圖怎么崩掉了!, 果然,屏幕上一個NullReferenceException囂張的躺在屏幕中央。 樓主果斷調(diào)試代碼,跟蹤發(fā)現(xiàn),確實是拍圖出了問題,上面的Clipboard.GetImage() 返回了null。 怎么會呢, 樓主又反復(fù)運行了幾次,結(jié)果一樣,都是返回null。 樓主表示鴨梨很大。
不過,鴨梨歸鴨梨,樓主是個不輕易服輸?shù)娜,口頭禪是:我就不信這個邪了。 這次也是,樓主一邊說著口頭禪,一邊繼續(xù)跟蹤。
首先當(dāng)然是要看看剪貼板的數(shù)據(jù),看拷貝成功了沒,
Clipboard.GetDataObject().GetFormats() 方法返回:
  [0]: "EnhancedMetafile"
    [1]: "MetaFilePict"
    [2]: "Link"
看樣子,應(yīng)該是拷出來了。然后樓主通過這幾個format來get數(shù)據(jù),發(fā)現(xiàn)還是不成功。  這就奇怪了。
樓主很受打擊,回到座位上繼續(xù)調(diào)試。
相同的代碼,在樓主的機器上就是好好的,為什么在MM的機器上就是null呢。
樓主在自己的機器上再次查看剪貼板數(shù)據(jù)。
用Clipboard.GetDataObject().GetFormats() 方法返回:
[0]: "System.Drawing.Bitmap"
    [1]: "Bitmap"
    [2]: "DeviceIndependentBitmap"
    [3]: "Format17"
    [4]: "Link"
咦,怎么和上面的不一樣呢。樓主很果斷的發(fā)現(xiàn),樓主的機器上安裝的是Excel2010,而mm的機器上安裝的是Excel2007. 原來是它們考出來的數(shù)據(jù)不一樣。
果斷Google之。  于是,經(jīng)過若干次失敗和跳轉(zhuǎn),樓主來到這里:http://support.microsoft.com/kb/323530/en-us/
方才恍然大悟,這里的大概意思是說,由于.Net的一些限制,一些舊的程序(比如這里遇到的Excel2007)復(fù)制到剪貼板的數(shù)據(jù)可能不可用,需要通過本地Api來使用。 我去。。。 msdn上也沒見半個字的提醒。
樓主是個比較勤快的人,知道了這個,那還不趕快動手。
于是樓主寫下了大概類似如下的代碼:

IntPtr hwnd = excel.Hwnd;
try             
                 if (OpenClipboard(hwnd)) 
                        {  IntPtr data = GetClipboardData(14); // CF_ENHMETAFILE      14
                     if (data != IntPtr.Zero)
                     {
                         using (Metafile mf = new Metafile(data, true))
                         {
          //這里有點多余,不過因為需要的是bitmap格式。就忍了。
                             Bitmap b = new Bitmap(mf);
                             return b;
                         }
                     }
                 }
             }
             finally
             {
      
             }
  
  
[DllImport("User32.dll")]         [return: MarshalAs(UnmanagedType.Bool)]         public static extern bool OpenClipboard(IntPtr hWndNewOwner);
  
[DllImport("User32.dll")]         [return: MarshalAs(UnmanagedType.Bool)]         public static extern bool CloseClipboard();     [DllImport("User32.dll")]         public static extern IntPtr GetClipboardData(System.UInt32 uFormat);

調(diào)試,運行,成功。呵呵,又是得意的笑。提交代碼(期間省略若干額外代碼)。
樓主又一次興沖沖的發(fā)郵件給大家:excel的拍圖可以用啦,大家快來享用吧。
然后,大家很配合紛紛發(fā)來賀電,然后。。。。
然后。。。。
然后什么,然后沒了,很抱歉讓大家失望了,這次沒出問題。搞定。得意的笑。
總結(jié)一下吧:
1. 第一點要注意的是,Excel2007和Excel2010的拷貝數(shù)據(jù)格式不一樣,要特別注意。
2. 很顯然,excel里面凡是帶有CopyPIcture方法的對象,都可以這樣拍圖。 粗略的看了一下,很多對象 都有這個方法,Range,Shape,Chart等等。
3. 另外,對于Chart對象,它還有一個Export方法,可以直接導(dǎo)出成圖片。
4. 辛勤的樓主把上面的方法稍稍包裝了一個Win32ClipboardHelper, 使用其中的GetImage傳入excel的hwnd,就可以從剪貼板里面取出圖片了。  上傳到附件中,供大家享用。
5. 最后,友情提醒,由于某些原因,上文中出現(xiàn)的代碼都是示意代碼,與真實項目無關(guān),也不保證上面的代碼能編譯通過,大家領(lǐng)會精神,不可較真。

    表格軟件
    (18)表格軟件
    在日常辦公中經(jīng)常會需要用到表格軟件,一般我們常見的表格軟件就是了,不過只有正版系統(tǒng)中才有,而很多國人使用的都是盜版的系統(tǒng)是沒有軟件的。這里西西給大家提供了一些比較好用的表格軟件下載,包括等軟件,如果你的電腦中沒有,需要找一些好用的軟件可以來西西下載。...更多>>
    excel2007
    (11)excel2007
    這款辦公軟件大家平時都用吧,小編相信也不用做多介紹了,西西主要為大家?guī)砉俜皆婕耙恍╇娮訒旖萱I等下載,有需要的就拿走吧官方下載說明這個版本是官方正式版,是官方許可免費發(fā)布的軟件,可以在您的設(shè)備上安裝和使用本軟件的任意數(shù)量的副本。小編平時也經(jīng)常用它,所以整理了一些格式的電子書分享給大家,新手可以認(rèn)真看看。官方介紹是一款老牌的辦公軟件套裝,可以實現(xiàn)辦公軟件最常用的文字表格演示等多種功能。內(nèi)存占用低...更多>>

    相關(guān)評論

    閱讀本文后您有什么感想? 已有人給出評價!

    • 8 喜歡喜歡
    • 3 頂
    • 1 難過難過
    • 5 囧
    • 3 圍觀圍觀
    • 2 無聊無聊

    熱門評論

    最新評論

    發(fā)表評論 查看所有評論(0)

    昵稱:
    表情: 高興 可 汗 我不要 害羞 好 下下下 送花 屎 親親
    字?jǐn)?shù): 0/500 (您的評論需要經(jīng)過審核才能顯示)