C# Cargar Datos Desde Hoja Excel a Base de Datos MSSQL


Monetize your website traffic with yX Media
En muchas ocasiones, cuando creamos aplicaciones que manejan bases de datos de tipo SQL, el cliente nos pregunta si no podemos cargar los datos de la base de datos desde una Hoja de Cálculo Excel para agilizar la carga de datos, ya que él la tiene en ese formato.

Nuestras aplicaciones pueden tener como valor agregado la capacidad de poder importar datos desde Excel.

Este es precisamente el código que les traigo a continuación en C#:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Data.OleDb;
//Agregar referencia a esta DLL si va cargar los datos de la tabla de Excel a SQL Server
using dBData;


namespace ImportarExcel
{
    public partial class FrmImportar : Form
    {
        public FrmImportar()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            //Creamos un objeto OpenDialog que es un cuadro de dialogo para buscar archivos
            OpenFileDialog dialog = new OpenFileDialog();
            dialog.Filter = "Archivos de Excel (*.xls;*.xlsx)|*.xls;*.xlsx"; //Le indicamos el tipo de filtro en este caso que busque
            //solo los archivos excel

            dialog.Title = "Seleccione el archivo de Excel";//Le damos un titulo a la ventana

            dialog.FileName = string.Empty;//Inicializamos con vacio el nombre del archivo

            //Si al seleccionar el archivo damos Ok
            if (dialog.ShowDialog() == System.Windows.Forms.DialogResult.OK)
            {
                //El nombre del archivo sera asignado al textbox
                txtArchivo.Text = dialog.FileName;
                string hoja = "Plan1"; //La variable hoja tendra el valor del textbox donde colocamos el nombre de la hoja
                LLenarGrid(txtArchivo.Text, hoja); //Se manda a llamar al metodo

                DGV1.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill; //Se ajustan las
                //columnas al ancho del DataGridview para que no quede espacio en blanco (opcional)
            }

        }

        private void LLenarGrid(string archivo, string hoja)
        {
            //declaramos las variables         
            OleDbConnection conexion = null;
            DataSet dataSet = null;
            OleDbDataAdapter dataAdapter = null;
            
            string consultaHojaExcel = "Select * from [" + hoja + "$]";

            //esta cadena es para archivos excel 2007 y 2010
            //string cadenaConexionArchivoExcel = "provider=Microsoft.ACE.OLEDB.12.0;Data Source='" + archivo + "';Extended Properties=Excel 12.0;";
            //string cadenaConexionArchivoExcel = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + archivo + "';Extended Properties=Excel 8.0;";

            //para archivos de 97-2003 usar la siguiente cadena
            string cadenaConexionArchivoExcel = "provider=Microsoft.Jet.OLEDB.4.0;Data Source='" + archivo + "';Extended Properties=Excel 8.0;";

            //Validamos que el usuario ingrese el nombre de la hoja del archivo de excel a leer
            if (string.IsNullOrEmpty(hoja))
            {
                MessageBox.Show("No hay una hoja para leer");
            }
            else
            {
                try
                {
                    //Si el usuario escribio el nombre de la hoja se procedera con la busqueda
                    conexion = new OleDbConnection(cadenaConexionArchivoExcel);//Creamos la conexion con la hoja de excel
                    conexion.Open(); //Abrimos la conexion
                    dataAdapter = new OleDbDataAdapter(consultaHojaExcel, conexion); //Traemos los datos de la hoja y las guardamos en un dataAdapter
                    dataSet = new DataSet(); // Creamos la instancia del objeto DataSet
                    dataAdapter.Fill(dataSet, hoja);//Llenamos el dataset
                    DGV1.DataSource = dataSet.Tables[0]; //Le asignamos al DataGridView el contenido del dataSet
                    conexion.Close();//Cerramos la conexion
                    DGV1.AllowUserToAddRows = false;//Eliminamos la ultima fila del datagridview que se autoagrega
                }
                catch (Exception ex)
                {
                    //En caso de haber una excepcion que nos mande un mensaje de error:
                    //MessageBox.Show("Error, Verificar el archivo o el nombre de la hoja", ex.Message);
                    MessageBox.Show(ex.ToString());
                }
            }
        }

        private void BotCargarDatos_Click(object sender, EventArgs e)
        {
            string CC = @"Data Source=NombreServidor;Initial Catalog=NombreBaseDeDatos;Persist Security Info=True;User ID=Usuario;Password=password";
            for (int i = 0; i < DGV1.Rows.Count; i++)
            {
                //Si va a insertar los datos:
                //Datos.Insertar(CC, "NombreTabla", "Contrato, Filial", "'" + DGV1["Contrato",i].ToString() + "', '" + DGV1["Filial",i].ToString() + "'"
                
                //Si va a actualizar los datos
                string SET = "Contrato = '" + DGV1["Contrato", i].Value.ToString().Trim() + "', Filial = '" + DGV1["Filial", i].Value.ToString().Trim() + "'";
                string Condicion = "Contenedor = '" + DGV1["Container", i].Value.ToString().Trim() + "' AND Activo = 'True' AND BCampo4 = 'False' OR BCampo4 IS NULL";
                Datos.Actualizar(CC, "NombreTabla", SET, Condicion);
                if (Datos.Mensaje != "")
                {
                    MessageBox.Show(Datos.Mensaje);
                }
            }
            MessageBox.Show("Finalizado");
            
        }

    }
}



Código completo listo para descargar aqui:

 Cargar datos de Excel a SQL
Enlace alternativo:

 Cargar datos de Excel a SQL