我正在编写一个使用COM互操作从Excel电子表格中提取图像的应用程序。
如果我将文件从Excel 2010保存为XLS(2003格式),它可以正常工作但是如果我将其保存为XLSX(2007到2010格式),则会产生此异常“服务器引发异常。(例外情况HRESULT:0x80010105(RPC_E_SERVERFAULT))“
我的代码如下。 pic.Copy()行抛出异常;使用XLS可以很好地工作。
public static BitmapSource[] ImportImages(string FileName)
{
//Create the Excel Object
ExcelObj = new Microsoft.Office.Interop.Excel.Application();
//Create the Workbooks wrapper
Workbooks workbooks = ExcelObj.Workbooks;
//Open the Excel workbook
Workbook workbook = workbooks.Open(FileName);
//Reference the worksheets in the Excel file
Sheets sheets = workbook.Worksheets;
List<BitmapSource> images = new List<BitmapSource>();
List<Picture> pics = new List<Picture>();
//Reference the first sheet in the workbook
Worksheet sheet = sheets[1];
for (int i = 1; i < 30; i++)
{
pics.Add(sheet.Pictures(i));
}
foreach (Picture pic in pics)
{
pic.Copy();
if (Clipboard.ContainsImage())
{
images.Add(Clipboard.GetImage());
}
Marshal.ReleaseComObject(pic);
}
Marshal.ReleaseComObject(sheet);
Marshal.ReleaseComObject(workbooks);
Marshal.ReleaseComObject(workbook);
Marshal.ReleaseComObject(sheets);
ExcelObj.Quit();
Marshal.ReleaseComObject(ExcelObj);
return images.ToArray();
}
为什么会发生这种情况?我需要能够用我的项目支持2003和2007/2010。
由于
答案 0 :(得分:1)
当您同时瞄准Excel 2003和2007 /上时,我建议使用OpenXml SDK为Excel 2007及更高版本提取图片。首先,这是SDK比互操作更好的工作。我没有为Excel做过,但编写代码为PowerPoint做同样的事情。它的速度非常快,因为您甚至不启动Excel,而是直接使用XML Excel文件。其次,您似乎是在服务器上执行此操作,因此最好避免使用Interop。