电子表格图像(图表).GetBitmap()的变通方法或替代方法?

时间:2013-07-21 23:30:58

标签: c# .net excel charts spreadsheetgear

我正在爬行"很多" (100K +)使用电子表格的excel文件,但是我发现当Spreadsheetgear点击一个包含大量积分的图表时,一切都松了一下:内存未被释放&它占用了大量内存并且速度非常慢。

例如,我有一个63MB的excel文件,包含35个图表,每个图表96K点,每个图块的位图占用100MB +每个并且不会被释放(至少不会直到我关闭工作表)。如果我让我的程序在所有图表上运行,我最终会提交> 9GB!我绝对不能要求我的客户升级到支持所有文件所需的32GB +。

有没有替代方法呢?我可以跳过那些速度慢的文件。试图这样做(检查关于Pointsclection中的Points的计数)然而似乎点访问是问题所以这没有帮助(只是检查points.count似乎加载所有点以及它们的相关数据!)

非常感谢任何帮助,要么能够以另一种方式获取图表(使用电子表格或使用不需要安装任何内容的库并支持所有excel文件格式)或者检查没有使用points.count的点数过多的图表。

这是一个疯狂的镜头,询问一些如此具体的东西,但我真的迷失了。

1 个答案:

答案 0 :(得分:0)

不完全相同的问题,但我们在我们的MVC应用程序中尝试将Spreadsheet齿轮图图像保存在上下文中时遇到了各种麻烦,并决定采用一种方法,将图表作为png图像保存到服务器上然后再调用从服务器到视图。

这是在服务器上保存Excel图表并在剃刀视图中检索它的代码:

<!-- language: lang-cs -->
// Get the image from the spreadsheet
SpreadsheetGear.Shapes.IShape chart7 = worksheet.Shapes["Chart 7"];
SpreadsheetGear.Drawing.Image image7 = new SpreadsheetGear.Drawing.Image(chart7);
saveChartImage(image7, "Chart7.png");

//Save chart images to the server
private void saveChartImage(SpreadsheetGear.Drawing.Image image, string chartName)
{
    var imageFile = System.IO.Path.Combine(imagePath, chartName);
    System.Drawing.Image bitmap = image.GetBitmap();
    bitmap.Save(imageFile, System.Drawing.Imaging.ImageFormat.Png);
}

// Action result to get image    
public ActionResult getImage(string imageDir, string filename)
{
    var file = filename;
    var fullPath = Path.Combine(imageDir, file);
    return File(fullPath, "image/png", file);
}

在视图中检索图像:

<img src="@Url.Action("getImage", new { imageDir = "~/images/" "filename = "Chart7.png" })" />

我们在一些非常大且复杂的电子表格(6 - 8MB)上使用了这种方法。该代码从16个散点图中调出图像,其中包含400多个数据点。这些图表在服务器上大约是16KB,据我所知,保存/检索时间受到互联网连接而不是服务器的限制。

这种方法的缺点是它不适合多用户环境。为此,您需要创建用户会话并提供用户唯一的图表名称。