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