我正在尝试从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
答案 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属性中映射单元格和文件,这就是为什么我从不花时间去弄清楚它的原因。