Я пытаюсь получить доступ к диаграмме 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 ...... но я бы предпочел этого не делать.
Спасибо за любую помощь ...