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
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
Publicar un comentario