Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在OpenXMLSDK中有效地缓冲和刷新流_C#_Xml_Excel_Performance - Fatal编程技术网

C# 如何在OpenXMLSDK中有效地缓冲和刷新流

C# 如何在OpenXMLSDK中有效地缓冲和刷新流,c#,xml,excel,performance,C#,Xml,Excel,Performance,我使用OpenXMLSDK2.0生成包含大量数据的Excel文件,appox。1000000行,我需要优化内存使用,因为我的机器速度非常快 我想通过在运行时将生成的DOM树的一部分刷新到文件中来解决这个问题。我自己做数据缓冲。例如,我有100000条记录要写,当我在Excel工作表中添加1000行时,我希望将流刷新到文件中。我使用方法worksheetPart.Worksheet.Save()来实现这一点。 Documantation说这个方法Save():“将DOM树中的数据保存回部件。它也可

我使用OpenXMLSDK2.0生成包含大量数据的Excel文件,appox。1000000行,我需要优化内存使用,因为我的机器速度非常快

我想通过在运行时将生成的DOM树的一部分刷新到文件中来解决这个问题。我自己做数据缓冲。例如,我有100000条记录要写,当我在Excel工作表中添加1000行时,我希望将流刷新到文件中。我使用方法worksheetPart.Worksheet.Save()来实现这一点。 Documantation说这个方法Save():“将DOM树中的数据保存回部件。它也可以被调用多次。每次调用它时,流都会被刷新。”

这种方法之所以有效,是因为内存使用图表已经成形,但不幸的是,内存uasge随着时间的推移而增长

有人知道如何解决这个问题吗

可以在74秒内创建一个包含1000000行40列随机数(即4000万个单元格)的xlsx工作簿(包括在内存中使用随机数创建工作簿,并保存到超频Intel QX 6850和Windows Vista 32上的磁盘)

您在OpenXMLSDK中看到了什么样的性能

您可以下载SpreadsheetGear的免费试用版并亲自试用

我将通过代码生成下面的4000万单元格工作簿

免责声明:我拥有SpreadsheetGear LLC

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using SpreadsheetGear;

namespace ConsoleApplication10
{
    class Program
    {
        static void Main(string[] args)
        {
            try
            {
                // Run once with 100 rows and then run forever with 1,000,000 rows.
                for (int rows = 100; rows <= 1000000; rows = 1000000)
                {
                    Console.Write("rows={0}, ", rows);
                    var startMemory = System.GC.GetTotalMemory(true);
                    var timer = System.Diagnostics.Stopwatch.StartNew();
                    var workbook = BuildWorkbook(rows);
                    var usedMemory = System.GC.GetTotalMemory(true) - startMemory;
                    Console.WriteLine("usedMemory={0}, time={1} seconds, workbook.Name={2}", usedMemory, timer.Elapsed.TotalSeconds, workbook.Name);
                    workbook = null;
                }
            }
            catch (Exception e)
            {
                Console.WriteLine("got exception={0}", e.Message);
            }
        }

        static IWorkbook BuildWorkbook(int rows)
        {
            var workbook = Factory.GetWorkbook();
            var worksheet = workbook.Worksheets[0];
            var values = (SpreadsheetGear.Advanced.Cells.IValues)worksheet;
            Random rand = new Random();
            int cols = 40;
            for (int col = 0; col < cols; col++)
            {
                for (int row = 0; row <= rows; row++)
                {
                    values.SetNumber(row, col, rand.NextDouble());
                }
            }
            workbook.SaveAs(string.Format(@"c:\tmp\Rows{0}.xlsx", rows), FileFormat.OpenXMLWorkbook);
            return workbook;
        }
    }
}
使用系统;
使用System.Collections.Generic;
使用System.Linq;
使用系统文本;
使用电子表格;
命名空间控制台应用程序10
{
班级计划
{
静态void Main(字符串[]参数)
{
尝试
{
//使用100行运行一次,然后使用1000000行永远运行。

对于(int rows=100;rows而言,“缓冲和刷新”的方法是相反的用于编写大型Excel文件。该方法基于使用OpenXmlWriter类,并使用顺序写入而不是缓冲和刷新。一个典型的解决方案还使用替换部件和OpenXmlReader从模板中获取未更改的内容。请参阅(带有一些代码示例)和(带有完整的代码示例).

谢谢你的回答。我会检查电子表格设备是否能帮助我解决我的问题。我在这篇文章中描述了我的开放式XML SDK性能问题:一个措辞完美的问题,作为谷歌的第一个结果出现。浏览了1200次。唯一的答案是一个可怜的第三方零售库插件???特别是因为它是一个非常昂贵的third party library。售价1000美元的电子表格太贵了。@mdisibio“可怜的插件”似乎还有一个工作代码示例和一个免费试用版。解决软件问题的最佳答案并不总是“免费”或“自己动手”@john Wow。读了我的评论后,我觉得很粗鲁。我道歉。它不是针对你的。它是说“嘿,这是使用OpenXml库的开发人员的一个流行问题,除了建议购买第三方应用程序之外,没有人有答案吗?”我想指出这一点,但我看到你已经指出了。这应该是公认的答案,因为这是OP问题的正确解决方案。这两个URL都不再有效。@Mahen,我修复了第一个链接(Microsoft不尊重Web和开发人员:公司不维护重定向)。第二个链接正在修复中。@karolryz,为了清楚起见,为什么您将@Joe Erickson的答案标记为已接受,而
SpreadsheetGear for.NET
不是关于
Open XML SDK
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using SpreadsheetGear;

namespace ConsoleApplication10
{
    class Program
    {
        static void Main(string[] args)
        {
            try
            {
                // Run once with 100 rows and then run forever with 1,000,000 rows.
                for (int rows = 100; rows <= 1000000; rows = 1000000)
                {
                    Console.Write("rows={0}, ", rows);
                    var startMemory = System.GC.GetTotalMemory(true);
                    var timer = System.Diagnostics.Stopwatch.StartNew();
                    var workbook = BuildWorkbook(rows);
                    var usedMemory = System.GC.GetTotalMemory(true) - startMemory;
                    Console.WriteLine("usedMemory={0}, time={1} seconds, workbook.Name={2}", usedMemory, timer.Elapsed.TotalSeconds, workbook.Name);
                    workbook = null;
                }
            }
            catch (Exception e)
            {
                Console.WriteLine("got exception={0}", e.Message);
            }
        }

        static IWorkbook BuildWorkbook(int rows)
        {
            var workbook = Factory.GetWorkbook();
            var worksheet = workbook.Worksheets[0];
            var values = (SpreadsheetGear.Advanced.Cells.IValues)worksheet;
            Random rand = new Random();
            int cols = 40;
            for (int col = 0; col < cols; col++)
            {
                for (int row = 0; row <= rows; row++)
                {
                    values.SetNumber(row, col, rand.NextDouble());
                }
            }
            workbook.SaveAs(string.Format(@"c:\tmp\Rows{0}.xlsx", rows), FileFormat.OpenXMLWorkbook);
            return workbook;
        }
    }
}