【问题标题】:Workaround or alternative to spreadsheetgear image(chart).GetBitmap()?电子表格图像(图表).GetBitmap()的解决方法或替代方法?
【发布时间】:2013-07-23 08:45:24
【问题描述】:

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

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

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

非常感谢任何帮助,无论是能够以其他方式获取图形(使用电子表格或使用不需要安装任何东西并支持所有 excel 文件格式的库)或检查图形的方法没有使用 points.count 的积分太多。

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

【问题讨论】:

    标签: c# .net excel charts spreadsheetgear


    【解决方案1】:

    不完全相同的问题,但我们在尝试将电子表格齿轮图表图像保留在 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,据我所知,保存/检索时间受 Internet 连接而不是服务器的限制。

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

    【讨论】:

    • 我真的不明白这与我的问题有什么关系?您显示的代码已经是我拥有的代码,它“是”问题,问题不在于生成的图像,而在于制作它,电子表格为每个点分配大量内存并将其分段很多,并且当您拥有每个有 96 000 个点的图表,并且每个文件有 100 个这样的图表时,一切都变得松散了。问题是我什至无法通过检查图表有多少点(points.count)来解决它,因为这已经分配了点!
    • 为了清楚起见,我们根本不是在谈论相同的数据大小,我的文件高达 300MB,我有 100 000 个文件,每个文件包含多达 300 个左右的图表,每个图表“每个图表”最多有 96000 点(而你是 400 点),所以你没有达到这些限制是很正常的。
    猜你喜欢
    • 2012-11-08
    • 2018-05-18
    • 1970-01-01
    • 2019-04-17
    • 2010-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多