EPPLUS使用时CSV文件加载缓慢

3

我有很多csv文件需要在应用一些格式之后转换为xslx文件。

一个包含大约20,000行和7列的文件需要12分钟才能转换。 如果文件包含超过100,000个,则运行时间超过1小时。

对我来说,这是不可接受的。

代码片段:

        var format = new ExcelTextFormat();
        format.Delimiter = ';';
        format.Encoding = new UTF7Encoding();
        format.Culture = new CultureInfo(System.Threading.Thread.CurrentThread.CurrentCulture.ToString());
        format.Culture.DateTimeFormat.ShortDatePattern = "dd.mm.yyyy";

        using (ExcelPackage package = new ExcelPackage(new FileInfo(file.Name))){
            ExcelWorksheet worksheet = package.Workbook.Worksheets.Add(Path.GetFileNameWithoutExtension(file.Name));
            worksheet.Cells["A1"].LoadFromText(new FileInfo(file.FullName), format);
        }

我已经确认是LoadFromText命令花费的时间比较长。

有没有办法加快速度? 我尝试了不带“format”参数,但是加载时间仍然相同。

你遇到了什么样的加载时间?


由于这是一个简单的CSV文件,您尝试使用StreamReader读取它了吗? - Gianni B.
不,我对C#还很陌生,不太清楚它的使用方法,但我会研究你的建议。谢谢。 - gurbao
2个回答

8

我建议您首先自己阅读文件,然后使用库来创建文件。

读取CSV的代码可能很简单,如下所示:

List<String> lines = new List<String>();
using (StreamReader reader = new StreamReader("file.csv"))
{
    String line; 
    while((line = reader.ReadLine()) != null)
    {
        lines.add(line);
    }
}

//Now you got all lines of your CSV

//Create your file with EPPLUS

foreach(String line in lines)
{
    var values = line.Split(';');
    foreach(String value in values)
    {
        //use EPPLUS library to fill your file
    }
}

谢谢,这让我有了开始的动力!处理时间的差异真是太大了!之前需要18分钟处理的文件现在只需要18秒钟就能完成了!! - gurbao

2
我遇到了一个非常相似的问题,与LoadFromCollection有关。EPPlus必须考虑到所有情况,以便像那样通用地加载数据,因此存在很多开销。最终我将瓶颈缩小到该方法,并最终只是手动将集合中的数据转换为EPPlus中的Excel Cell对象。这样做可以节省几分钟的导出时间。
有很多关于如何读取CSV数据的示例: C#从CSV文件中读取特定值

@Gianni B 抱歉,我不是有意要踩你的脚 - 你比我快了一分钟 :) - Ernie S

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接