在excel中复制选定范围时,如何避免此异常?

时间:2014-02-18 10:32:04

标签: c# excel

在另一个问题中我问how to export an excel worksheet as image。那么,答案背后的逻辑是可以的。但是我在调​​用CopyPicture(System.Runtime.InteropServices.COMException)时会出现异常。

var a = new Microsoft.Office.Interop.Excel.Application();
Workbook w = a.Workbooks.Open(@"C:\scratch\blueyellow.xlsx");
Worksheet ws = w.Sheets["StatusR"];
ws.Protect(Contents: false);

Thread.Sleep(3000); // Fix (sometimes)
Range r = ws.Range["B4:P24"];
r.CopyPicture(XlPictureAppearance.xlScreen, XlCopyPictureFormat.xlBitmap); // <--- Exception
var data = Clipboard.GetDataObject();
data.GetDataPresent(DataFormats.Bitmap);
Image image = (Image)data.GetData(DataFormats.Bitmap, true);
image.Save(@"C:\scratch\informe_by.png", System.Drawing.Imaging.ImageFormat.Png);
w.Close(SaveChanges: false);
a.Quit(); 

我之前已经放了一个Thread.Sleep()行来解决这个问题。它大部分时间都有效。但是希望它能够在没有外来行为的情况下始终工作。

我使用的是Windows 8 Profesional 64位,Office 2013 64位和.Net 4

有什么不对?

1 个答案:

答案 0 :(得分:1)

在研究失败之后,我最终得到了这个不优雅的解决方案:

var errorCounter = 0;
var copyDone = false;
do {
   try {
      r.CopyPicture(XlPictureAppearance.xlScreen, XlCopyPictureFormat.xlBitmap);
      copyDone = true;
   } catch {
      ++errorCounter;
} while (!copyDone && errorCounter <= 100);

if (errorCounter == 100) throw new ApplicationException("Unable to copy the selected range.");

我希望这有助于他人。