0

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 年をサポートできる必要があります。

ありがとう

4

1 に答える 1

1

Excel 2003 と 2007 以降の両方をターゲットにしていますが、OpenXml SDK を使用して Excel 2007 以降の画像を抽出することをお勧めします。まず、これは SDK が相互運用性よりもはるかにうまく機能するものです。Excel では実行していませんが、PowerPoint で同じことを行うコードを作成しました。Excel を起動しなくても、XML Excel ファイルを直接操作できるため、非常に高速です。第二に、相互運用を避けることを強くお勧めするサーバーでこれを行っているようです。

于 2012-05-23T06:01:33.433 に答える