none
Excel İmport Performans Hakkında RRS feed

  • Soru

  • Merhaba değerli arkadaşlar sunucu ya upload ettiğim excel dosyasını A kolonunda sadece numaralar var 15k civarlarında

    bu excel deki numaraları liste'ye ekliyorum şu şekilde 

     Microsoft.Office.Interop.Excel.Application application = new Microsoft.Office.Interop.Excel.Application();
                    Microsoft.Office.Interop.Excel.Workbook workbook = application.Workbooks.Open(path);
                    Microsoft.Office.Interop.Excel.Worksheet worksheet = workbook.ActiveSheet;
                    Microsoft.Office.Interop.Excel.Range range = worksheet.UsedRange;
                    List<ExcelModel> listenumaralar = new List<ExcelModel>();
                    for (int row = 2; row < range.Rows.Count + 1; row++)
                    {
                        ExcelModel n = new ExcelModel();
                        n.Numara = ((Microsoft.Office.Interop.Excel.Range)range.Cells[row, 1]).Text;
                        listenumaralar.Add(n);
                    }
    ancak bu şekilde listeye eklemeye kalktığımda yaklaşık 6-7 dk bekliyorum ama aynı dosyayı başka birisinin yaptıgı uygulamada aktardıgımda 30sn suruyor burada performansı arttırıcı düzenlemeler neler olabilir veya farklı bir önerisi olan varsa kod paylaşırsa sevinirim.

    25 Şubat 2017 Cumartesi 12:16

Yanıtlar

  • İstediğiniz performans iyileştirmesi, verileri tek hamlede okumakda yatıyor:

    string rangeString = "A1:A15000";
    object[,] objectArray = worksheet.get_Range(rangeString).Value2;
    List<ExcelModel> listenumaralar = new List<ExcelModel>();
    
    for (int row = 1; row < objectArray.Length; row++)
    {
        ExcelModel n = new ExcelModel();
        n.Numara = objectArray[row, 1].ToString();
        listenumaralar.Add(n);
    }

    Aksi takdirde, her bir satır için Excel'e gidiş-dönüş yapmak gerekiyor.

    Sizin kodunuz ile yukardaki kodu çalıştıran bir test uygulaması yazdım.  Benim sistemimde performans farkı 1:90 civarında.  Yani tek hamlede okumak süreyi doksanda bire indiriyor:


    Test verisi olarak 15 bin satırlı bir Excel dosyası kullandım, her bir satırda verdiğiniz değer (5455212700 ) bulunuyor.

    Projeyi buradan indirebilirsiniz: ExcelHızlıOku.zip

    Söz konusu Excel test veri dosyasını projenin bin\Debug klasöründe bulabilirsiniz.

    Teşekkürler.




    • Düzenleyen A.M. Sabuncu 25 Şubat 2017 Cumartesi 20:25
    • Yanıt Olarak İşaretleyen Resul Genç 26 Şubat 2017 Pazar 00:05
    25 Şubat 2017 Cumartesi 20:22

Tüm Yanıtlar

  • Merhaba,

    LinqToExcel kütüphanesi ile excelden verileri çekmeyi deneyebilirsin. Belki istediğin performansı verebilir. 

    LinqToExcel adresinden bakabilirsin kullanımına.

    İyi Çalışmalar...

    25 Şubat 2017 Cumartesi 15:35
  • Deneyeceğim teşekkürler
    25 Şubat 2017 Cumartesi 17:23
  • 15K ile 15 bin satır bulunduğunu mu söylüyorsunuz?  Örnek Excel dosyasını paylaşabilir misiniz?
    Ayrıca ExcelModel sınıfınızı paylaşır mısınız?

    Teşekkürler.

    25 Şubat 2017 Cumartesi 18:15
  • evet 15 bin satır örnek excel A kolonu 5455212700 gibi numaralar mevcut satır satır.ExcelModel nesini paylaşayım anlamadım.string numara properti mevcut ExcelModel de

    25 Şubat 2017 Cumartesi 19:51
  • İstediğiniz performans iyileştirmesi, verileri tek hamlede okumakda yatıyor:

    string rangeString = "A1:A15000";
    object[,] objectArray = worksheet.get_Range(rangeString).Value2;
    List<ExcelModel> listenumaralar = new List<ExcelModel>();
    
    for (int row = 1; row < objectArray.Length; row++)
    {
        ExcelModel n = new ExcelModel();
        n.Numara = objectArray[row, 1].ToString();
        listenumaralar.Add(n);
    }

    Aksi takdirde, her bir satır için Excel'e gidiş-dönüş yapmak gerekiyor.

    Sizin kodunuz ile yukardaki kodu çalıştıran bir test uygulaması yazdım.  Benim sistemimde performans farkı 1:90 civarında.  Yani tek hamlede okumak süreyi doksanda bire indiriyor:


    Test verisi olarak 15 bin satırlı bir Excel dosyası kullandım, her bir satırda verdiğiniz değer (5455212700 ) bulunuyor.

    Projeyi buradan indirebilirsiniz: ExcelHızlıOku.zip

    Söz konusu Excel test veri dosyasını projenin bin\Debug klasöründe bulabilirsiniz.

    Teşekkürler.




    • Düzenleyen A.M. Sabuncu 25 Şubat 2017 Cumartesi 20:25
    • Yanıt Olarak İşaretleyen Resul Genç 26 Şubat 2017 Pazar 00:05
    25 Şubat 2017 Cumartesi 20:22
  • Dostum evet güzel performans gayet kabul edilebilir.Daha performans iyileştirmesi yapmamız mümkünmü acaba :D
    25 Şubat 2017 Cumartesi 23:26
  • Yukardaki çözüm işinizi görüyorsa ve yanıt olarak işaretlerseniz, memnun olurum.

    25 Şubat 2017 Cumartesi 23:45
  • tamam dostum teşekkürler
    26 Şubat 2017 Pazar 00:05
  • Ben teşekkür ederim.
    26 Şubat 2017 Pazar 00:09
  • Dostum evet güzel performans gayet kabul edilebilir.Daha performans iyileştirmesi yapmamız mümkünmü acaba :D

    Ek olarak aşağıdakileri paylaşmak istedim:

    string rangeString = "A1:A" + worksheet.UsedRange.Rows.Count.ToString();

    Yukardaki komut sayesinde satır sayısını program içine gömmek gerekmiyor.  Komut, "A1:A15000" değerini üretiyor.  Bu örnekte sabit olduğu için kolonu dosyadan çekmedim, ama onun değeri de UsedRange.Columns.Count olarak elde edilebilir.

    Ayrıca:

    ExcelModel n = new ExcelModel();

    komutunun döngü içinden dışarı çıkarılması hiç bir şeyi değiştirmiyor, çünkü zaten .NET kurallarına göre değişkenlere metodun başında yer ayrılıyor.

    Umarım yararlı olmuştur.

    26 Şubat 2017 Pazar 16:17
  • Evet onuda ben halletmiştim :) yinede sagol
    27 Şubat 2017 Pazartesi 10:00