2010-10-29 5 views
1

J'essaie d'obtenir l'accès au graphique Excel 2003 copié dans le Presse-papiers.Excel 2003 Windows Forms Presse-papiers DataObject

L'image du diagramme est bien collée dans mspaint ou dans le bloc-notes.

Le problème est que je ne vois pas les données du graphique sur mon objet System.Windows.Forms.Clipboard.

J'ai lu le post suivant:

Pasting Image from Excel 2003 Clipboard

et dans mon scénario particulier la seule fois que le PNG, JFIF ou formats GIF apparaissent sous forme de formats sur le presse-papiers DataObject est quand je vais à la Gestionnaire de presse-papiers Excel (dans l'application Excel) et recopiez à nouveau le graphique lorsqu'il est ouvert. .

C'est, si j'effacer mon presse-papiers, ouvrez Excel 2003, créez un graphique, un clic droit, appuyez sur Copier, puis vérifiez Clipboard.GetDataObject() GetFormats(), tout ce que je vois est:

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 

Si j'ouvre le Presse-papiers Excel Manager sous Edition> Presse-papiers office, puis copier le même graphique, même si Clipboard.ContainsImage() retourne faux, je vois:

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" 

et peut obtenir à tout de l'image Formats là comme un MemoryStream sans aucun problème.

J'ai besoin que cela fonctionne sans avoir à ouvrir le Gestionnaire de Presse-papiers Excel. Cela fonctionne bien sur 2007 et 2010 (qui inclut également un format de Bitmap régulier pour que le Clipboard.ContainsImage() renvoie true) ...

J'ai vérifié ce comportement sur plusieurs stations de travail.

Je pense que les prochaines étapes peuvent être d'obtenir le System.Runtime.InteropServices.ComTypes.IDataObject natif ou pire encore obtenir un handle sur l'objet COM pour l'instance en cours d'exécution d'Excel ...... mais je préfère ne pas le faire.

Merci pour toute aide ...

Répondre

1

Wow .... J'espère bien que cela aide quelqu'un d'autre ....

J'ai eu l'idée d'essayer au hasard l'objet presse-papiers WPF (de System.Windows .Clipboard) avant de recourir à tout droit à OLE32.dll ....

et voilà ...

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" 

bien sûr:

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

et ainsi ...

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

fonctionne comme par magie ...

Je soupçonne tout droit pour le OLE32.dll aurait travaillé aussi, puisque les deux Windows Forms et les API Presse-papiers de WPF vont là de toute façon ...

+0

Donc, vous obtenez un comportement différent selon que vous lisez le presse-papiers à partir de 'System.Windows.Forms.Clipboard', ou' System.Windows.Clipboard'!? -- Fou!! - Mais aussi, bon à savoir. Upvoted pour cela seul! :-) – BrainSlugs83