Importar Excel a SQL usando ASP.NET 2.0 y SqlBulkCopy

Escrito por Programador ASP clásico en Código ASP.NET


Nos encontramos recientemente con un reto en el que cliente quería importar los datos de un archivo de Excel a un servidor SQL y posteriormente actualizar unas tablas. Esto es sencillo a través del Enterprise Manager, pero es más difícil cuando el cliente lo quiere hacer con un back-end de su aplicación, para que pueda hacerlo por sí mismo a través de un formulario web.

Si bien hay numerosos tutoriales para exportar datos en formato Excel, no hay muchos sobre cómo importarlos.

Unicamente se ha dejado la parte de código que importa los datos desde Excel. En este ejemplo se asume que el archivo "prueba.xls" ya está en su servidor en la misma ubicación que este script.

Este código utiliza la clase SqlBulkCopy nuevo en ASP.NET 2.0 que te permite copiar fácilmente cantidades masivas de datos de una fuente a otra.


Imports System.Data
Imports System.Data.OleDb
Imports System.Data.SqlClient
Imports System.Web.Configuration

'Declare Variables - Edit these based on your particular situation
Dim sSQLTable As String = "TempTableForExcelImport"
Dim sExcelFileName As String = "myExcelFile.xls"
Dim sWorkbook As String = "[WorkbookName$]"

'Create our connection strings
Dim sExcelConnectionString As String = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & Server.MapPath(sExcelFileName) & ";Extended Properties=""Excel 8.0;HDR=YES;"""
Dim sSqlConnectionString As String = WebConfigurationManager.ConnectionStrings("MyConnectionString").ToString

'Execute a query to erase any previous data from our destination table
Dim sClearSQL = "DELETE FROM " & sSQLTable
Dim SqlConn As SqlConnection = New SqlConnection(sSqlConnectionString)
Dim SqlCmd As SqlCommand = New SqlCommand(sClearSQL, SqlConn)
SqlConn.Open()
SqlCmd.ExecuteNonQuery()
SqlConn.Close()

'Series of commands to bulk copy data from the excel file into our SQL table
Dim OleDbConn As OleDbConnection = New OleDbConnection(sExcelConnectionString)
Dim OleDbCmd As OleDbCommand = New OleDbCommand(("SELECT * FROM " & sWorkbook), OleDbConn)
OleDbConn.Open()
Dim dr As OleDbDataReader = OleDbCmd.ExecuteReader()
Dim bulkCopy As SqlBulkCopy = New SqlBulkCopy(sSqlConnectionString)
bulkCopy.DestinationTableName = sSQLTable
bulkCopy.WriteToServer(dr)
OleDbConn.Close()

No se aplicó ninguna función de control de errores para dejar el ejemplo más claro, pero sería una buena idea utilizar un bloque Try / Catch para manejar las excepciones.

A continuación se muestra un ejemplo para subir el archivo prueba.xls al servidor:




<p><asp:FileUpload id="FileUpload1"
runat="server">
</asp:FileUpload></p>

<p><asp:Button id="UploadBtn"
Text="Upload File"
OnClick="UploadBtn_Click"
runat="server">
</asp:Button></p>

<p><asp:Label ForeColor="red" id="UploadStatusLabel"
runat="server">
</asp:Label></p>

Protected Sub UploadBtn_Click(ByVal sender As Object, ByVal e As System.EventArgs)
‘ Specify the path on the server to’ save the uploaded file to.
Dim savePath As String = "C:SomeFolder"

‘ Before attempting to save the file, verify’ that the FileUpload control contains a file.
If (FileUpload1.HasFile) Then

‘ Get the name of the file to upload.
Dim fileName As String = Server.HtmlEncode(FileUpload1.FileName)

‘ Get the extension of the uploaded file.
Dim extension As String = System.IO.Path.GetExtension(fileName)

‘ Allow only files with .xls extensions’ to be uploaded.
If (extension = ".xls") Then

‘ Append the name of the file to upload to the path.
savePath += "myfile.xls"

FileUpload1.SaveAs(savePath)

‘ Notify the user that their file was successfully uploaded.
UploadStatusLabel.Text = "Your file was uploaded successfully."
Else
‘ Notify the user why their file was not uploaded.
UploadStatusLabel.Text = "Error: Only Excel files are allowed"
End If

Else
‘ Notify the user that a file was not uploaded.
UploadStatusLabel.Text = "You did not specify a file to upload."
End If

End Sub

Publicado el 02/01/2012 a las 09:11:24 hrs. | 2708 visitas.

Subir
Web hosting by Somee.com