提高Excel文件读取速度

时间:2019-07-09 12:13:42

标签: c# excel uwp

我目前使用ExcelDataReader库读取一些excel文件,并使用这些数据创建一个庞大的对象。

https://github.com/ExcelDataReader/ExcelDataReader

我目前正在做的是..:

public static async Task<Poste> ReadData(string posteNumber)
{
    Poste poste = null;

    using (var stream = await posteFile.OpenStreamForReadAsync())
    {
        using (var reader = ExcelReaderFactory.CreateReader(stream))
        {
            while (reader.Read())
            {
                string code = reader.GetValue(2) as string;
                if(code != null)
                    if (code.Replace(" ", string.Empty).Equals(posteNumber.Replace(" ", string.Empty)))
                    {
                        poste = new Poste();

                        poste.CodePoste = reader.GetValue(2)?.ToString();
                        poste.Denomination = reader.GetValue(3)?.ToString();
                        poste.Constructeur = reader.GetValue(27)?.ToString();
                        poste.DateMiseEnService = reader.GetValue(23)?.ToString();
                        poste.DateMiseHorsService = reader.GetValue(14)?.ToString();
                        poste.Etat = reader.GetValue(6)?.ToString();
                        poste.Exploitant = reader.GetValue(13)?.ToString();
                        poste.LibelleCommune = reader.GetValue(4)?.ToString();
                        poste.Nature = reader.GetValue(7)?.ToString();
                        poste.CodeSchema = reader.GetValue(20)?.ToString();
                        poste.TypeBatiment = reader.GetValue(8)?.ToString();
                        poste.CodeTournee = reader.GetValue(15)?.ToString();
                        poste.Acces = reader.GetValue(24)?.ToString();
                        poste.Tmni = reader.GetValue(12)?.ToString();
                        poste.Adresse = reader.GetValue(33)?.ToString();
                        poste.Coord.Latitude = reader.GetValue(34)?.ToString();
                        poste.Coord.Longitude = reader.GetValue(35)?.ToString();

                        if (poste.CodePoste != null)
                        {
                            await GetTFMData(posteNumber, poste);
                            await GetDLDData(posteNumber, poste);
                            await GetAMMData(posteNumber, poste);
                            await GetCompteurData(posteNumber, poste);
                            await GetHTAData(posteNumber, poste);
                            await GetBTData(posteNumber, poste);
                        }
                    }
            }
        }
    }
    return poste;
}

CurrentPoste是一个数据绑定对象,因此如果要保持数据绑定,我需要像这样复制我的Poste

它可以工作,但是要花费很长时间(〜30秒)从中提取正确的数据,我不知道该怎么做才能优化我的代码部分。

我想知道将整个数据放入DataSet中,然后读取以从中提取所需数据是个好主意。

PS:GetTFMData(posteNumber,poste),等待GetDLDData(posteNumber,poste),...做的基本上是一样的,并且只要我张贴过。

1 个答案:

答案 0 :(得分:3)

每行都要执行一次:

PropertyInfo[] properties = res.GetType().GetProperties();

您正在反射以获取res类型的属性。反思还不够慢,我们不惜一切代价避免它,但是我们应该避免不必要地重复

每次获得res的属性时,结果-属性列表-都是相同的。那么为什么不止一次呢?而是一次创建properties,然后在填充每一行的对象时重新使用它。

您可以走得更远。不用获取属性然后检查它们以查看在您编写的每一行中一遍又一遍可写的内容,而是在前面添加该内容:

var properties = res.GetType().GetProperties()
    .Where(property => property.CanWrite);