Exportar Datagridview a Excel II

Que tal amigos, extiendo un saludo a quienes me siguen en mis publicaciones y a los que solamente van de mirada decirles gracias por detenerse un momento por aquí y saber que esta pagina haya sido de utilidad. Bueno continuando con la segunda parte de  este post y para resumirles un poco era de suma utilidad entrando en tema, cuando tenemos un proyecto donde necesitamos exportar a Excel  no solo el contenido del mismo sino también su apariencia, me vi en la necesidad ocurrente de preguntarme.. "como hacer para que los colores, fuente de letra, color de la letra,..etc de un Datagridview fueran también copiados a la exportación? y asi realizar una especie de informe final que solamente seria de convertir a archivo de Microsoft Excel y ya.

Tras intentos no parecía resolverlo pero, analizando la situación un poco, me di cuenta que Excel manejaba los colores(es en donde tenia errores) en el sistema RGB y el visual studio de una manera dual es decir RGB y ARGB( son modelos de color) además existen otros tipos mas COMO CYMK etc....con esta forma tenia que extraer los valores de los colores individualmente que tenia cada parte del DatagridView e invocarlos y asignarlos el final de la exportación correspondientemente a cada lugar y cada objeto y es así que al final se pudo resolver claro que Uds podrán hallar mas formas y compactas de hacerlo mas adelante.. que da en Uds...

Mi código viene siendo así( tomando como base el código presentado en la parte I)

Public Class Form1
    Public colorcelda As New ColorDialog
    Dim colorfuente As New ColorDialog
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        'GENERAR Y RELLENAR EL DATAGRIDVIEW
        Try
            Dim n As Integer = 6 ' cualquier valor para sumar
            Dim cantidad(n) As Integer 'matriz para almacenar hasta n valores
            Dim valor As Double = 0.18 'valor de un articulo en común ....para ejemplificar
            Dim subtotal(n) As Double ' matriz que almacena los subtotales de cada compra
            Dim suma As Double 'total de la suma de la columna subtotal
            For i As Integer = 0 To n - 1
                cantidad(i) = i 'Val(InputBox("Ingresar cantidad Nº" & i + 1)) 'Entrada manual
            Next
            For i As Integer = 0 To n - 1
                subtotal(i) = cantidad(i) * valor
                suma = suma + subtotal(i)
            Next
            grid1.Rows.Add(n + 1) 'numero de filas del grid
            For r As Integer = 0 To n - 1
                grid1.Item(0, r).Value = r + 1
                grid1.Item(1, r).Value = Format(cantidad(r), "0.00")
                grid1.Item(2, r).Value = Format(valor, "0.00")
                grid1.Item(3, r).Value = Format(subtotal(r), "0.00")
                grid1.Item(2, n).Value = "TOTALES="
                grid1.Item(3, n).Value = Format(suma, "0.00")
            Next
        Catch ex As KeyNotFoundException
            MessageBox.Show("Error de concurrencia:" & vbCrLf & ex.Message)
        End Try
    End Sub

    Private Sub BtnExcel_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BtnExcel.Click

        'Crer dataset para exportar
        Dim dset As New DataSet
        'add table to dataset
        dset.Tables.Add()
        'agregar columnas a la tabla
        For i As Integer = 0 To grid1.ColumnCount - 1
            dset.Tables(0).Columns.Add(grid1.Columns(i).HeaderText)
        Next
        'agregar filas a la tabla
        Dim dr1 As DataRow
        For i As Integer = 0 To grid1.RowCount - 1
            dr1 = dset.Tables(0).NewRow
            For j As Integer = 0 To grid1.Columns.Count - 1
                dr1(j) = grid1.Rows(i).Cells(j).Value
            Next
            dset.Tables(0).Rows.Add(dr1)
        Next
        Dim excel As New Microsoft.Office.Interop.Excel.ApplicationClass
        Dim wBook As Microsoft.Office.Interop.Excel.Workbook
        Dim wSheet As Microsoft.Office.Interop.Excel.Worksheet
        wBook = excel.Workbooks.Add()
        wSheet = wBook.ActiveSheet()
        wSheet.Name = "Ejemplo"
        ' agregando las caracteristicas a la salidad de excel
        wSheet.Range("A2:D8").Font.Name = grid1.DefaultCellStyle.Font.Name
        'Obteniendo y almacenando los colores  RGB del texto de la grid
        Dim coloresRGB(3) As Integer
        coloresRGB(1) = grid1.DefaultCellStyle.ForeColor.R
        coloresRGB(2) = grid1.DefaultCellStyle.ForeColor.G
        coloresRGB(3) = grid1.DefaultCellStyle.ForeColor.B
        wSheet.Range("A2:D8").Font.Color = RGB(coloresRGB(1), coloresRGB(2), coloresRGB(3))
        'Obteniendo y almacenando los colores  RGB del relleno  de celda de la grid
        Dim colorRGBR(3) As Integer
        colorRGBR(1) = grid1.DefaultCellStyle.BackColor.R
        colorRGBR(2) = grid1.DefaultCellStyle.BackColor.G
        colorRGBR(3) = grid1.DefaultCellStyle.BackColor.B
        wSheet.Range("A2:D8").Interior.Color = RGB(colorRGBR(1), colorRGBR(2), colorRGBR(3))

        ' Rellena los datos de la grid en la grid de Excel

        Dim dt As System.Data.DataTable = dset.Tables(0)
        Dim dc As System.Data.DataColumn
        Dim dr As System.Data.DataRow
        Dim colIndex As Integer = 0
        Dim rowIndex As Integer = 0
        For Each dc In dt.Columns
            colIndex = colIndex + 1
            excel.Cells(1, colIndex) = dc.ColumnName
        Next
        For Each dr In dt.Rows
            rowIndex = rowIndex + 1
            colIndex = 0
            For Each dc In dt.Columns
                colIndex = colIndex + 1
                excel.Cells(rowIndex + 1, colIndex) = dr(dc.ColumnName)
            Next
        Next
        wSheet.Columns.AutoFit()
        Dim blnFileOpen As Boolean = False
        Try
        Catch ex As Exception
            blnFileOpen = False
        End Try
        excel.Visible = True
    End Sub

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Try
            colorcelda.ShowDialog()
            With colorcelda
                grid1.DefaultCellStyle.BackColor = colorcelda.Color
            End With
        Catch ex As Exception
        End Try
    End Sub

    Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click

        Try

            colorfuente.ShowDialog()

            With colorfuente
                grid1.DefaultCellStyle.ForeColor = colorfuente.Color
            End With
        Catch ex As Exception
        End Try

    End Sub

Una captura ejecutándose


y luego de Exportar a Excel


Y eso es todo, les dejo el link de mi proyecto y espero sus comentarios y sugerencias gracias y nos vemos en otra entrega.



Comentarios

Entradas populares de este blog

Imprimir directamente ReportViewer a impresora predeterminada

Metodo Iterativo Gauss-Seidel en Visual Basic

DevComponents DotnetBar 12.5.0.2