我在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)>>假
有人认为Excel 2003“Office剪贴板”可能会干扰?但是,MS PAINT粘贴图像没有问题。
帮助?
答案 0 :(得分:2)
我找到了解决方案。
显然,Excel 2007不会以相同的文件格式将图像复制到剪贴板。我遍历了Clipboard.GetDataObject()。GetFormats()并发现它包含以下内容:
Office绘图形状格式 METAFILEPICT EnhancedMetafile 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);
//...
}
它有效。
答案 1 :(得分:0)
SpreadsheetGear for .NET可以打开Excel工作簿并从these examples所示的单元格范围或图表中获取图像(这些示例适用于ASP.NET,但它适用于WinForms应用程序,控制台应用程序等等......) SpreadsheetGear不依赖于Excel,因此可以安装Excel 2003,安装Excel 2007或不安装Excel。
您可以下载免费试用here。
免责声明:我拥有SpreadsheetGear LLC