none
winform döngü de labelda sayaç gösterme RRS feed

  • Soru

  • Merhaba,

    aşağıdaki gibi excel dosyayı okumaya çalışıyorum satır sayısı çok fazla 50 bin okunurken; okunan satırları labelda göstermek istiyorum ancak runtime olarak göremiyorum işlem bittiğinde görebiliyorum? 

    satırlar okunurken ekranda görebilmem için ? 

    public MainForm()
            {
                this.WindowState = FormWindowState.Maximized;
                InitializeComponent();
            }
            OpenFileDialog ofd = new OpenFileDialog();
            private void btnExcelFile_Click(object sender, EventArgs e)
            {
                ofd.Filter = "Excel Files(.xls)|*.xls*";
                if (ofd.ShowDialog() == DialogResult.OK)
                {
                    textBox1.Text = ofd.FileName;
                    //textBox1.Text = ofd.SafeFileName;
                     
                    //
                    string str = "";
                    int readRecordCount = Convert.ToInt32(lblReadRecordCount.Text);
                    int successRecordCount = Convert.ToInt32(lblReadRecordCount.Text);
                    int errorRecordCount = Convert.ToInt32(lblErrorRecordCount.Text);
                    string con = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + textBox1.Text + @";Extended Properties='Excel 12.0'";
                    using (OleDbConnection connection = new OleDbConnection(con))
                    {
                        connection.Open();
                        OleDbCommand command = new OleDbCommand("select * from [Sheet1$]", connection);
                        using (OleDbDataReader dr = command.ExecuteReader())
                        {
                            while (dr.Read())
                            {
                                readRecordCount++;
                                lblReadRecordCount.Text = readRecordCount.ToString();
                                str += dr[0] + "," + dr[1];
                                str += "\r\n";
                            }
                        }
                    }
                   
                }
    
            }


    • Düzenleyen suat suphi 30 Aralık 2020 Çarşamba 20:40
    • Taşıyan Cihan YakarMVP 31 Aralık 2020 Perşembe 07:12 Asp.net ile ilgisi yok
    30 Aralık 2020 Çarşamba 20:39

Yanıtlar

  • Benim onerim satir gorme kismiyla ilgili degil, madem satir sayisi fazla olabiliyor, o zaman bu yontemdeki ekstra yavaslatmayi kaldirmaniz yonunde:

     
    StringBuilder sb = new StringBuilder();
                    int readRecordCount = Convert.ToInt32(lblReadRecordCount.Text);
                    int successRecordCount = Convert.ToInt32(lblReadRecordCount.Text);
                    int errorRecordCount = Convert.ToInt32(lblErrorRecordCount.Text);
                    string con = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + textBox1.Text + @";Extended Properties='Excel 12.0'";
                    using (OleDbConnection connection = new OleDbConnection(con))
                    {
                        connection.Open();
                        OleDbCommand command = new OleDbCommand("select [fieldName1], [fieldName2] from [Sheet1$]", connection);
                        using (OleDbDataReader dr = command.ExecuteReader())
                        {
                            while (dr.Read())
                            {
                                readRecordCount++;
                                lblReadRecordCount.Text = readRecordCount.ToString();
      
         sb.AppendLine($"{dr.GetString(0)},{dr.GetString(1)}");
                            }
                        }
                    }
                   
    +1907


    Blog
    How to create a Minimal, Reproducible Example
    The way to Go.
    World's most advanced open source (object-) relational Database.
    Flutter (for mobile, for web & desktop.


    Not: Temelin geri zekali arkadasi Idris bu mesaja da atlayip ne kadar aptal oldugunu bir kez daha belgeleyebilir. Kendisinin tek marifeti beni takip edip, neden her soruya cevap verdigimi, yardim etmeye calistigimi sorgulamaktir. Bu beyinsiz zavalliya, aptal oldugunu hatirlatmayi unutmayiniz.


    31 Aralık 2020 Perşembe 12:57
    Yanıtlayıcı

Tüm Yanıtlar

  • bir kaç seçenek var. en basiti ve yavaş olanı:

    DoEvents


    pgnchess.com

    dergikapaklari.com

    31 Aralık 2020 Perşembe 06:52
  • çok teşekkürler diğer seçenekler nedir ? aslında data boyutu 20 mb ta kadar çıkabiliyor o yüzden en hızlı olanı ekranda satırları okurken kullanıcıya program donmuş hissi uyandırmamak gerekiyor. 
    31 Aralık 2020 Perşembe 09:48
  • çok teşekkürler diğer seçenekler nedir ? aslında data boyutu 20 mb ta kadar çıkabiliyor o yüzden en hızlı olanı ekranda satırları okurken kullanıcıya program donmuş hissi uyandırmamak gerekiyor. 
    TPL (Task Parallel Library) kullanmak en iyi çözümlerden birisi. İyi araştır :)

    www.cihanyakar.com

    31 Aralık 2020 Perşembe 12:36
  • Benim onerim satir gorme kismiyla ilgili degil, madem satir sayisi fazla olabiliyor, o zaman bu yontemdeki ekstra yavaslatmayi kaldirmaniz yonunde:

     
    StringBuilder sb = new StringBuilder();
                    int readRecordCount = Convert.ToInt32(lblReadRecordCount.Text);
                    int successRecordCount = Convert.ToInt32(lblReadRecordCount.Text);
                    int errorRecordCount = Convert.ToInt32(lblErrorRecordCount.Text);
                    string con = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + textBox1.Text + @";Extended Properties='Excel 12.0'";
                    using (OleDbConnection connection = new OleDbConnection(con))
                    {
                        connection.Open();
                        OleDbCommand command = new OleDbCommand("select [fieldName1], [fieldName2] from [Sheet1$]", connection);
                        using (OleDbDataReader dr = command.ExecuteReader())
                        {
                            while (dr.Read())
                            {
                                readRecordCount++;
                                lblReadRecordCount.Text = readRecordCount.ToString();
      
         sb.AppendLine($"{dr.GetString(0)},{dr.GetString(1)}");
                            }
                        }
                    }
                   
    +1907


    Blog
    How to create a Minimal, Reproducible Example
    The way to Go.
    World's most advanced open source (object-) relational Database.
    Flutter (for mobile, for web & desktop.


    Not: Temelin geri zekali arkadasi Idris bu mesaja da atlayip ne kadar aptal oldugunu bir kez daha belgeleyebilir. Kendisinin tek marifeti beni takip edip, neden her soruya cevap verdigimi, yardim etmeye calistigimi sorgulamaktir. Bu beyinsiz zavalliya, aptal oldugunu hatirlatmayi unutmayiniz.


    31 Aralık 2020 Perşembe 12:57
    Yanıtlayıcı
  • hocam,

    bir sütünda telefon numaraları var. sadece sayısal değerler olsa iyi ama arada telefon numaraları boşluk veya parantez ve tire kullanılırak yazılmış

    2122001234

    02122001234

    902122001234

    9(0212)2001234

    (0212)200 12 34

    90-212-200-12-34

    yukarıdan 3 değer sayısal diğerleri string oluyor. bu yüzden dr.GetValue(1) ile değerleri getiremiyorum. 

    ;HDR=Yes;IMEX=1 denedim. Stringe dönüştürsün diye bu sefer de sayısal değerleri e11 gibi bozarak gösteriyor. 

    2 Şubat 2021 Salı 18:47
  • Excelde o sutunu text olarak gostermelisiniz. Ondan sonra normal alirsiniz. Isterseniz LinqToExcel'i de kullanabilirsiniz. Daha kolay olabilir.


    Blog
    How to create a Minimal, Reproducible Example
    The way to Go.
    World's most advanced open source (object-) relational Database.
    Flutter (for mobile, for web & desktop.


    Not: Temelin geri zekali arkadasi Idris bu mesaja da atlayip ne kadar aptal oldugunu bir kez daha belgeleyebilir. Kendisinin tek marifeti beni takip edip, neden her soruya cevap verdigimi, yardim etmeye calistigimi sorgulamaktir. Bu beyinsiz zavalliya, aptal oldugunu hatirlatmayi unutmayiniz.

    2 Şubat 2021 Salı 21:12
    Yanıtlayıcı
  • Isterseniz LinqToExcel'i de kullanabilirsiniz.  

    hocam bunu açabilir misiniz ? 

    3 Şubat 2021 Çarşamba 20:35
  • O degerlerin excel'de 'telefon' adinda bir kolonda oldugunu var sayarak, Nugetden LinqToExcel al ve bunu calistir:

    void Main()
    {
    	var excel = new ExcelQueryFactory(@"c:\temp\dummyexcel.xlsx");
    	var data = excel.Worksheet<Data>();
    	foreach (var t in data)
    	{
    		Console.WriteLine(t.telefon);
    	}
    }
    
    public class Data
    { 
    	public string telefon { get; set; }
    }
    

    Ciktisi:

    2122001234
    2122001234
    9.0212200123e+011
    9(0212)2001234
    (0212)200 12 34
    90-212-200-12-34

    Eger kolonu text olarak formatlamissan ciktisi:

    2122001234
    2122001234
    902122001234
    9(0212)2001234
    (0212)200 12 34
    90-212-200-12-34

    Sayfasinda daha detayli ornekler var.



    Blog
    How to create a Minimal, Reproducible Example
    The way to Go.
    World's most advanced open source (object-) relational Database.
    Flutter (for mobile, for web & desktop.


    Not: Temelin geri zekali arkadasi Idris bu mesaja da atlayip ne kadar aptal oldugunu bir kez daha belgeleyebilir. Kendisinin tek marifeti beni takip edip, neden her soruya cevap verdigimi, yardim etmeye calistigimi sorgulamaktir. Bu beyinsiz zavalliya, aptal oldugunu hatirlatmayi unutmayiniz.


    Not: Exceli veritabani gibi kullanmayiniz.
    4 Şubat 2021 Perşembe 00:02
    Yanıtlayıcı
  • hocam telefon numaralarında aynı sonucu elde ediyorum.

    9.0539494132e+011
    9.0539494449e+011
    9.0539494546e+011
    9.0539495213e+011

    4 Şubat 2021 Perşembe 18:52
  • Anlamadim. Yukarida elde edilen sonucu verdim. Basitce yapman gereken telefon kolonunu Text olarak gostermen.


    Blog
    How to create a Minimal, Reproducible Example
    The way to Go.
    World's most advanced open source (object-) relational Database.
    Flutter (for mobile, for web & desktop.


    Not: Temelin geri zekali arkadasi Idris bu mesaja da atlayip ne kadar aptal oldugunu bir kez daha belgeleyebilir. Kendisinin tek marifeti beni takip edip, neden her soruya cevap verdigimi, yardim etmeye calistigimi sorgulamaktir. Bu beyinsiz zavalliya, aptal oldugunu hatirlatmayi unutmayiniz.

    4 Şubat 2021 Perşembe 19:33
    Yanıtlayıcı
  • hocam sorunum bu sütunu seçip text olarak tanımlıyorum ancak hücrenin içine girmeden texte dönüştürmüyor. birde benim bunu programa yaptırmam gerekecek bu durumda da... 

    excelin kendi kütüphanesi çok yavaş çalışıyor. 30 saniyelik iş 20 dakika sürüyor. 

    Excel.Application xlApp;
                    Excel.Workbook xlWorkBook;
                    Excel.Worksheet xlWorkSheet;
                    Excel.Range range;
    
                    xlApp = new Excel.Application();
                    xlWorkBook = xlApp.Workbooks.Open(fileName, 0, true, 5, "", "", true, Microsoft.Office.Interop.Excel.XlPlatform.xlWindows, "\t", false, false, 0, true, 1, 0);
                    xlWorkSheet = (Excel.Worksheet)xlWorkBook.Worksheets.get_Item(1);
    
                    range = xlWorkSheet.UsedRange;
                    totalRowCount = range.Rows.Count;
    
    for (var rCnt = 1; rCnt <= totalRowCount; rCnt++)
    
    {
    
    }


    xlWorkSheet  datatable falan dönüştürebiliyor muyuz ? bunu hızlandırmanın da bir yöntemi olabilir mi ? 

    5 Şubat 2021 Cuma 07:11
  • Excel kutuphanesi aslinda o kadar da yavas degil. Normalde bir cok is icin 30 sn bile cok. Yavas olan COM cagrilar (her excel komutu aslinda bir COM cagri). Genel olarak yapilan hata da, senin ornegindeki gibi, for donguleriyle bu cagrilarin arttirilmasi. O zaman 20 dk bile iyimser sure olabilir (hic o kadar bekleyecek sabrim olmadi).

    Tam olarak ne yapmak istedigini ve ornek bir dosyayi cetinbasoz at gmail com adresine gonderebilirsen bakmaya calisirim.
    (yarin malum mac var, oncesinde de islerim var, ne zaman bakabilirim bilmiyorum).

    Not: Bu arada ilk ornekte ExecuteReader ile ornek var. Bir datatable yaratip, tbl.Load(command.ExecuteReader()) ile o Datatable'i doldurabilirsin.



    Blog
    How to create a Minimal, Reproducible Example
    The way to Go.
    World's most advanced open source (object-) relational Database.
    Flutter (for mobile, for web & desktop.


    Not: Temelin geri zekali arkadasi Idris bu mesaja da atlayip ne kadar aptal oldugunu bir kez daha belgeleyebilir. Kendisinin tek marifeti beni takip edip, neden her soruya cevap verdigimi, yardim etmeye calistigimi sorgulamaktir. Bu beyinsiz zavalliya, aptal oldugunu hatirlatmayi unutmayiniz.


    5 Şubat 2021 Cuma 20:56
    Yanıtlayıcı
  • hocam çok teşekkürler ama bir yöntem buldum. 20 dakikalık iş 30 saniye indi 38 bin satır için... 

    object[,] data = (object[,])xlWorkSheet.UsedRange.Value2;
                    for (int row = 1; row < data.GetLength(0)+1; row++)
    {
       var value = data[row, 1] == null ? "" : data[row, 1].ToString();
    }


    • Düzenleyen suat suphi 7 Şubat 2021 Pazar 12:26
    7 Şubat 2021 Pazar 10:48
  • Evet nispeten daha iyi. Excel'e kopyalama icin de en hizli yontemlerden birisi, ancak unutma, 38 bin satir normalde 1 sn filan surer. 30 sn kabul edilebilir bekleme ise kullan, yoksa OLEDB ile oku (veya LinqToExcel, Epplus ile).


    Blog
    How to create a Minimal, Reproducible Example
    The way to Go.
    World's most advanced open source (object-) relational Database.
    Flutter (for mobile, for web & desktop.


    Not: Temelin geri zekali arkadasi Idris bu mesaja da atlayip ne kadar aptal oldugunu bir kez daha belgeleyebilir. Kendisinin tek marifeti beni takip edip, neden her soruya cevap verdigimi, yardim etmeye calistigimi sorgulamaktir. Bu beyinsiz zavalliya, aptal oldugunu hatirlatmayi unutmayiniz.

    7 Şubat 2021 Pazar 14:53
    Yanıtlayıcı
  • +1905 olsaydı olurdu :)
    7 Şubat 2021 Pazar 15:04
  • +1905 olsaydı olurdu :)

    Ne buyuk espri.

    Hakem karari ile de olsa yendiniz, tebrikler.



    Blog
    How to create a Minimal, Reproducible Example
    The way to Go.
    World's most advanced open source (object-) relational Database.
    Flutter (for mobile, for web & desktop.


    Not: Temelin geri zekali arkadasi Idris bu mesaja da atlayip ne kadar aptal oldugunu bir kez daha belgeleyebilir. Kendisinin tek marifeti beni takip edip, neden her soruya cevap verdigimi, yardim etmeye calistigimi sorgulamaktir. Bu beyinsiz zavalliya, aptal oldugunu hatirlatmayi unutmayiniz.

    7 Şubat 2021 Pazar 20:13
    Yanıtlayıcı
  • hocam dediğim gibi string dönüştürmede falan problem yaşamıştım. örneğini istemiştiniz gönderdim. şu an son halini gönderdim size... sayısal değerler ve sayısal olmayan değerler mevcut. OLEDB ile çektiğimde sayısal olmayan değerleri getiremiyordum. 

    9.0539494132e+011

    9.0539494449e+011

    0(212)000 22 22

    0(212)000-33-33

    0(212)000-33-33 ev

    9.0539494546e+011

    9.0539495213e+011

    8 Şubat 2021 Pazartesi 06:28
  • +1905 olsaydı olurdu :)

    Ne buyuk espri.

    Hakem karari ile de olsa yendiniz, tebrikler.



    Blog
    How to create a Minimal, Reproducible Example
    The way to Go.
    World's most advanced open source (object-) relational Database.
    Flutter (for mobile, for web & desktop.


    Not: Temelin geri zekali arkadasi Idris bu mesaja da atlayip ne kadar aptal oldugunu bir kez daha belgeleyebilir. Kendisinin tek marifeti beni takip edip, neden her soruya cevap verdigimi, yardim etmeye calistigimi sorgulamaktir. Bu beyinsiz zavalliya, aptal oldugunu hatirlatmayi unutmayiniz.

    Kirli bir federasyon ve mhk ve bahis sistemi olduğunu düşünüyorum - bir kaç sene sonra detaylarını öğrenebileceğiz. 
    8 Şubat 2021 Pazartesi 17:15