Exportar a Excel De DGV vb.net de manera rapida

Tengo una consulta al exportar a un excel desde mi datagridview el código es el siguiente
Dim exApp As New Microsoft.Office.Interop.Excel.Application
Dim exLibro As Microsoft.Office.Interop.Excel.Workbook
Dim exHoja As Microsoft.Office.Interop.Excel.Worksheet
Try
'Aadimos el Libro al programa, y la hoja al libro
exLibro = exApp.Workbooks.Add
exHoja = exLibro.Worksheets.Add()
' Cuantas columnas y cuantas filas?
Dim NCol As Integer = Me.dgvAmpliatorioDinamico.ColumnCount
Dim NRow As Integer = Me.dgvAmpliatorioDinamico.RowCount
For Col As Integer = 0 To NCol - 1
'Aqui recorremos los ttulos y vamos escribiendo
exHoja.Cells.Item(1, Col + 1) = Me.dgvAmpliatorioDinamico.Columns(Col).Name.ToString
For Fila As Integer = 0 To NRow - 1
'aca se van escribiendo los datos y le damos formato a cada una de las celdas.
exHoja.Cells.Item(Fila + 2, Col + 1) = Me.dgvAmpliatorioDinamico.Rows(Fila).Cells(Col).Value
Next
Next
'Titulo en negrita, Alineado al centro y que el tamao de la columna seajuste al texto
exHoja.Rows.Item(1).Font.Bold = 1
exHoja.Rows.Item(1).HorizontalAlignment = 3
exHoja.Columns.AutoFit()
exHoja.Columns.HorizontalAlignment = 2
'Aplicacin visible
exApp.Application.Visible = True
exHoja = Nothing
exLibro = Nothing
exApp = Nothing
FileClose(1)
GC.Collect()
No tengo problemas al exportar pero se demora mucho al exportar ya que tengo más o menos 40 columnas y 9000 registros. Hay alguna otra forma de hacerlo sin que demore el tiempo al exportar
Ahora yo he exportado mediante otro código, me funciona también es muy rapido todo OK. El único problema es que al crear mi instalador y llevarlo a otra pc me sale un error te dejo el código también por si puede ayudar
Public Sub DataTableToExcel(ByVal pDataTable As DataTable)
Dim vFileName As String = Path.GetTempFileName()
FileOpen(1, vFileName, OpenMode.Output)
Dim sb As String
Dim dc As DataColumn
For Each dc In pDataTable.Columns
sb &= dc.Caption & Microsoft.VisualBasic.ControlChars.Tab
Next
PrintLine(1, sb)
Dim i As Integer = 0
Dim dr As DataRow
For Each dr In pDataTable.Rows
i = 0 : sb = ""
For Each dc In pDataTable.Columns
If Not IsDBNull(dr(i)) Then
sb &= CStr(dr(i)) & Microsoft.VisualBasic.ControlChars.Tab
Else
sb &= Microsoft.VisualBasic.ControlChars.Tab
End If
i += 1
Next
PrintLine(1, sb)
Next
FileClose(1)
TextToExcel(vFileName)
End Sub
Public Sub TextToExcel(ByVal pFileName As String)
GC.Collect()
Dim vFormato As Microsoft.Office.Interop.Excel.XlRangeAutoFormat
Dim vCultura As System.Globalization.CultureInfo = System.Threading.Thread.CurrentThread.CurrentCulture
System.Threading.Thread.CurrentThread.CurrentCulture = System.Globalization.CultureInfo.CreateSpecificCulture("en-US")
Dim Exc As Microsoft.Office.Interop.Excel.Application = New Microsoft.Office.Interop.Excel.Application
Exc. Workbooks. OpenText(pFileName,,,, Microsoft. Office. Interop. Excel. XlTextQualifier. XlTextQualifierNone,, True)
Dim Wb As Microsoft.Office.Interop.Excel.Workbook = Exc.ActiveWorkbook
Dim Ws As Microsoft.Office.Interop.Excel.Worksheet = Wb.ActiveSheet
'En el ejemplo vienen otros formatos posibles
vFormato = Microsoft.Office.Interop.Excel.XlRangeAutoFormat.xlRangeAutoFormat3DEffects2
'para la cabecera
Ws. Range(Ws. Cells(1, 1), Ws. Cells(Ws. UsedRange. Rows. Count, Ws. UsedRange. Columns. Count)). AutoFormat(vFormato)
'para las celdas en general alinenando a la izquierda.
Ws.Range(Ws.Cells(2, 1), Ws.Cells(Ws.UsedRange.Rows.Count, Ws.UsedRange.Columns.Count)).HorizontalAlignment = 2
pFileName = Path.GetTempFileName.Replace("tmp", "xls")
File.Delete(pFileName)
Exc. ActiveWorkbook. SaveAs(pFileName, Microsoft. Office. Interop. Excel. XlTextQualifier. XlTextQualifierNone - 1)
Exc.Quit()
Ws = Nothing
Wb = Nothing
Exc = Nothing
GC.Collect()
If Me.dgvAmpliatorioDinamico.RowCount > -1 Then
Dim p As System.Diagnostics.Process = New System.Diagnostics.Process
p.EnableRaisingEvents = False
Process.Start("Excel.exe", pFileName)
End If
System.Threading.Thread.CurrentThread.CurrentCulture = vCultura
End Sub
En mi pc funciona OK tiene office 2007, pero en otras 2007 y 2003 office no logra funcionar correctamente. Que solución me podrías dar.

1 Respuesta

Respuesta
1
Para poder exportar de un datagrid como ya sabrás necesitas las librerías de Microsoft Office Excel solamente debes tener cuidado que version utilizas ya que dependiendo de estas es la compatibilidad que tendrá lo que exportes, ahora podrías agregar las librerías que utilizas dentro de tu instalación y que las instale independientemente de el office instalado o aunque no hubiera un office pero esto lo arregla a medias yo en tu lugar trabajaría con las librerías que vienen al instalar office 2010 tu código no cambia porque es casi igual al 2007 pero si no mal recuerdo esta ya disponen de compatibilidad para que el archivo creado pueda ser abierto con versiones anteriores de office.
Ahora por lo de la velocidad el ultimo código ya toma las columnas y las filas por rangos esto supone una mayor velocidad porque lee los registros por bloques y en tu código (el primero) lo haces por registro.
Espero te sirva lo que te comento por si acaso te dejo un ejemplo sencillo de como yo exporto el contenido de un datagrid:
Public Function GridAExcel(ByVal ElGrid As DataGridView) As Boolean
        'Creamos las variables
        Dim exApp As New Microsoft.Office.Interop.Excel.Application
        Dim exLibro As Microsoft.Office.Interop.Excel.Workbook
        Dim exHoja As Microsoft.Office.Interop.Excel.Worksheet
        Try
            'Añadimos el Libro al programa, y la hoja al libro
            exLibro = exApp.Workbooks.Add
            exHoja = exLibro.Worksheets.Add()
            ' ¿Cuantas columnas y cuantas filas?
            Dim NCol As Integer = ElGrid.ColumnCount
            Dim NRow As Integer = ElGrid.RowCount
            'Aqui recorremos todas las filas, y por cada fila todas las columnas y vamos escribiendo.
            For i As Integer = 1 To NCol
                exHoja.Cells.Item(1, i) = ElGrid.Columns(i - 1).Name.ToString
                exHoja.Cells.Item(1, i).HorizontalAlignment = 3
            Next
            For Fila As Integer = 0 To NRow - 1
                For Col As Integer = 0 To NCol - 1
                    exHoja.Cells.Item(Fila + 2, Col + 1) = ElGrid.Rows(Fila).Cells(Col).Value
                Next
            Next
            'Titulo en negrita, Alineado al centro y que el tamaño de la columna seajuste al texto
            exHoja.Name = "Game Control"
            exHoja.Rows.Item(1).Font.Bold = 1
            exHoja.Rows.Item(1).HorizontalAlignment = 3
            exHoja.Columns.AutoFit()
            'Aplicación visible
            exApp.Application.WindowState = Microsoft.Office.Interop.Excel.XlWindowState.xlMinimized
            exApp.Application.Visible = True
            exHoja = Nothing
            exLibro = Nothing
            exApp = Nothing
        Catch ex As Exception
            MsgBox(ex.Message, MsgBoxStyle.Critical, "Error al exportar a Excel")
            Return False
        End Try
        Return True
    End Function

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas