Spreadsheetgage图像(图表)的解决方案或替代方案.GetBitmap()
本文关键字:方案 GetBitmap 图像 图表 Spreadsheetgage 解决方案 | 更新日期: 2023-09-27 18:24:04
我正在使用spreadsheetgear抓取"很多"(100K+)excel文件,但我发现当spreadsheetgear碰到一个有很多点的图表时,一切都会失控:内存没有释放&它占用了大量的内存,而且速度非常慢。
例如,我有一个63MB的excel文件,其中包含35个图表,每个图表有96K点,每个图表的位图占用100MB+,并且不会发布(至少在我关闭工作表之前)。如果我让我的程序在所有图表上运行,我最终会得到>9GB的承诺!我绝对不能要求我的客户升级到支持所有文件所需的32GB+。
除了这样做,还有其他选择吗?我可以跳过速度较慢的文件;尝试过这样做(检查系列收集中的点数),但似乎是点访问问题,所以这没有帮助(只是检查点计数似乎加载了所有点及其相关数据!)。
任何帮助都是最值得赞赏的,要么是能够以另一种方式获取图形(使用spreadsheetgage或不需要安装任何东西的库,并且支持所有excel文件格式),要么是在不使用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,据我所知,保存/检索时间受到互联网连接而非服务器的限制。
这种方法的缺点是它不适合多用户环境。要做到这一点,您需要创建用户会话,并为用户提供唯一的图表名称。