GetDataObject 请求的剪贴板操作未成功 0x800401D0
GetDataObject Requested Clipboard operation did not succeed 0x800401D0
我为 Excel (2016) 制作了一个插件,将打印区域保存为 jpg 文件。它工作了几个月。现在我从用户那里收到越来越多的错误报告,都是同样的错误(下图)。用户有 Windows 7 with Excel 2013 或 Windows 10 with Excel 2016,都有这个错误。第一次重新安装我的程序有帮助,但从现在开始就没有帮助了。
这是我的代码:
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);
}
}
所有剪贴板访问必须运行使用 STA 线程。有很多方法可以做到这一点:
- 使用 BeginInvoke functions (Winforms or WPF) 保证 UI 线程(应该是 STA)上的代码 运行
- 启动你自己的 Thread 实例并使用 SetAparmentState(STA),
- 等等
我为 Excel (2016) 制作了一个插件,将打印区域保存为 jpg 文件。它工作了几个月。现在我从用户那里收到越来越多的错误报告,都是同样的错误(下图)。用户有 Windows 7 with Excel 2013 或 Windows 10 with Excel 2016,都有这个错误。第一次重新安装我的程序有帮助,但从现在开始就没有帮助了。
这是我的代码:
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);
}
}
所有剪贴板访问必须运行使用 STA 线程。有很多方法可以做到这一点:
- 使用 BeginInvoke functions (Winforms or WPF) 保证 UI 线程(应该是 STA)上的代码 运行
- 启动你自己的 Thread 实例并使用 SetAparmentState(STA),
- 等等