在Excel中复制选定范围时如何避免此exception?

在另一个问题,我问如何导出一个Excel工作表为图像 。 那么,答案背后的逻辑是好的。 但是在调用CopyPicture(System.Runtime.InteropServices.COMException)时,我正在创build一个exception。

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

什么可能是错的?

经过不成功的研究,我结束了这个不雅的解决scheme:

 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."); 

我希望这可以帮助别人。