GetDataObject请求的剪贴板操作未成功0x800401D0

时间:2017-08-03 09:06:09

标签: c# excel vsto clipboard excel-addins

我制作了一个AddIn for Excel(2016),它将打印区域保存为jpg文件。它工作好几个月。现在我收到越来越多的用户错误报告,都得到了同样的错误(如下图所示)。用户使用带有Excel 2013的Windows 7或带有Excel 2016的Windows 10,都有此错误。在第一次重新安装我的程序有帮助,但从现在开始它没有帮助。

enter image description here

这是我的代码:

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 个答案:

答案 0 :(得分:3)

所有剪贴板访问必须使用STA线程运行。有很多方法可以做到这一点:

  • 使用BeginInvoke函数(Winforms或WPF)保证代码在UI线程(应该是STA)上运行
  • 启动您自己的Thread实例并使用SetAparmentState(STA),