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.
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 de kusanagixi
1