Oppure

Loading
26/04/21 12:55
dylan666
Ciao a tutti,
vorrei esportare il contenuto di un DataGridView in Excel con tutta la formattazione.
Ho trovato questo link:
stackoverflow.com/questions/39210329/…

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

    Public Sub ExportToExcelWithFormatting(ByVal dataGridView1 As DataGridView)
        Dim fileName As String
        Dim saveFileDialog1 As SaveFileDialog = New SaveFileDialog()
        saveFileDialog1.Filter = "xls files (*.xlsx)|*.xlsx|All files (*.*)|*.*"
        saveFileDialog1.Title = "To Excel"
        saveFileDialog1.FileName = Me.Text & " (" + DateTime.Now.ToString("yyyy-MM-dd") & ")"

        If saveFileDialog1.ShowDialog() = DialogResult.OK Then
            fileName = saveFileDialog1.FileName
            Dim workbook = New Workbook()
            Dim worksheet = workbook.Worksheets.Add(Me.Text)

            For i As Integer = 0 To dataGridView1.Columns.Count - 1
                worksheet.Cell(1, i + 1).Value = dataGridView1.Columns(i).Name
            Next

            For i As Integer = 0 To dataGridView1.Rows.Count - 1

                For j As Integer = 0 To dataGridView1.Columns.Count - 1
                    worksheet.Cell(i + 2, j + 1).Value = dataGridView1.Rows(i).Cells(j).Value.ToString()

                    If worksheet.Cell(i + 2, j + 1).Value.ToString().Length > 0 Then
                        Dim align As XLAlignmentHorizontalValues

                        Select Case dataGridView1.Rows(i).Cells(j).Style.Alignment
                            Case DataGridViewContentAlignment.BottomRight
                                align = XLAlignmentHorizontalValues.Right
                            Case DataGridViewContentAlignment.MiddleRight
                                align = XLAlignmentHorizontalValues.Right
                            Case DataGridViewContentAlignment.TopRight
                                align = XLAlignmentHorizontalValues.Right
                            Case DataGridViewContentAlignment.BottomCenter
                                align = XLAlignmentHorizontalValues.Center
                            Case DataGridViewContentAlignment.MiddleCenter
                                align = XLAlignmentHorizontalValues.Center
                            Case DataGridViewContentAlignment.TopCenter
                                align = XLAlignmentHorizontalValues.Center
                            Case Else
                                align = XLAlignmentHorizontalValues.Left
                        End Select

                        worksheet.Cell(i + 2, j + 1).Style.Alignment.Horizontal = align
                        Dim xlColor As XLColor = XLColor.FromColor(dataGridView1.Rows(i).Cells(j).Style.SelectionBackColor)
                        worksheet.Cell(i + 2, j + 1).AddConditionalFormat().WhenLessThan(1).Fill.SetBackgroundColor(xlColor)
                        worksheet.Cell(i + 2, j + 1).Style.Font.FontName = dataGridView1.Font.Name
                        worksheet.Cell(i + 2, j + 1).Style.Font.FontSize = dataGridView1.Font.Size
                    End If
                Next
            Next

            worksheet.Columns().AdjustToContents()
            workbook.SaveAs(fileName)
        End If
    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()".

An unhandled exception of type 'System.Runtime.InteropServices.COMException' occurred in mscorlib.dll

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 26/04/21 13:05
aaa
26/04/21 13:40
dylan666
Credo di aver risolto sia sostituendo Workbook() con XLWorkbook() che modificando queste due righe:

Dim xlColor As XLColor = XLColor.FromColor(dataGridView1.Rows(i).Cells(j).Style.BackColor) 'al posto di SelectionBackColor
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 26/04/21 13:53
aaa
26/04/21 16:36
Carlo
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