【问题标题】:Pasting Image from Excel 2003 Clipboard从 Excel 2003 剪贴板粘贴图像
【发布时间】:2009-09-10 14:52:24
【问题描述】:

我的 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 粘贴图像没有问题。

帮助?

【问题讨论】:

  • 进一步研究表明,如果用户按住 shift 键,然后选择编辑 > 复制图片,然后选择“复制为位图”,而不是“复制为图片”,则现有代码将起作用。这就提出了一点——似乎默认的“复制”使用“复制为图片”。如何从剪贴板访问“图片”?

标签: c# excel office-2003


【解决方案1】:

我找到了解决办法。

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

办公室绘图形状格式 元文件图片 增强元文件 PNG+办公艺术 JFIF+办公艺术 GIF+办公艺术 PNG JFIF 动图 活动剪贴板

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

        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);
            //...
        }

而且它有效。

【讨论】:

  • 更好的解决方案;它支持透明而没有任何问题。
【解决方案2】:

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

您可以下载免费试用版here

免责声明:我拥有 SpreadsheetGear LLC

【讨论】:

  • 嗨,乔——我们不打算重新设计我们的业务流程,因为它确实有效。我们只是想解决阻止此现有方法正常运行的代码或配置问题。
猜你喜欢
  • 2013-07-08
  • 1970-01-01
  • 1970-01-01
  • 2015-07-29
  • 2013-12-06
  • 2013-02-21
  • 1970-01-01
  • 2016-08-05
  • 1970-01-01
相关资源
最近更新 更多