解决方法或替代电子表格图像(图表).GetBitmap()?

我正在使用电子表格工具爬行“100K +以上”excel文件,但是我发现当Spreadsheetgear碰到一个有很多点的图表时,一切都松动了:内存不被释放,并占用大量的内存因为速度很慢。

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

有没有其他办法做到这一点? 我会很好,跳过文件,这将是缓慢的&试图做到这一点(检查在系列收集点数),但似乎点访问是问题,所以这并没有帮助(只是检查points.count似乎加载所有点以及相关数据!)。

任何帮助是最受赞赏的,要么能够以另一种方式抓取graphics(使用电子表格或者使用不需要安装任何东西的库,并且支持所有的Excel文件格式),或者检查有太多graphics的方法点不使用points.count。

这是一个野蛮的问题,问一些如此具体的事情,但我真的迷失在那里。

不完全相同的问题,但我们有各种各样的麻烦,试图保持电子表格齿轮图像在我们的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,据我所知,保存/检索时间受限于互联网连接,而不是服务器。

这种方法的缺点是它不适合多用户环境。 要做到这一点,您需要创build用户会话并给出用户唯一的图表名称。