Leer libros de Excel sin un manejador de base de datos

En esta primera parte vamos a ver cómo incorporar información de un libro de Excel a nuestro Windows Form, al igual de obtener el nombre del libro, extensión y mostrar su contenido en un DataGridView.

El objetivo de este tutorial es permitir a quienes deseen generar su propia herramienta de trabajo sin necesidad de tener grandes conocimientos de programación y por, sobre todo, sin depender de un manejador de base de datos.

Requisitos:

  • Visual Studio 2012, 2013 o 2015 en cualquiera de sus versiones.
  • Contar con el Access Database Engine instalado.
  • Un libro de Excel de prueba.

 

Creamos un nuevo proyecto en Visual Studio, en mi caso VS12 Professional

  1. Nuevo proyecto
  2. Windows Form Application
  3. Damos un nombre al proyecto
  4. Damos clic en guardar

excelp1

Creamos un diseño base para nuestro software

  1. Tomamos de la esquina inferior de nuestro form y jalamos hacia afuera para hacer de este más grande.
  2. Agregamos un OpenFileDialog de nuestra caja de herramientas
    1. En nuestra caja de herramientas o toolbox, teclea “file” o “file” para filtrar los controles.
    2. En la sección All Windows Forms toma el control OpenFileDialog y arrastra hacia el recuadro gris y suelta el control. Te aparecerá de la siguiente manera.
    3. Ahora, selecciona el control, da clic en el trueno de la sección propiedades y en dónde dice “FileOk” da doble clic para generar un evento.

excelp3

3. Añade un TapControl

  1. De la caja de herramientas busca “tap”
  2. En los resultados te saldrá el control “TapControl”, mismo que debes arrastrar hacie el recuadro gris, suelta el control, toma de la esquina inferior y jala hacia atrás para hacer de este mucho más grande.

excelp4

Para que el software se vea más organizado usaremos la primera pestaña para subir nuestro libro de Excel y la segunda pestaña para realizar los cálculos pertinentes.

Subiendo nuestro libro de Excel

Diseño de interfaz

  • Agrega un botón con el texto “Subir archivo”
    1. Name: Btnsubir
    2. Text: Subir archivo
  • Añade un checkBox el cual será el que nos indicará si la primera fila que contiene nuestra tabla del libro de Excel, contiene el nombre de la columna.
    1. Name: rbHeaderYes
    2. Text: Si
  • Para esta ocasión vamos agregar 3 labels
    1. Label para conocer el nombre del archivo (Name: lblnombre)
    2. Label para conocer la extención del archivo (Name: lblextension)
    3. Label para conocer el estatus (Name: lblestatus)

excelp5

  • Añadimos al botón el evento clic
    1. Seleccionamos el botón
    2. Damos clic en el trueno que aparece en el panel de propiedades
    3. Dónde dice clic, damos doble clic en el espacio en blanco para que se nos auto genere el evento, una vez generado el evento, nos re direccionará a Form1.cs

excelp6

Code Time

En este ejemplo veremos cómo preparar nuestro software para que pueda ser utilizado con casi cualquier versión de Excel ya sea con la extensión .xls o .xlsx, para ello realizamos la conexión Excel usando OLEDB de la siguiente manera.

  • En la ventaja Form1.cs agregamos dos variables:
    1. private string Excel03ConString = “Provider=Microsoft.Jet.OLEDB.8.0;Data Source={0};Extended Properties=’Excel 8.0;HDR={1}'”;
    2. private string Excel07ConString = “Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0};Extended Properties=’Excel 12.0;HDR={1}'”;
  • En el evento clic del botón agrega dentro de las llaves: ShowDialog();
  • En la parte superior de nuestro Forms1.cs agregamos las siguientes librerías para evitar errores.

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Data.OleDb;

using System.Drawing;

using System.IO;

using System.Linq;

using System.Text;

using System.Threading.Tasks;

using System.Windows.Forms;

  • En el evento openFileDialog1_FileOk declaramos las siguientes variables
    1. string archivo = openFileDialog1.FileName; (la cual nos permitirá conocer los datos del libro en el que se trabajará)
    2. string extension = Path.GetExtension(archivo); (Nos dará la extensión del libro)
    3. string cabecera = rbHeaderYes.Checked ? “YES” : “NO”; (Nos indicará si la primer fila del libro contiene el nombre de la columna)
    4. string conStr, sheetName;
    5. DataTable dt = new DataTable(); (Creamos una tabla relacional en memoria)
    6. conStr = string.Empty; (Le asignamos un valor a la variable conStr)
  • Después verificamos que tipo de extensión tiene el libro (.xls o .xlsx) de la siguiente manera.

switch (extension)

{

 

case “.xls”: //Excel 97-03

conStr = string.Format(Excel03ConString, archivo, cabecera);

break;

 

case “.xlsx”: //Excel 07

conStr = string.Format(Excel07ConString, archivo, cabecera);

break;

}

  • Obtenemos el nombre de la primera pestaña del libro de Excel que será con la que vamos a trabajar.

using (OleDbConnection con = new OleDbConnection(conStr))

{

using (OleDbCommand cmd = new OleDbCommand())

{

cmd.Connection = con;

con.Open();

DataTable dtExcelSchema = con.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null);

sheetName = dtExcelSchema.Rows[0][“TABLE_NAME”].ToString();

con.Close();

}

}

  • Asignamos el nombre del libro y la extensión a sus respectivos labels

lblnombre.Text = sheetName;

lblextension.Text = extension;

  • Leemos los datos de la primera pestaña del libro de Excel

using (OleDbConnection con = new OleDbConnection(conStr))

{

using (OleDbCommand cmd = new OleDbCommand())

{

using (OleDbDataAdapter oda = new OleDbDataAdapter())

{

cmd.CommandText = “SELECT * From [” + sheetName + “]”;

 

cmd.Connection = con;

con.Open();

oda.SelectCommand = cmd;

oda.Fill(dt);

con.Close();

 

}

}

}

Ahora bien, ya sabemos que extensión es la del libro, su nombre y ya leímos su contenido, pero nos falta dónde vamos a ver la información contenida en dicho libro, para ello nos vamos al diseño y damos clic en la pestaña 2.

  • De nuestra barra de herramientas buscamos DataGridView, arrastramos y soltamos en nuestra interfaz.
    1. Name: dataGridView1

excelp7

  • Para poder ver la información de nuestro libro de Excel, nos regresamos a Form1.cs y justo después de con.Close(); agregamos la siguiente línea de código.

dataGridView1.DataSource = dt;

  • Para culminar con esta sección enseguida de la línea de código del paso 10, añadimos el estatus:

lblestatus.Text = “Archivo agregado con éxito”;

 Y listo hemos terminado la primera sección, ahora sí corremos nuestro sistemita y obtendremos los siguientes resultados

El pase de diapositivas requiere JavaScript.

Código completo

private string Excel03ConString = “Provider=Microsoft.Jet.OLEDB.8.0;Data Source={0};Extended Properties=’Excel 8.0;HDR={1}'”;
private string Excel07ConString = “Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0};Extended Properties=’Excel 12.0;HDR={1}'”;

public Form1()
{
InitializeComponent();
}

private void Btnsubir_Click(object sender, EventArgs e)
{
openFileDialog1.ShowDialog();
}

private void openFileDialog1_FileOk(object sender, CancelEventArgs e)
{
try
{
string archivo = openFileDialog1.FileName;
string extension = Path.GetExtension(archivo);
string cabecera = rbHeaderYes.Checked ? “YES” : “NO”;
string conStr, sheetName;
DataTable dt = new DataTable();
conStr = string.Empty;
switch (extension)
{

case “.xls”: //Excel 97-03
conStr = string.Format(Excel03ConString, archivo, cabecera);
break;

case “.xlsx”: //Excel 07
conStr = string.Format(Excel07ConString, archivo, cabecera);
break;
}

//Obteniendo el nombre de la primer fila.
using (OleDbConnection con = new OleDbConnection(conStr))
{
using (OleDbCommand cmd = new OleDbCommand())
{
cmd.Connection = con;
con.Open();
DataTable dtExcelSchema = con.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null);
sheetName = dtExcelSchema.Rows[0][“TABLE_NAME”].ToString();
con.Close();
}
}
lblnombre.Text = sheetName;
lblextension.Text = extension;

//Leyedo la información de la primer pestaña.
using (OleDbConnection con = new OleDbConnection(conStr))
{
using (OleDbCommand cmd = new OleDbCommand())
{
using (OleDbDataAdapter oda = new OleDbDataAdapter())
{
cmd.CommandText = “SELECT * From [” + sheetName + “]”;

cmd.Connection = con;
con.Open();
oda.SelectCommand = cmd;
oda.Fill(dt);
con.Close();
dataGridView1.DataSource = dt;

lblestatus.Text = “Archivo agregado con éxito”;
}
}
}
}
catch (Exception ex)
{
lblestatus.Text = “Error, ” + ex.ToString();
}
}

Descargar proyecto

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s