使用Excel Interop抓取Excel图表的图像,而不写入磁盘或使用剪贴板

Excel中图表对象的接口只允许通过两种方法访问表示图表的图像:

  • 导出,将图像保存到文件中
  • CopyPicture,将图像保存到剪贴板

这两个选项都是有问题的(保存到文件非常慢,保存到剪贴板可能会破坏用户数据)。

有一个更好的方法吗? 我能想到的唯一方法是使用创build一个临时的RAM磁盘并将其挂载在'%TEMP%\ tmp_ram_disk \'下面,以便保存到磁盘选项不会很慢,但是确定该怎么做或者甚至是可能的。 这是一个C#项目。

一个可能工作的选项是使用内存映射文件。 当然,磁盘可能会涉及到,因此您应该将标准导出到磁盘与使用内存映射文件进行比较(假设磁盘I / O的缓慢是您唯一关心的方法)。

他们在.Net中没有开箱即用的支持,但是可能有很多的实现。

用于.NET的SpreadsheetGear可以加载Excel工作簿,并从图表中返回几行代码:

namespace GetChartImage { class Program { static void Main(string[] args) { // Open the workbook. var workbook = SpreadsheetGear.Factory.GetWorkbook(@"t:\tmp\Chart.xlsx"); // Get a chart named "Chart 1" on the sheet named "Sheet1". var chart = workbook.Worksheets["Sheet1"].Shapes["Chart 1"].Chart; // Get a System.Drawing.Bitmap image of the chart. var bitmap = new SpreadsheetGear.Drawing.Image(chart).GetBitmap(); // Save it to a file and launch just to see that it worked. bitmap.Save(@"t:\tmp\Chart.png", System.Drawing.Imaging.ImageFormat.Png); System.Diagnostics.Process.Start(@"t:\tmp\Chart.png"); } } } 

SpreadsheetGear不支持每个Excel图表function(但是),但是您可以在这里查看实时ASP.NET“dynamic图表库”示例中可以执行的代表性示例,或者您可以在此处下载免费试用版并自行尝试。

免责声明:我自己的SpreadsheetGear LLC