2017-08-03 6 views
2

J'ai créé un AddIn pour Excel (2016), qui enregistre la zone d'impression en tant que fichier jpg. Cela a bien fonctionné pendant quelques mois. De nos jours, je reçois de plus en plus de rapports d'erreurs des utilisateurs, tous ont la même erreur (image ci-dessous). Les utilisateurs ont Windows 7 avec Excel 2013 ou Windows 10 avec Excel 2016, les deux ont cette erreur. Lors de la première réinstallation de mon programme a aidé, mais à partir de maintenant cela n'aide pas.L'opération de Presse-papiers demandée GetDataObject n'a pas réussi 0x800401D0

enter image description here

Voici mon code:

public static void Save(string report, string area, RibbonControlEventArgs e) 
{ 
    Excel.Window window = e.Control.Context; 
    Excel.Worksheet sheet = ((Excel.Worksheet)window.Application.ActiveSheet); 
    Excel.Range range = sheet.Range[sheet.PageSetup.PrintArea]; 

    range.CopyPicture(Excel.XlPictureAppearance.xlPrinter, Excel.XlCopyPictureFormat.xlPicture); 
    range.Copy(Type.Missing); 

    string fileName = @"\\server.company.lan\report.jpg"; 

    if (Clipboard.GetDataObject() != null) 
    { 
     IDataObject data = Clipboard.GetDataObject(); 

     Image image = (Image)data.GetData(DataFormats.Bitmap, true); 
     image.Save(fileName, ImageFormat.Jpeg); 
    } 
} 
+1

Exécutez-vous cela sur un thread non-STA? (PS: le type d'Exception pourrait sérieusement aider ...) vérifie aussi ceci: https://stackoverflow.com/questions/68666/clipbrd-e-cant-open-error-when-setting-the-clipboard-from- net –

+0

@SimonMourier Oui, je cours cela sur un thread non-STA. J'ai joint le message d'erreur à ma question, c'est tout ce que j'ai, car je ne peux pas reproduire cette erreur sur mon ordinateur. – Adam

+1

Vous devez utiliser un thread STA pour accéder au Presse-papiers. –

Répondre

3

Tous les accès du presse-papiers doit être exécuté en utilisant un thread STA. Il y a plusieurs façons de le faire:

  • utilisation BeginInvoke fonctions (Winforms ou WPF) qui garantissent le code est exécuté sur le thread d'interface utilisateur (qui doit être STA)
  • démarrer votre propre instance de discussion et d'utiliser SetAparmentState (STA),
  • etc.