Excel中图表对象的接口只允许通过两种方法访问表示图表的图像:
- 导出,将图像保存到文件
- CopyPicture,将图像保存到剪贴板
这两个选项都有问题(保存到文件真的很慢,保存到剪贴板可能会破坏用户数据)。
有一个更好的方法吗?我能想到的唯一方法是使用创建一个临时 ram 磁盘并将其安装在 '%TEMP%\tmp_ram_disk\' 下,这样保存到磁盘的选项就不会很慢,但要确定如何做到这一点或者如果它甚至可能。这是一个 C# 项目。
Excel中图表对象的接口只允许通过两种方法访问表示图表的图像:
这两个选项都有问题(保存到文件真的很慢,保存到剪贴板可能会破坏用户数据)。
有一个更好的方法吗?我能想到的唯一方法是使用创建一个临时 ram 磁盘并将其安装在 '%TEMP%\tmp_ram_disk\' 下,这样保存到磁盘的选项就不会很慢,但要确定如何做到这一点或者如果它甚至可能。这是一个 C# 项目。
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“动态图表库”示例中查看它可以做什么的代表性示例,或者您可以在此处下载免费试用版并自己尝试。
免责声明:我拥有 SpreadsheetGear LLC
一种可行的选择是使用内存映射文件。当然,磁盘可能会涉及到磁盘,因此您应该分析标准导出到磁盘与使用内存映射文件的对比(假设磁盘 i/o 的缓慢是您对这种方法的唯一关注)。
他们在 .Net 中还没有开箱即用的支持,但那里可能有很多实现。