Cargar Informacion desde Excel a un Grid y desde Grid a Sql Server

 

Fecha: 25/Jul/2005 (21-07-05)
Autor: Príapo Nicolás Rodríguez Terrero (República Dominicana, sagara_vg@yahoo.com)

 


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 Class

listo, 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.


ir al índice