函数Save()和SaveAs()太慢

时间:2019-08-26 12:03:54

标签: c# excel epplus

我正在尝试从Json转换为Excel。 json很大。因此,我不能使用直接转换。

我说的至少是1200万个条目。

我正在使用JsonReader读取Json文件,并将其部分转换为DataTable。

ExcelSheet的行数限制为1048576。因此,我需要创建差异表。

因此,我正在从DataTables中加载差异表。问题是当我所有的DataTables都加载完后,Save()操作永远不会结束。

一些摘要:

private void LoadDataTable(DataTable dt, ExcelPackage ep, string newName){
       OfficeOpenXml.ExcelWorksheet sheet = ep.Workbook.Worksheets.Add(newName); 
       sheet.Cells.LoadFromDataTable(dt, true);
}



static void Main(string[] args)
{
         using (ExcelPackage ep = new ExcelPackage(new FileInfo(output)))
         using (StreamReader sw = new StreamReader(input))
         using (JsonTextReader jr = new JsonTextReader(sw))
         {

               while(jr.Read()){
                   DataTable dt = new DataTable();
                       .........

                   //Filling DataTable with data.
                       .........
                   LoadDataTable(dt,ep,"foo"+i);

               } //The total of the the iterations takes 6 minutes more or less

               ep.Save();// Never ends. Here is my problem. 
         }
}  

我认为操作sheet.Cells.LoadFromDataTable(dt, true);将所有数据加载到内存中,而不是文件中。运行ep.Save()时,它将开始从内存到文件的转储。因此,这是极端不足的。

有什么方法可以直接在excel文件中写?或者我该如何更快地ep.Save()

更新:

我发现了这个link

我正在使用.NET Core,而Epplus版本是v4.5.3.2

3 个答案:

答案 0 :(得分:3)

劝阻恕我直言,因为Excel工作簿具有1200万条记录。 您认为用户如何处理如此大量的数据?

这是非常糟糕的设计。

您应该使用数据库导入和存储所有这些内容,然后实施SQL查询,这些查询结果可以集成到较小的excel文件中。

答案 1 :(得分:1)

假设您已经与您的团队争辩说Excel不是数据库工具,并且由于某些原因被告知它不适合讨论-

您可以在此处尝试以下几种操作:

  • 在对可以将多少数据有效保存到单个文件中进行一些实验之后,将数据加载到几个单独的excel文件中。这与使用单独的工作表不同,因为您可以在两次保存之间清除内存。另外,无论谁正在加载此文件,都将需要一些通过不同Excel表格浏览的奇特的阅读器;修改它以读取其他文件并不难。

  • 将数据另存为.csv文件,然后再将其转换为Excel格式(或根本不转换!)。这里的限制是您不能再次使用Excel工作表,因此最终将不得不(完全)将Excel从等式中删除,或者再次保存了许多不同的Excel文件。

答案 2 :(得分:1)

如果在这种情况下必须使用excel(那将是一个大文件!)我强烈建议您避免使用EPPlus内置的任何LoadFrom*()方法,并编写自己的循环。这些方法很方便,但是却要付出很大的性能成本,因为它们必须考虑所有条件而不仅仅是您的条件。仅通过编写自己的for / while循环,我就节省了出口时间,而不是秒,而是分钟

就改善SaveAs()而言,您此时处于图书馆的摆布之下。我有较小的数据集最多需要10-15分钟才能生成XLSX(不要问:o)。改进的唯一方法是生成原始XML,该XML保存在XLSX zip文件本身中,以绕过所有库逻辑,因为同样,它必须考虑所有可能性。但这是一项不小的壮举-必须在zip属性中映射单元格和文件,这就是为什么我从不花时间去弄清楚它的原因。