Буфер обмена Windows 2003 форм ExcelObject - PullRequest
1 голос
/ 29 октября 2010

Я пытаюсь получить доступ к диаграмме Excel 2003, скопированной в буфер обмена.

Изображение диаграммы отлично вставляется в mspaint или wordpad.

Проблема в том, что я не вижу данные диаграммы в моем объекте System.Windows.Forms.Clipboard.

Я прочитал следующий пост:

Вставка изображения из буфера обмена Excel 2003

и в моем конкретном сценарии единственные случаи, когда форматы PNG, JFIF или GIF отображаются в виде форматов в буфере обмена DataObject, - это когда я иду в диспетчер буфера обмена 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 Ответ

1 голос
/ 30 октября 2010

Ух ты ... ну, надеюсь, это поможет кому-то еще ...

У меня была случайная идея попробовать объект буфера обмена 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 Forms, и API-интерфейсы буфера обмена WPF все равно идут туда ...

...