C# 从Excel2007-2010文档中提取图像

C# 从Excel2007-2010文档中提取图像,c#,.net,excel,com,interop,C#,.net,Excel,Com,Interop,我正在编写一个应用程序,使用COM互操作从Excel电子表格中提取图像 如果我从Excel 2010将文件保存为XLS(2003格式),它工作得非常好,但是如果我将其保存为XLSX(2007到2010格式),它会生成此异常“服务器引发异常。(来自HRESULT的异常:0x80010105(RPC_E_SERVERFAULT))” 我的代码如下。异常由pic.Copy()行引发;与XLS配合使用效果非常好 公共静态位图源[]导入图像(字符串文件名) { //创建Excel对象 ExcelObj=新

我正在编写一个应用程序,使用COM互操作从Excel电子表格中提取图像

如果我从Excel 2010将文件保存为XLS(2003格式),它工作得非常好,但是如果我将其保存为XLSX(2007到2010格式),它会生成此异常“服务器引发异常。(来自HRESULT的异常:0x80010105(RPC_E_SERVERFAULT))”

我的代码如下。异常由pic.Copy()行引发;与XLS配合使用效果非常好

公共静态位图源[]导入图像(字符串文件名)
{
//创建Excel对象
ExcelObj=新的Microsoft.Office.Interop.Excel.Application();
//创建工作簿包装器
工作簿工作簿=ExcelObj.工作簿;
//打开Excel工作簿
工作簿=工作簿。打开(文件名);
//参考Excel文件中的工作表
工作表=工作簿。工作表;
列表图像=新列表();
列表图片=新列表();
//参考工作簿中的第一张工作表
工作表工作表=工作表[1];
对于(int i=1;i<30;i++)
{
图.加(页.图(一));
}
foreach(图片中的图片)
{
pic.Copy();
if(剪贴板.ContainsImage())
{
image.Add(Clipboard.GetImage());
}
Marshal.ReleaseComObject(pic);
}
元帅发布对象(第页);
Marshal.ReleaseComObject(工作簿);
Marshal.ReleaseComObject(工作簿);
元帅发布对象(张);
ExcelObj.Quit();
发布对象元帅(ExcelObj);
返回图像。ToArray();
}
知道为什么会这样吗?我需要能够支持我的项目2003年和2007/2010年


谢谢

当您同时瞄准Excel 2003和2007/以上版本时,我建议使用OpenXml SDK为Excel 2007和以上版本提取图片。首先,这是SDK比interop工作得更好的地方。我还没有为Excel做过这件事,但我编写了代码,为PowerPoint做了同样的事情。它的速度非常快,因为您甚至不启动Excel,而是直接处理XML Excel文件。其次,您似乎是在服务器上执行此操作,在服务器上避免互操作是非常明智的。

是的,这似乎是解决此问题的最佳解决方案。这将在工作站而不是服务器上运行。我将不得不为XLSX文件使用OpenXMLSDK,并为XLS使用我的原始代码。