如何在Open XML SDK中有效地缓冲和刷新流

8 c# xml excel performance

我使用OpenXML SDK 2.0生成包含大量数据的appox,appox.1000000行,我需要优化内存使用,因为我的机器速度很慢.

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

         foreach (Record m in dataList)
         {
            Row contentRow = CreateContentRow(index, m);         // my own method to create row content

            //Append new row to sheet data.
            sheetData.AppendChild(contentRow);

            if (index % BufferSize == 0)
            {
                worksheetPart.Worksheet.Save();
            }

            index++;

        }
Run Code Online (Sandbox Code Playgroud)

这种方法有效,因为内存使用图表已经看到形状,但不幸的是,内存使用时间增长.

有谁知道如何解决这个问题?

Joe*_*son 2

SpreadsheetGear for .NET可以在 74 秒内创建一个包含 1,000,000 行 x 40 列随机数(即 4000 万个单元格)的 xlsx 工作簿(包括根据随机数在内存中创建工作簿并在超频的 Intel QX 6850 和 Windows 上保存到磁盘)远景 32)。

您认为 Open XML SDK 的性能如何?

您可以在此处下载 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;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 一个措辞完美的问题,作为谷歌的第一个结果弹出。浏览1200次。唯一的答案是第三方零售库的可怜插头??? (7认同)