1

我正在使用电子表格抓取“大量”(100K +)的excel文件,但是我发现当电子表格点击一个有很多点的图表时,一切都变得松散:内存没有释放并且它也占用了大量内存因为很慢。

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

有没有其他方法可以做到这一点?我可以跳过速度很慢的文件并尝试这样做(检查系列集合中点的计数)但是似乎点访问是问题所以这没有帮助(只是检查 points.count 似乎加载所有点及其相关数据!)。

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

问这么具体的事情有点疯狂,但我真的迷路了。

4

1 回答 1

0

不完全相同的问题,但我们在尝试将电子表格齿轮图表图像保留在 MVC 应用程序的上下文中时遇到了各种麻烦,因此决定采用一种方法,将图表作为 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,据我所知,保存/检索时间受互联网连接而不是服务器的限制。

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

于 2013-07-23T00:45:24.673 回答