2010-10-29 52 views
1

我試圖訪問Excel 2003圖表複製到剪貼板。Excel 2003 Windows窗體剪貼板數據對象

圖表圖像粘貼到mspaint或wordpad中。

問題是我在我的System.Windows.Forms.Clipboard對象上看不到圖表的數據。

我讀過下面的帖子:

Pasting Image from Excel 2003 Clipboard

,並在我的特殊情況下的唯一一次PNG,JFIF,或GIF格式出現在剪貼板數據對象是格式時,我去Excel剪貼板管理器(在Excel應用程序中)並在打開時重新複製圖表。 。

也就是說,如果清除我的剪貼板,打開Excel 2003,創建圖表,右鍵單擊它,打副本,然後檢查Clipboard.GetDataObject()GetFormats(),我看到的是:

Clipboard.GetDataObject().GetFormats() 
{string[6]} 
    [0]: "EnhancedMetafile" // is null 
    [1]: "Embed Source" // is a MemoryStream of about 10KB which seems to be an OLE representation for the whole workbook 
    [2]: "Object Descriptor" // a very short (10 bytes) MemoryStream 
    [3]: "Link Source" // a very short (10 bytes) MemoryStream 
    [4]: "Link Source Descriptor" // a very short (10 bytes) MemoryStream 
    [5]: "Link" // null 

如果我編輯下打開Excel剪貼板管理> Office剪貼板然後複製同一個圖表,即使Clipboard.ContainsImage()返回false,我看到:

Clipboard.GetDataObject().GetFormats() 
{string[10]} 
    [0]: "Office Drawing Shape Format" 
    [1]: "MetaFilePict" 
    [2]: "EnhancedMetafile" 
    [3]: "PNG+Office Art" // can read with Image.FromStream 
    [4]: "JFIF+Office Art" // can read with Image.FromStream 
    [5]: "GIF+Office Art" // can read with Image.FromStream 
    [6]: "PNG" // can read with Image.FromStream 
    [7]: "JFIF" // can read with Image.FromStream 
    [8]: "GIF" // can read with Image.FromStream 
    [9]: "ActiveClipBoard" 

,可以在圖像中的任何一個獲得格式化爲MemoryStream沒有任何問題。

我需要這個工作,而不必打開Excel剪貼板管理器。它在2007年和2010年工作正常(其中還包括一個常規的位圖格式,以方便我的Clipboard.ContainsImage()返回true)...

我已驗證多個工作站上的此行爲。

我在想接下來的步驟可能是在本機System.Runtime.InteropServices.ComTypes.IDataObject或更糟糕的是得到一個COM對象的運行實例的Excel ......但我寧願不必。

感謝您的幫助......

回答

1

哇....好,我希望這可以幫助別人....

我有隨機主意,試圖在WPF剪貼板對象(System.Windows .Clipboard)訴諸直接去OLE32.DLL之前....

你瞧......

System.Windows.Clipboard.GetDataObject().GetFormats() 
{string[7]} 
    [0]: "EnhancedMetafile" 
    [1]: "System.Drawing.Imaging.Metafile" 
    [2]: "Embed Source" 
    [3]: "Object Descriptor" 
    [4]: "Link Source" 
    [5]: "Link Source Descriptor" 
    [6]: "Link" 

果然:

System.Windows.Clipboard.GetData(System.Windows.Clipboard.GetDataObject().GetFormats()[0]) 
    {System.Drawing.Imaging.Metafile} 

等等...

((Image)System.Windows.Clipboard.GetData(System.Windows.Clipboard.GetDataObject().GetFormats()[0])).Save("C:\\test1.jpg") 
    base {System.Drawing.Image}: {System.Drawing.Imaging.Metafile} 

作品像魔術......

我懷疑直行的OLE32.DLL會工作過,因爲兩個Windows窗體和WPF的剪貼板的API去無論如何...

+0

所以,你會得到不同的行爲取決於你是否從'System.Windows.Forms.Clipboard',與'System.Windows.Clipboard'讀取剪貼板!? - 瘋狂! - 但也很高興知道。僅此而已Upvoted! :-) – BrainSlugs83 2016-05-04 23:14:36