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