从Excel 2007 - 2010文档中提取图像

时间:2012-05-23 04:48:27

标签: c# .net excel com interop

我正在编写一个使用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。

由于

1 个答案:

答案 0 :(得分:1)

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