Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C# / VB.NET - [VB. NET] Utilizzo di ClosedXML per export da DataGridView a Excel
Forum - C# / VB.NET - [VB. NET] Utilizzo di ClosedXML per export da DataGridView a Excel

Avatar
dylan666 (Normal User)
Pro


Messaggi: 128
Iscritto: 08/09/2009

Segnala al moderatore
Postato alle 14:55
Lunedì, 26/04/2021
Ciao a tutti,
vorrei esportare il contenuto di un DataGridView in Excel con tutta la formattazione.
Ho trovato questo link:
https://stackoverflow.com/questions/39210329/export-the-dat ...

Con una conversione online da C# a VB.Net sono arrivato a questo codice:

Codice sorgente - presumibilmente VB.NET

  1. Public Sub ExportToExcelWithFormatting(ByVal dataGridView1 As DataGridView)
  2.         Dim fileName As String
  3.         Dim saveFileDialog1 As SaveFileDialog = New SaveFileDialog()
  4.         saveFileDialog1.Filter = "xls files (*.xlsx)|*.xlsx|All files (*.*)|*.*"
  5.         saveFileDialog1.Title = "To Excel"
  6.         saveFileDialog1.FileName = Me.Text & " (" + DateTime.Now.ToString("yyyy-MM-dd") & ")"
  7.  
  8.         If saveFileDialog1.ShowDialog() = DialogResult.OK Then
  9.             fileName = saveFileDialog1.FileName
  10.             Dim workbook = New Workbook()
  11.             Dim worksheet = workbook.Worksheets.Add(Me.Text)
  12.  
  13.             For i As Integer = 0 To dataGridView1.Columns.Count - 1
  14.                 worksheet.Cell(1, i + 1).Value = dataGridView1.Columns(i).Name
  15.             Next
  16.  
  17.             For i As Integer = 0 To dataGridView1.Rows.Count - 1
  18.  
  19.                 For j As Integer = 0 To dataGridView1.Columns.Count - 1
  20.                     worksheet.Cell(i + 2, j + 1).Value = dataGridView1.Rows(i).Cells(j).Value.ToString()
  21.  
  22.                     If worksheet.Cell(i + 2, j + 1).Value.ToString().Length > 0 Then
  23.                         Dim align As XLAlignmentHorizontalValues
  24.  
  25.                         Select Case dataGridView1.Rows(i).Cells(j).Style.Alignment
  26.                             Case DataGridViewContentAlignment.BottomRight
  27.                                 align = XLAlignmentHorizontalValues.Right
  28.                             Case DataGridViewContentAlignment.MiddleRight
  29.                                 align = XLAlignmentHorizontalValues.Right
  30.                             Case DataGridViewContentAlignment.TopRight
  31.                                 align = XLAlignmentHorizontalValues.Right
  32.                             Case DataGridViewContentAlignment.BottomCenter
  33.                                 align = XLAlignmentHorizontalValues.Center
  34.                             Case DataGridViewContentAlignment.MiddleCenter
  35.                                 align = XLAlignmentHorizontalValues.Center
  36.                             Case DataGridViewContentAlignment.TopCenter
  37.                                 align = XLAlignmentHorizontalValues.Center
  38.                             Case Else
  39.                                 align = XLAlignmentHorizontalValues.Left
  40.                         End Select
  41.  
  42.                         worksheet.Cell(i + 2, j + 1).Style.Alignment.Horizontal = align
  43.                         Dim xlColor As XLColor = XLColor.FromColor(dataGridView1.Rows(i).Cells(j).Style.SelectionBackColor)
  44.                         worksheet.Cell(i + 2, j + 1).AddConditionalFormat().WhenLessThan(1).Fill.SetBackgroundColor(xlColor)
  45.                         worksheet.Cell(i + 2, j + 1).Style.Font.FontName = dataGridView1.Font.Name
  46.                         worksheet.Cell(i + 2, j + 1).Style.Font.FontSize = dataGridView1.Font.Size
  47.                     End If
  48.                 Next
  49.             Next
  50.  
  51.             worksheet.Columns().AdjustToContents()
  52.             workbook.SaveAs(fileName)
  53.         End If
  54.     End Sub



La riga con "Workbook()" VS me la segna come "non definita" e mi propone vari import, tra i quale scelgo "Imports Microsoft.Office.Interop.Excel"
Ma ditemi se già qui ho sbagliato! A questo punto eseguo il mio codice ed con un bottone passo il nome del DataGridView da salvare alla funzione.
Mi appare la finestra di salvataggio, premo "Salva" e mi appare questo errore, sempre per "Workbook()".

Codice sorgente - presumibilmente Delphi

  1. An unhandled exception of type 'System.Runtime.InteropServices.COMException' occurred in mscorlib.dll
  2.  
  3. Additional information: Recupero della class factory COM per il componente con CLSID {00020819-0000-0000-C000-000000000046} non riuscito a causa del seguente errore: 80040154 Interfaccia non registrata. (Eccezione da HRESULT: 0x80040154 (REGDB_E_CLASSNOTREG)).



Cercando in giro consigliano di sostituire Workbook() con Workbooks.Add() ma non ho capito come.
Ho provato anche sostituendo Workbook() con XLWorkbook() così il file viene salvato ma non mi riporta la formattazione, o almeno non quella che a me interessa, cioè il colore di sfondo delle celle...

Mi fate capire (anche con esempi) come correggere?

Grazie

Ultima modifica effettuata da dylan666 il 26/04/2021 alle 15:05
PM Quote
Avatar
dylan666 (Normal User)
Pro


Messaggi: 128
Iscritto: 08/09/2009

Segnala al moderatore
Postato alle 15:40
Lunedì, 26/04/2021
Credo di aver risolto sia sostituendo Workbook() con XLWorkbook() che modificando queste due righe:

Codice sorgente - presumibilmente C# / VB.NET

  1. Dim xlColor As XLColor = XLColor.FromColor(dataGridView1.Rows(i).Cells(j).Style.BackColor) 'al posto di SelectionBackColor
  2. worksheet.Cell(i + 2, j + 1).AddConditionalFormat().WhenEqualOrGreaterThan(0).Fill.SetBackgroundColor(xlColor) 'al posto di WhenLessThan(1)



Ma a questo punto mi sorge un nuovo quesito.
Esiste la possibilità di aggiungere al file che già esiste un foglio in più con questo metodo?

Grazie

Ultima modifica effettuata da dylan666 il 26/04/2021 alle 15:53
PM Quote
Avatar
Carlo (Member)
Guru


Messaggi: 1167
Iscritto: 29/01/2018

Segnala al moderatore
Postato alle 18:36
Lunedì, 26/04/2021
Testo quotato

Postato originariamente da dylan666:

Ma a questo punto mi sorge un nuovo quesito.
Esiste la possibilità di aggiungere al file che già esiste un foglio in più con questo metodo?

Grazie


Non credo in modo semplice.
Prima devi caricare il file excel, aggiungere il foglio e risalvare.


in programmazione tutto è permesso
PM Quote