الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

تصدير البيانات الي الاكسل

بدأه محمد فؤاد تركي في 24 ديسمبر 2012 · 14 رد · 4,231 مشاهدة · في Microsoft Visual Basic.NET
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

الاخوة الزملاء

السلام عليكم ورحمة الله وبركاتة

أقوم بتصدير البيانات الحالية داخل DataGridview من خلال هذا الكود الي الاكسل

1- أستخدم Paging داخل DataGridview

2- المطلوب اريد ان اقوم بوضع 2 Radio Button الاول عبارة عن تصدير جميع محتويات DataGridview اقصد جميع الصفوف سواء في نطاق الــ Paging أو لا والثاني تصدير الصفحة الحالية فقط من الــ Paging

 Private Sub Export_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Export.Click

        If ((DgvFastSearch.Columns.Count = 0) Or (DgvFastSearch.Rows.Count = 0)) Then
            Exit Sub
        End If

        Dim rowsTotal, colsTotal As Short
        Dim I, j, iC As Short
        System.Windows.Forms.Cursor.Current = System.Windows.Forms.Cursors.WaitCursor
        Dim xlApp As New Excel.Application
        Try

            Dim excelBook As Microsoft.Office.Interop.Excel.Workbook = xlApp.Workbooks.Add
            Dim excelWorksheet As Microsoft.Office.Interop.Excel.Worksheet = CType(excelBook.Worksheets(1), Excel.Worksheet)
            xlApp.Visible = True

            rowsTotal = DgvFastSearch.RowCount - 1
            colsTotal = DgvFastSearch.Columns.Count - 1
            Dim currCol As Integer = 1
            With excelWorksheet
                .Cells.Select()
                .Cells.Delete()
                For iC = 0 To colsTotal

                    If DgvFastSearch.Columns(iC).Visible = True Then
                        .Cells(1, currCol).Value = DgvFastSearch.Columns(iC).HeaderText
                        currCol = currCol + 1

                    End If

                Next

                For I = 0 To rowsTotal
                    currCol = 1
                    For j = 0 To colsTotal
                        If DgvFastSearch.Columns(j).Visible = True Then
                            .Cells(I + 2, currCol).value = DgvFastSearch.Rows(I).Cells(j).FormattedValue
                            currCol = currCol + 1

                        End If
                    Next j
                Next I

                .Rows("1:1").Font.FontStyle = "Bold"
                .Rows("1:1").Font.Size = 10
                .Cells.Columns.AutoFit()
                .Cells.Select()
                .Cells.EntireColumn.AutoFit()
                .Cells(1, 1).Select()
            End With

        Catch ex As Exception
            MsgBox("Export Excel Error " & ex.Message)
        Finally
            System.Windows.Forms.Cursor.Current = System.Windows.Forms.Cursors.Default
            xlApp = Nothing
        End Try

    End Sub

تم تعديل هذه المشاركة بواسطة محمد فؤاد تركي في 24 ديسمبر 2012 في 16:59

certifiedj.jpg

 

 

Image Hosted by ImageShack.us
#2

السلام عليكم ...

  1. كان من الممكن عمل for loop على البيانات الموجودة في الــ dataTable و لكن إذا كان لدينا عمود في الـــ Grid من نوع DataGridviewcombobox (يظهر في الـ grid اسم Product بدلا من ProductID مثلا) أو عمود لديه Format خاص (مثل العملة أو التاريخ) هنا يجب وضع البيانات في الــ grid حتى تظهر لنا القيم formattedvalue .
  2. الكود الذي ارسلته انت يقوم بتصدير للــ Page الحالية ...و إليك طريقة تصدير كل البيانات .
  3. سنضع الكود الخاص بالتصدير في إجراء منفصل بحيث نمرر له الــ grid كبرامتر :
      Private Sub ExportDGV(ByVal dgv As DataGridView)
    
        	If ((dgv.Columns.Count = 0) Or (dgv.Rows.Count = 0)) Then
            	Exit Sub
        	End If
    
        	Dim rowsTotal, colsTotal As Short
        	Dim I, j, iC As Short
        	System.Windows.Forms.Cursor.Current = System.Windows.Forms.Cursors.WaitCursor
        	Dim xlApp As New Excel.Application
        	Try
    
            	Dim excelBook As Microsoft.Office.Interop.Excel.Workbook = xlApp.Workbooks.Add
            	Dim excelWorksheet As Microsoft.Office.Interop.Excel.Worksheet = CType(excelBook.Worksheets(1), Excel.Worksheet)
            	xlApp.Visible = True
    
            	rowsTotal = dgv.RowCount - 1
            	colsTotal = dgv.Columns.Count - 1
            	Dim currCol As Integer = 1
            	With excelWorksheet
                	.Cells.Select()
                	.Cells.Delete()
                	For iC = 0 To colsTotal
    
                    	If dgv.Columns(iC).Visible = True Then
                        	.Cells(1, currCol).Value = dgv.Columns(iC).HeaderText
                        	currCol = currCol + 1
    
                    	End If
    
                	Next
    
                	For I = 0 To rowsTotal
                    	currCol = 1
                    	For j = 0 To colsTotal
                        	If dgv.Columns(j).Visible = True Then
                            	.Cells(I + 2, currCol).value = dgv.Rows(I).Cells(j).FormattedValue
                            	currCol = currCol + 1
    
                        	End If
                    	Next j
                	Next I
    
                	.Rows("1:1").Font.FontStyle = "Bold"
                	.Rows("1:1").Font.Size = 10
                	.Cells.Columns.AutoFit()
                	.Cells.Select()
                	.Cells.EntireColumn.AutoFit()
                	.Cells(1, 1).Select()
            	End With
    
        	Catch ex As Exception
            	MsgBox("Export Excel Error " & ex.Message)
        	Finally
            	System.Windows.Forms.Cursor.Current = System.Windows.Forms.Cursors.Default
            	xlApp = Nothing
        	End Try
    	End Sub

  4. نقوم بإنشاء نسخة من الــ Grid التي لدينا (نسخة في الذاكرة و لا داعي لإظهارها على الفورم) .
  5. نجلب كل البيانات التي نريد تصديرها (من قاعدة البيانات إذا لم تكن موجودة) و نضعها في الــ grid الجديدة .
  6. نقوم بتصدير الــ grid الجديدة يالإجراء السابق .
  7. نقوم بتحرير الذاكرة المخصصة للــ grid الجديدة لانه لا حاجة لنا بها بعد عملية التصدير .
  8. Private Sub Button1_Click_1(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        	Dim dgv As New DataGridView
        	For Each col As DataGridViewColumn In DgvFastSearch.Columns
            	dgv.Columns.Add(col.Clone())
        	Next
        	'Me.Controls.Add(dgv)
        	' fetch the new data from DB
        	Dim row As String() = New String() {"2", "Product 2", "2000", "01/01/2012"}
        	dgv.Rows.Add(row)
        	row = New String() {"3", "Product 3", "2000", "01/01/2012"}
        	dgv.Rows.Add(row)
        	ExportDGV(dgv)
        	dgv.Columns.Clear()
        	dgv.Dispose()
        	dgv = Nothing
      System.GC.Collect()
    	End Sub

  9. قد يكون هناك حل آخر و اسهل من هذا .. لكنك أخي محمد لم تحدد نوع الــ Paging الذي تستخدمه هل هو server Side عن طريق ROW_NUMBER (أو ربما الــ ID ) ام هو Client side أم ماذا ...

تم تعديل هذه المشاركة بواسطة houssam11350_11350 في 24 ديسمبر 2012 في 18:38

لا إله إلا الله ... محمد رسول الله

لو كانت مشاركتي مفيدة و تريد تشجيعي على المزيد من العطاء , فضلا قم بتقييم المشاركة

المعرًف القديم : houssam11350_11350

من مواضيعي : ArabGenCode : مولد كود و إجراءات مخزنة و واجهات لجداول سيكوال سيرفر

#3

بعتذر لك أخي الكريم حسام عن عدم وضوح المعلومات

مرفق مثال جاهز وكل ما عليك هو تعديل فقط connection string وكما وضحت لك سابقا

المطلوب

عمل خياران عبارة عن 2 checkBox او 2 RadioButton

1- تصدير جميع البيانات دفعة واحدة الموجوده في الــ Table

2- تصدير الصقحة الحالية

Paging Datagridview _SQL.rar

certifiedj.jpg

 

 

Image Hosted by ImageShack.us
#4

السلام عليكم ...

أهلا بك أخي محمد ...

  1. انت تقوم بــ Client side Paging فانت لديك كل البيانات في الجدول dtSource ثم تقوم بأخذ نسخة من بعض الأسطر (حسب رقم الــ Page) و تضعهم في جدول dtTemp الذي تقوم بعرضه على الــ grid .
  2. نضع كود التصدير في دالة ExportDGV و هي موجودة في مشاركتي السابقة.
  3. لتصدير الصفحة الحالية فقط نستخدم الكود :
    ExportDGV(dgvList)

  4. لتصدير كل البيانات (الموجودة في dtSource ) نقوم بإنشاء DataGridView كنسخة من الــ dgvList و نضع مصدر بياناتها بإنه dtSource ثم نصدرها .
  5. لكن وجدت أن الــ Grid لا تظهر البيانات الموجودة في الــ DataSource إلا عندما تضاف إلى حاوية (فورم مثلا) .
  6. نضع على الفورم اثنين من الــ radio buttons , يكون كود زر التصدير :
     Private Sub Export_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Export.Click
        	If rdioExportCurrentPage.Checked Then
            	ExportDGV(dgvList)
        	Else
            	Dim tempDGV As New DataGridView
            	For Each col As DataGridViewColumn In dgvList.Columns
                	tempDGV.Columns.Add(col.Clone())
            	Next
            	tempDGV.Visible = False
            	Me.Controls.Add(tempDGV)
    
            	tempDGV.DataSource = dtSource
            	ExportDGV(tempDGV)
            	Me.Controls.Remove(tempDGV)
            	tempDGV.Columns.Clear()
            	tempDGV.Dispose()
            	tempDGV = Nothing
            	System.GC.Collect()
    
        	End If
    	End Sub

  7. كان يمكن أن لا نقوم بنسخ اعمدة الــ grid كونها بالاساس لا تحوي أعمدة و الأعمدة التي فيها هي AutoGenerated من الــ dataSource , لكن لا مشكلة و هكذا يكون الكود عاما .

تم تعديل هذه المشاركة بواسطة houssam11350_11350 في 24 ديسمبر 2012 في 21:58

لا إله إلا الله ... محمد رسول الله

لو كانت مشاركتي مفيدة و تريد تشجيعي على المزيد من العطاء , فضلا قم بتقييم المشاركة

المعرًف القديم : houssam11350_11350

من مواضيعي : ArabGenCode : مولد كود و إجراءات مخزنة و واجهات لجداول سيكوال سيرفر

#5

بارك الله فيك أخي الفاضل حسام

هذا هو المطلوب بالحرف الواحد

لكن لاحظت Behavior غريب أثناء تصدير بيانات الجدول بالكامل وهي كالتالي

1- جميع البيانات الموجوده بالجدول 578 سطر

2- أثناء التصدير الاكسل يصل عدد السطور أثناء التصدير بالاكسل فوق الـــ 5000 Row

3- وبعد الانتهاء من عملية التصدير أجد ان عدد السطور التي تم تصديرها سليمة 587 سطر

4- اذا قمت بالضغط بالماوس علي ملف الاكسل أثناء عملية التصدير لا يتم استكمال العملية ويكتفي فقط بالمجموعة التي صدرت حتي الضغط بالماوس

انظر عدد الصفوف أثناء التصدير

post-46243-075918800 1356409070_thumb.jp

العدد سليم بعد اتمام العملية

post-46243-007794200 1356409083_thumb.jp

المرفقات
1.jpg2.jpg

تم تعديل هذه المشاركة بواسطة محمد فؤاد تركي في 25 ديسمبر 2012 في 07:24

certifiedj.jpg

 

 

Image Hosted by ImageShack.us
#6

السلام عليكم ...

  1. هذا الــ behavior ليس غريبا أخي محمد , لأن الـــ Count و الــ average و الـــ Sum التي في الأسفل هي للخلايا المحددة , لكل القيم في الخلايا المحددة و ليست عدد الأسطر , لاحظ كود التصدير يقول فيه :
    .Cells.Select()

    و من ميزات الإكسل انه يعطيك هذه القيم الإحصائية الثلاثة مباشرة عند تحديد أي مجال من الخلايا .

  2. اقتباس
    4- اذا قمت بالضغط بالماوس علي ملف الاكسل أثناء عملية التصدير لا يتم استكمال العملية ويكتفي فقط بالمجموعة التي صدرت حتي الضغط بالماوس
    معك حق و يعطي رسالة خطأ في التطبيق (أحيانا) و لتفادي حصول ذلك , يفضل إخفاء واجهة الإكسل ثم التصدير ثم إظهارها . بالكود :
    xlApp.Visible = False

    أي يكون كود التصدير :

     Sub ExportDGV(ByVal dgv As DataGridView)
        	If ((dgv.Columns.Count = 0) Or (dgv.Rows.Count = 0)) Then
            	Exit Sub
        	End If
    
        	Dim rowsTotal, colsTotal As Short
        	Dim I, j, iC As Short
        	System.Windows.Forms.Cursor.Current = System.Windows.Forms.Cursors.WaitCursor
        	Dim xlApp As New Excel.Application
        	Try
    
            	Dim excelBook As Microsoft.Office.Interop.Excel.Workbook = xlApp.Workbooks.Add
            	Dim excelWorksheet As Microsoft.Office.Interop.Excel.Worksheet = CType(excelBook.Worksheets(1), Excel.Worksheet)
            	xlApp.Visible = False
    
            	rowsTotal = dgv.RowCount - 1
            	colsTotal = dgv.Columns.Count - 1
            	Dim currCol As Integer = 1
            	With excelWorksheet
                	.Cells.Select()
                	.Cells.Delete()
                	For iC = 0 To colsTotal
    
                    	If dgv.Columns(iC).Visible = True Then
                        	.Cells(1, currCol).Value = dgv.Columns(iC).HeaderText
                        	currCol = currCol + 1
    
                    	End If
    
                	Next
    
                	For I = 0 To rowsTotal
                    	currCol = 1
                    	For j = 0 To colsTotal
                        	If dgv.Columns(j).Visible = True Then
                            	.Cells(I + 2, currCol).value = dgv.Rows(I).Cells(j).FormattedValue
                            	currCol = currCol + 1
    
                        	End If
                    	Next j
                	Next I
    
                	.Rows("1:1").Font.FontStyle = "Bold"
                	.Rows("1:1").Font.Size = 10
                	.Cells.Columns.AutoFit()
                	.Cells.Select()
                	.Cells.EntireColumn.AutoFit()
                	.Cells(1, 1).Select()
            	End With
            	xlApp.Visible = True
        	Catch ex As Exception
            	MsgBox("Export Excel Error " & ex.Message)
        	Finally
            	System.Windows.Forms.Cursor.Current = System.Windows.Forms.Cursors.Default
            	xlApp = Nothing
        	End Try
    	End Sub

  3. بالنسبة للــ Paging , كنت قد قمت بمحاولة لعمل userControl يقوم بهذه المهمة , يمكنك اختيار الصفحة التي تريدها مباشرة مع أزرار التالي و السابق و الأول و الأخير و عندما نكون في الصفحة الأخيرة يقوم بــ Disable للتالي و الأخير و عندما نكون في الصفحة الأولي يقوم بــ disable للاول و التالي .. قد يكون مفيدا .. رابط.

لا إله إلا الله ... محمد رسول الله

لو كانت مشاركتي مفيدة و تريد تشجيعي على المزيد من العطاء , فضلا قم بتقييم المشاركة

المعرًف القديم : houssam11350_11350

من مواضيعي : ArabGenCode : مولد كود و إجراءات مخزنة و واجهات لجداول سيكوال سيرفر

#7

أخوي حسام الشامي لو تتكرم و تكمل جميلك : عندي طلب واحد 

أنا عندي صفحة الأكسل قمت بإنشائها و تنسيقها مسبقاً كيف أقدر أحط البيانات فيها من الداتا قرايد فيو 

بس بشرط تكون أول خليه هي A2 اللي تبدأ فيها البيانات 

#8
دمعةvbالمقهور كتب:

أخوي حسام الشامي لو تتكرم و تكمل جميلك : عندي طلب واحد 

أنا عندي صفحة الأكسل قمت بإنشائها و تنسيقها مسبقاً كيف أقدر أحط البيانات فيها من الداتا قرايد فيو 

بس بشرط تكون أول خليه هي A2 اللي تبدأ فيها البيانات 

تفضل أخي ..

الملف مرفق ..

ExportToExcelVB.rar

لا إله إلا الله ... محمد رسول الله

لو كانت مشاركتي مفيدة و تريد تشجيعي على المزيد من العطاء , فضلا قم بتقييم المشاركة

المعرًف القديم : houssam11350_11350

من مواضيعي : ArabGenCode : مولد كود و إجراءات مخزنة و واجهات لجداول سيكوال سيرفر

#9

جزاك الله خير أخوي حسام الشامي على هذا الجهد الرائع

جربت الكود  و كان شغال 100% و حسب الطلب 

لكن عندي ملاحظة بسيطه : عندما أعمل تصدير إلى الإكسل بيأخد و قت كتير جدا  ؟؟؟ مدري المشكلة هذه عندي أنا و لا من الكود .... 

#10

السلام عليكم ..

بارك الله بك أخي ..

الكود يعتبر سريع عندي من أجل بيانات صغيرة ..

هذا يعتمد على حجم البيانات المنقولة ...و هل ملف الإكسل الذي تصدر له البيانات فيه الكثير من الضيغ .حيث عند أي تغيير في الخلية يتم حساب الخلايا المرتبطة بها .

لا إله إلا الله ... محمد رسول الله

لو كانت مشاركتي مفيدة و تريد تشجيعي على المزيد من العطاء , فضلا قم بتقييم المشاركة

المعرًف القديم : houssam11350_11350

من مواضيعي : ArabGenCode : مولد كود و إجراءات مخزنة و واجهات لجداول سيكوال سيرفر

#11
حسام الشامي كتب:

السلام عليكم ..

بارك الله بك أخي ..

الكود يعتبر سريع عندي من أجل بيانات صغيرة ..

هذا يعتمد على حجم البيانات المنقولة ...و هل ملف الإكسل الذي تصدر له البيانات فيه الكثير من الضيغ .حيث عند أي تغيير في الخلية يتم حساب الخلايا المرتبطة بها .

جربت الكود على ملف إكسل فارغ إصدار 2003 و اصدار 2007 و كان عدد السجلات حوالي 25 سجل أو صف وعدد الأعمدة حوالي 30 عمود  

و نفس الطريقة كان بيبطئ جداً ...؟؟؟؟

تم تعديل هذه المشاركة بواسطة دمعةvbالمقهور في 26 أكتوبر 2013 في 14:26

#12
دمعةvbالمقهور كتب:

جربت الكود على ملف إكسل فارغ إصدار 2003 و اصدار 2007 و كان عدد السجلات حوالي 25 سجل أو صف وعدد الأعمدة حوالي 30 عمود  

و نفس الطريقة كان بيبطئ جداً ...؟؟؟؟

لا معلومات عندي للأسف ..

لا إله إلا الله ... محمد رسول الله

لو كانت مشاركتي مفيدة و تريد تشجيعي على المزيد من العطاء , فضلا قم بتقييم المشاركة

المعرًف القديم : houssam11350_11350

من مواضيعي : ArabGenCode : مولد كود و إجراءات مخزنة و واجهات لجداول سيكوال سيرفر

#13

أخوي حسام الشامي شكراً لك 

و الله سويتلي خدمة الله يجزيك الخير كله

تقبل شكري و تقديري واحترامي

#14
دمعةvbالمقهور كتب:

أخوي حسام الشامي شكراً لك 

و الله سويتلي خدمة الله يجزيك الخير كله

تقبل شكري و تقديري واحترامي

بارك الله بك أخي .. و جزاك خيرا .

لا إله إلا الله ... محمد رسول الله

لو كانت مشاركتي مفيدة و تريد تشجيعي على المزيد من العطاء , فضلا قم بتقييم المشاركة

المعرًف القديم : houssam11350_11350

من مواضيعي : ArabGenCode : مولد كود و إجراءات مخزنة و واجهات لجداول سيكوال سيرفر

#15

ممكن تساعدني بمشروعي انا بحاجة لكود تصدير للاكسل ويقرأ سطر سطر البيانات

Safoo :rolleyes:

مواضيع مشابهة

عدد الزوار حالياً

المتواجدون خلال آخر دقيقتين · يتحدّث كل ٣٠ ثانية

—الإجمالي—أعضاء مسجّلون—زوار بدون تسجيل

جارٍ التحقق من المتواجدين…