ESPORTAZIONE DATAGRIDVIEW IN EXCEL

di il
3 risposte

ESPORTAZIONE DATAGRIDVIEW IN EXCEL

Buongiorno a tutti,

premetto che sono abbastanza nuovo in questo mondo mi sto specializzando ora nella programmazione in VB.net.
Avrei bisogno di esportare una datagridview in Excel senza utilizzare il poco elegante Ctrl C+V e questo è il codice che ho scritto:

Nel form di load ho inserito il filtro del savefiledialog:

Private Sub frmListini_Load(sender As Object, e As EventArgs) Handles MyBase.Load

        If ConnectionState.Open Then
            con.Close()
        End If
        con.Open()

        disp_data()

        SaveFileDialog1.Filter = "Documenti di Microsoft Excel|*.xlsx"

    End Sub
Nel button di Export:

 Private Sub btnExport_Click(sender As Object, e As EventArgs) Handles btnExport.Click    'Esporto in Excel

        If SaveFileDialog1.ShowDialog = DialogResult.OK Then
            Dim sheetIndex As Integer
            Dim Ex As Object
            Dim Wb As Object
            Dim Ws As Object
            Ex = CreateObject("Excel.Application")
            Wb = Ex.workbook.add
            Dim col, row As Integer
            Dim rawData(dtgListini.Rows.Count, dtgListini.Columns.Count - 1) As Object
            For col = 0 To dtgListini.Columns.Count - 1
                rawData(0, col) = dtgListini.Columns(col).HeaderText.ToUpper
            Next
            For col = 0 To dtgListini.Columns.Count - 1
                For row = 0 To dtgListini.Rows.Count - 1
                    rawData(row + 1, col) = dtgListini.Rows(row).Cells(col).Value
                Next
            Next
            Dim finalColLetter As String = String.Empty
            finalColLetter = ExcelColName(dtgListini.Columns.Count)
            sheetIndex += 1
            Ws = Wb.Worksheets(sheetIndex)
            Dim excelRange As String = String.Format("A1:{0}{1}", finalColLetter, dtgListini.Rows.Count + 1)
            Ws.Range(excelRange, Type.Missing).Value2 = rawData
            Ws = Nothing
            Wb.SaveAs(SaveFileDialog1.FileName, Type.Missing, Type.Missing,
         Type.Missing, Type.Missing, Type.Missing, Type.Missing,
         Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing)
            Wb.Close(True, Type.Missing, Type.Missing)
            Wb = Nothing
            ' Release the Application object
            Ex.Quit()
            Ex = Nothing
            ' Collect the unreferenced objects
            GC.Collect()
            MessageBox.Show("Export successfully completed")
        End If
    End Sub
E infine la funzione:

    Public Function ExcelColName(ByVal Col As Integer) As String
        If Col < 0 And Col > 256 Then
            MessageBox.Show("Invalid Argument")
            Return Nothing
            Exit Function
        End If
        Dim i As Int16
        Dim r As Int16
        Dim S As String
        If Col <= 26 Then
            S = Chr(Col + 64)
        Else
            r = Col Mod 26
            i = System.Math.Floor(Col / 26)
            If r = 0 Then
                r = 26
                i = i - 1
            End If
            S = Chr(i + 64) & Chr(r + 64)
        End If
        ExcelColName = S
    End Function
Ho aggiunto la referenza al progetto Microsoft Office Excel 16.0 Object libraty ed inserito il riferimento:
Imports Excel = Microsoft.Office.Interop.Excel

Il SaveFileDialog viene aperto correttamente, ma in fase di salvataggio mi restituisce il seguente errore:
System.Exception: 'Cannot create ActiveX component.' alla seguente riga: Ex = CreateObject("Excel.Application")

Sicuramente qualcuno più esperto mi potrà aiutare, l'ambiente utilizzato è VisualStudio 2019 Community (ho appena cambiato migrando dalla versione 2010) e la versione di Sql Server è la 2017.

Grazie mille a tutti in anticipo per l'aiuto

3 Risposte

  • Re: ESPORTAZIONE DATAGRIDVIEW IN EXCEL

    Prova così
    Private Sub Button2_Click(sender As System.Object, e As System.EventArgs) Handles Button2.Click
            Dim ExcelApp As Excel.Application
            Dim ExcelWorkBk As Excel.Workbook
            Dim ExcelWorkSht As Excel.Worksheet
    
            Dim i As Integer
            Dim j As Integer
    
            ExcelApp = New Excel.Application
            ExcelWorkBk = ExcelApp.Workbooks.Add()
            ExcelWorkSht = ExcelWorkBk.Sheets("Foglio1")
    
            'Export Header Names Start
            Dim columnsCount As Integer = DataGridView1.Columns.Count
    
            'For Each column In dgvOrderNonShipped.Columns
            'ExcelWorkSht.Cells(1, column.Index + 1) = column.HeaderText
            'Next
    
            'Export the data from the datagrid to an excel spreadsheet
            For i = 0 To DataGridView1.RowCount - 1
                For j = 0 To DataGridView1.ColumnCount - 1
                    For k As Integer = 1 To DataGridView1.Columns.Count
    
                        ExcelWorkSht.Cells(1, k) = DataGridView1.Columns(k - 1).HeaderText
                        ExcelWorkSht.Cells(i + 1, j + 1) = DataGridView1(j, i).Value
                    Next
                Next
            Next
    
            MsgBox("Grid exported successfully to Excel")
    
            With ExcelApp
                .Visible = True
                .Columns.AutoFit()
                .Rows("1:1").Font.FontStyle = "Bold"
                .Rows("1:1").Font.Size = 11
                .Cells.Select()
                .Cells.EntireColumn.AutoFit()
                .Cells(1, 1).Select()
            End With
            ExcelWorkBk.SaveAs("F:\Download\Test.xlsx")
            ExcelWorkBk.Close()                                      '
            ExcelApp.Quit()
        End Sub
  • Re: ESPORTAZIONE DATAGRIDVIEW IN EXCEL

    patel ha scritto:


    Prova così
    Private Sub Button2_Click(sender As System.Object, e As System.EventArgs) Handles Button2.Click
            Dim ExcelApp As Excel.Application
            Dim ExcelWorkBk As Excel.Workbook
            Dim ExcelWorkSht As Excel.Worksheet
    
            Dim i As Integer
            Dim j As Integer
    
            ExcelApp = New Excel.Application
            ExcelWorkBk = ExcelApp.Workbooks.Add()
            ExcelWorkSht = ExcelWorkBk.Sheets("Foglio1")
    
            'Export Header Names Start
            Dim columnsCount As Integer = DataGridView1.Columns.Count
    
            'For Each column In dgvOrderNonShipped.Columns
            'ExcelWorkSht.Cells(1, column.Index + 1) = column.HeaderText
            'Next
    
            'Export the data from the datagrid to an excel spreadsheet
            For i = 0 To DataGridView1.RowCount - 1
                For j = 0 To DataGridView1.ColumnCount - 1
                    For k As Integer = 1 To DataGridView1.Columns.Count
    
                        ExcelWorkSht.Cells(1, k) = DataGridView1.Columns(k - 1).HeaderText
                        ExcelWorkSht.Cells(i + 1, j + 1) = DataGridView1(j, i).Value
                    Next
                Next
            Next
    
            MsgBox("Grid exported successfully to Excel")
    
            With ExcelApp
                .Visible = True
                .Columns.AutoFit()
                .Rows("1:1").Font.FontStyle = "Bold"
                .Rows("1:1").Font.Size = 11
                .Cells.Select()
                .Cells.EntireColumn.AutoFit()
                .Cells(1, 1).Select()
            End With
            ExcelWorkBk.SaveAs("F:\Download\Test.xlsx")
            ExcelWorkBk.Close()                                      '
            ExcelApp.Quit()
        End Sub
    Buongiorno e grazie per il suggerimento,

    così funziona però non sempre, cosa molto strana; spesso mi restituisce il seguente errore di cui allego immagine.
    Pensavo fosse perchè l'Excel a fine debug non si chiude, allora chiudo manualmente i processi, ma non funziona lo stesso...la cosa strana è che a volte si a volte no...non credo sia normale...
    Allegati:
    31216_52f845917154ce95135e01f712499404.jpg
    31216_52f845917154ce95135e01f712499404.jpg
  • Re: ESPORTAZIONE DATAGRIDVIEW IN EXCEL

    Per capire, dopo la

    ExcelApp = New Excel.Application

    metti una

    ExcelApp.Visible = True

    e vedi cosa succede. Probabilmente, durante l'esecuzione, a volte, può essere visualizzato qualche msgbox con qualche domanda che attende risposta.
Devi accedere o registrarti per scrivere nel forum
3 risposte