Hola, no se si ya resolviste lo del excel, pero te comento que hace poco tuve que hacer un sistema que exporta unos datos a excel, muchos datos en realidad.
Estuve intentando usar lo del xml, pero no me gusto el formato que me estaba implementando, ademas que cuando abria el xml en excel me pedia una serie de validaciones y no me convencio mucho.
bueno entonces estuve investigando y encontre la mejor forma de hacerlo, superior a todo lo que habia visto, exporta directo a excel de una forma muy rapida.
aqui te dejo el codigo
Código:
Private Sub ExportaExcel()
Try
'Create a Recordset from all the records in the Orders table.
Dim conn As New ADODB.Connection()
Dim rs As ADODB.Recordset
conn.Open("Provider=sqloledb;user id=NOMBRE_USUARIO;password=CLAVE;data
source=SERVIDOR;Initial Catalog=BASE_DATOS")
conn.CursorLocation = ADODB.CursorLocationEnum.adUseClient
Dim mSQL As String = ""
mSQL = "SELECT * FROM NOMBRE_TABLA"
rs = conn.Execute(mSQL)
Dim app As Application
app = New Application()
If app Is Nothing Then
MsgBox("Error: creando el archivo excel")
Environment.ExitCode = 0
Exit Sub
End If
app.Visible = False
Dim workbooks As Workbooks
workbooks = app.Workbooks
Dim workbook As _Workbook
workbook = workbooks.Add(XlWBATemplate.xlWBATWorksheet)
Dim sheets As Sheets
sheets = workbook.Worksheets
Dim worksheet As _Worksheet
worksheet = CType(sheets.Item(1), _Worksheet)
If worksheet Is Nothing Then
MsgBox("Error: hoja de trabajo es nula")
Environment.ExitCode = 0
Exit Sub
End If
' 'Agrega en la primera fila el nombre de cada columna:
' Dim n As Int32
' For n = 1 To rs.Fields.Count
' oSheet.Cells(1, n).Value = rs.Fields(n - 1).Name
' Next
worksheet.Range("A2").CopyFromRecordset(rs)
app.Visible = True
Catch ex As Exception
MsgBox(ex.Message)
End Try
End Sub
Explico el codigoaqui para efectos practicos de ejemplo puse la conexion y el exportar en el mismo procedimiento.
Para poder realizar este exportado es necesario hacerlo con un recordset, osea traerse los datos de la base de datos y almacenarlos en un recordset. No se puede usar Dataset, Datatable, o cualquier otro. Esto es asi ya que la funcion del office interop solo acepta este tipo de objeto.
Es necesario e indispensable agregar las librerias Microsoft.Office.Interop.Excel y la libreria adodb que estan en las referencias.
el string de conexion debe llevar el Data Provider, para el que tu necesites lo sacas de aqui
http://www.carlprothman.net/Technology/ ... fault.aspx ahi estan todos los posibles proveedores y strings de conexion que necesites.
luego de que haces la consulta a la base de datos, y llenas el objeto recordset, creas el excel y le envias al rango el recordset asi como está, y el se encarga de todo, no importa la cantidad de registros.
worksheet.Range("A2").CopyFromRecordset(rs)solo le indicas desde que registro comienza y le envias los datos.