0

我在 excel 文件中有图像,需要手动提取。我编写了一个程序,它对使用 Excel 2007 的用户非常有效,但不适用于 Excel 2003。

过程:用户打开 Excel 文件,将相关图像复制到剪贴板用户打开 C# 应用程序,单击从剪贴板收集图像的按钮,然后从用户那里收集其他信息。

应用程序代码非常简单。单击按钮时,将调用以下代码:

            if (Clipboard.GetImage() != null)
            {
                pictureBox1.Width = Clipboard.GetImage().Width;
                pictureBox1.Height = Clipboard.GetImage().Height;
                pictureBox1.Image = Clipboard.GetImage();

                //...more misc. code...
            }

这与 Excel 2007 完美配合,但不适用于 Excel 2003。

我尝试了以下调试代码,但都失败了:

Clipboard.ContainsImage() >> 返回 false Clipboard.GetDataObject().GetDataPresent(DataFormats.Bitmap) >> false

一种想法是 Excel 2003“Office 剪贴板”可能会干扰?但是,MS PAINT 粘贴图像没有问题。

帮助?

4

2 回答 2

2

我找到了解决方案。

显然 Excel 2007 不会以相同的文件格式将图像复制到剪贴板。我遍历了 Clipboard.GetDataObject().GetFormats() 并发现它包含以下内容:

办公绘图形状格式 MetaFilePict 增强元文件 PNG+办公艺术 JFIF+办公艺术 GIF+办公艺术 PNG JFIF GIF ActiveClipboard

为了让它工作,我在我的代码中添加了第二个代码块,代码如下:

        if (Clipboard.GetImage() != null) //Excel 2007
        {
            pictureBox1.Width = Clipboard.GetImage().Width;
            pictureBox1.Height = Clipboard.GetImage().Height;
            pictureBox1.Image = Clipboard.GetImage();
            //...
        }
        else if(Clipboard.GetDataObject().GetDataPresent("PNG")) //Excel 2003
        {
            Clipboard.GetDataObject().GetFormats()
            IDataObject data = Clipboard.GetDataObject();
            MemoryStream ms = (MemoryStream)data.GetData("PNG");

            pictureBox1.Width = Image.FromStream(ms).Width;
            pictureBox1.Height = Image.FromStream(ms).Height;
            pictureBox1.Image = Image.FromStream(ms);
            //...
        }

它有效。

于 2009-09-10T16:25:14.413 回答
0

SpreadsheetGear for .NET可以打开 Excel 工作簿,并从单元格范围或图表中获取图像,如这些示例所示(这些示例适用于 ASP.NET,但它与 WinForms 应用程序、控制台应用程序等也同样适用……)。SpreadsheetGear 不依赖于 Excel,因此它可以在安装了 Excel 2003、安装了 Excel 2007 或未安装 Excel 的情况下工作。

您可以在此处下载免费试用版。

免责声明:我拥有 SpreadsheetGear LLC

于 2009-09-10T15:19:37.450 回答