Cargar Informacion desde Excel a un Grid y desde Grid a Sql Server
Fecha: 25/Jul/2005 (21-07-05)
|
Introducción:
En sentido general la mayoria de los relacionados con .net sabemos utilizar ado.net para el manejo de información. Esto quiere decir, que de alguna forma podemos insertar información a una base de datos de casi cualquier fuente. En caso de que la fuente de datos sea un archivo de texto, por lo general se utiliza un DTS en SQL server para cargar el archivo a la base de datos de nuestra organización. Pero como buenos proveedores de servicios deseamos brindarle la oportunidad a nuestros captadores de clientes que carguen la información de estos nuevos clientes, desde donde sea que se encuentren en el mundo ,en nuestro ejemplo, utilizando un archivo de excel. Qué ventajas tiene hacer esto, si podemos ponerle campos para que digiten la información en una página? La respuesta es simple, procesamiento por batch. Veamos en que consiste!!!
Creación de Ejemplo:
Lo primero es crear un proyecto asp.net y agregar los siguientes componentes al webform que se crea automático o en caso de preferirlo agregarlos al que desee:
2- Button uno: (uno para cargar el archivo de excel al grid y otro para descargar el grid a la base de datos, ponle algún nombre alucivo de lo que hacen).
1- DataGrid que es donde se va a mostrar la información que carguen desde excel, esto con la finalidad de que verifiquen si han cargado el archivo con la información correcta.
1- TextBox para indicar qué sheet u hoja de excel que contiene la información que deseamos cargar.
1- Input de los componentes html. En lo personal, voy a la pestaña html de mi webform y lo escribo allá con las siguientes propierdades: INPUT id="File1" type="file" name="File1" runat="server"
3- Label (uno para indicar cualquier error que se produzca en los procesos de carga y descarga y los otros dos como textos descriptivos para el input de cargar el archivo y el otro para indicar que debe escribir el nombre del sheet u hoja que contiene la información a cargar en el archivo de excel.
A Continuación el código que nos permite realizar dichas Operaciones.
Imports System.IO Imports System.Data.OleDb Imports System.Diagnostics Imports System.Data.SqlClient Imports System.Configuration Imports Microsoft.ApplicationBlocks.Data Imports Common Public Class CargarClientesPorBatch Inherits System.Web.UI.Page Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load 'Put user code to initialize the page here End Sub 'Este es un dataset que utilizaremos para cargarle la informacion al Datagrid y a la base de 'datos SQL Private ds As New DataSet 'Declaramos la cadena de conexión a la base de datos. Si se fijan notaran que el usuario 'utilizado para la conexión a la base de datos en nuestro ejemplo, no es el acostumbrado 'sa y seguro se preguntaran por qué? Este usuario es muy codiciado por los hackers, por ser 'la máxima autoridad en nuestra base de datos, por lo cual poner sa para un simple insert 'es un error de seguridad Gravisimo "Ojo con esto". Private mconnstr As String = ("server=(local);database=Clientes;uid=UserInserta;pwd=Humuradama") Private Function Cargar(ByVal procedure As String, ByVal parametros() As Object) 'Esta es una clase que trae el NameSpaces Microsoft.ApplicationBlocks.Data, que nos 'permite manejar informacion de una base de datos de forma mas rápida y con menos objetos 'que la forma standard. SqlHelper.ExecuteNonQuery(mconnstr, CommandType.StoredProcedure, procedure, parametros) End Function Private Function CargcarArchivoExcel(ByVal ruta As String) Try Dim strconn As String strconn = "Provider=Microsoft.Jet.Oledb.4.0; data source= " & ruta & ";Extended properties=""Excel 8.0;hdr=yes;imex=1""" Dim mconn As New OleDbConnection(strconn) Dim ad As New OleDbDataAdapter("Select * from [" & txtsheet.Text & "$]", mconn) 'txtsheet deja a merced del usuario definir en que hoja buscar la información mconn.Open() ad.Fill(ds) mconn.Close() 'Una vez cargado nuestro dataset con la información desde excel entonces llenamos 'el Datagrid con dicha información DataGrid1.DataSource = ds.Tables(0).DefaultView DataGrid1.DataBind() Catch ex As OleDbException errores.Text = "Error Cargando el Archivo de Excell " & ex.Message End Try End Function Private Sub btcagar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btcagar.Click 'Esto es para obligar al usuario a decir de donde cargar la información, pues si lo deja 'vacio esto provocaría una excepción como podrán imaginar. If txtsheet.Text.Trim = "" Then errores.Text = "Debe Especificar el Nombre de la hoja en del archivo de excel de la que quiere tomar la información" Exit Sub End If 'file1 es el input que hemos definido en el html del webform 'la propiedad value() nos retorna la cadena de la ruta que has cargado al elegir el 'archivo CargcarArchivoExcel(File1.Value()) txtsheet.Text = "" End Sub Private Sub btprocesar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btprocesar.Click 'una vez verificado que esta es la informacion que deseamos cargar procedemos descargarla 'a la base de datos de SQL server 2000 en este caso. For Each dgl As DataGridItem In DataGrid1.Items 'recorremos cada elemento contenido en el DataGrid y cargamos la información recogida en 'un arreglo de Object 'en este ejemplo suponemos que solo tomanos el nombre, direccion y telefono de los nuevos 'clientes y esta información esta contenida en el DataGrid en este mismo orden Dim p() As Object = {dgl.Cells(0).Text, dgl.Cells(1).Text, dgl.Cells(2).Text} Try 'Llamamos nuestra función de cargar que hemos definido anteriormente 'le pasamos el nombre del Store Procedure que se encarga de dichos fines en nuestra 'empresa y los parametros que hemos conseguido de la fila actual en el DataGrid Cargar("SPC_InsertCliente", p) errores.Text = "Los Nuevos Clientes Fueron Cargados al Sistema" Catch ex As Exception errores.Text = "Error Cargando Clientes " & ex.Message End Try Next 'Una vez cargados al sistema, liberamos recursos y limpiamos la Textbox con el sheet 'a cargar DataGrid1.DataSource = Nothing DataGrid1.DataBind() txtsheet.Text = "" End Sub End Classlisto, con estas sencillas operaciones le facilitamos la vida a nuestros representantes a donde quiera que se encuentren.
Conclusión:
Como hemos visto, el Dotnet nos permite hacer un conjunto de maniobras para manejar informacion, lo que nos permite desarrollar herramientas de trabajo eficaces en poco tiempo. En lo personal estas pocas lineas de código me han resuelto un problemita en el trabajo y deseado compartirlo con ustedes por si necesitan en algún momento auxiliarse de un ejemplo práctico del tema.