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

时间:2009-11-11 16:11:20

标签: c# excel excel-interop

Excel中图表对象的interface仅允许通过两种方法访问代表图表的图像:

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

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

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

2 个答案:

答案 0 :(得分:0)

可能有效的一个选项是使用内存映射文件。当然磁盘可以参与其中,因此您应该将标准导出配置文件与使用内存映射文件进行配置(假设磁盘I / O的缓慢是您唯一关心的方法)。

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

答案 1 :(得分:0)

SpreadsheetGear for .NET可以加载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图表功能(但是),但您可以在实时ASP.NET“动态图表库”示例here中看到它可以做的代表性示例,或者您可以免费下载审判here并亲自尝试。

免责声明:我拥有SpreadsheetGear LLC