trabajar con excel desde aplicación .net

01/01/2010 - 23:54 por leonardo | Informe spam
hola, feliz año nuevo
la cuestión es la siguiente: tengo datos en una hoja de excel (filas de
datos con varias columnas); necesito extraer dichos datos para trabajar
con ellos, en una base de datos acces.
O sea, el usuario datos en hojas de excel que debo copiar y pegar en mi
aplicación (no tengo claro dónde, en qué control) ¿idea? y luego esos
datos los pondría en la tabla correspondiente de la base de datos, para
luego operar con ellos.
Si no me expliqué bien perdón, puedo ampliar a partir de vuestras dudas.
Gracias
Leonardo

Preguntas similare

Leer las respuestas

#1 SoftJaén
02/01/2010 - 08:35 | Informe spam
"leonardo" escribió:

O sea, el usuario datos en hojas de excel que debo copiar y pegar en mi
aplicación (no tengo claro dónde, en qué control) ¿idea? y luego esos
datos los pondría en la tabla correspondiente de la base de datos, para
luego operar con ellos.



Hola, Leonardo:

¿Y para qué quieres copiar/pegar los datos de la hoja de Excel en un
control, cuando puedes exportarlos directamente al archivo de Access?

El siguiente ejemplo muestra como crear una nueva tabla en el archivo de
Access con los datos existentes en la Hoja1 de un archivo cualquiera de
Excel:

using System.Data.OleDb;

// Configuramos una conexión OleDb con el
// libro de trabajo de Excel.
//
string connString = "Provider=Microsoft.Jet.OLEDB.4.0;" +
@"Data Source=C:\Mis documentos\Libro1.xls;"
+
"Extended Properties='Excel 8.0;'";

using (OleDbConnection cnn = new OleDbConnection(connString))
{
try
{

// Creamos el comando para ejecutar la
// consulta SQL de creación de tabla.
//
string sql = "SELECT * INTO TablaExcel " +
@"IN 'C:\Mis documentos\Bd1.mdb' " +
"FROM [Hoja1$]";

OleDbCommand cmd = new OleDbCommand(sql, cnn);

// Abrimos la conexión
//
cnn.Open();

// Ejecutamos el comando
//
int n = cmd.ExecuteNonQuery();

// Obtenemos los registros afectados
//
MessageBox.Show(n.ToString());

}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}

Si todo ha ido bien, ya estás en disposición de operar con los datos desde
la propia base de datos de Access.

Un saludo y ¡Feliz Año Nuevo!

Enrique Martínez
[MS MVP - VB]

Nota informativa: La información contenida en este mensaje, así como el
código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin
garantías de ninguna clase, y no otorga derecho alguno. Usted asume
cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o
sugerido en el presente mensaje.
Respuesta Responder a este mensaje
#2 leonardo
02/01/2010 - 18:05 | Informe spam
muchas gracias enrique
el copiar/pegar es por la forma en la que el usuario maneja los datos en
la planilla de excel, pero está claro que debería parametrizar la forma
en la que debe trabajar para hacer el proceso más automático.
Ahora ¿hay forma de hacer que se pueda elegir la hoja del libro? esto es
para evitar el error de que los datos no estén en la hoja
pre-establecida y sí en la elegida?
Ya me pongo a probar el código y comento qué me he encontrado
gracias
leonardo

SoftJaén escribió:
"leonardo" escribió:

O sea, el usuario datos en hojas de excel que debo copiar y pegar en
mi aplicación (no tengo claro dónde, en qué control) ¿idea? y luego
esos datos los pondría en la tabla correspondiente de la base de
datos, para luego operar con ellos.



Hola, Leonardo:

¿Y para qué quieres copiar/pegar los datos de la hoja de Excel en un
control, cuando puedes exportarlos directamente al archivo de Access?

El siguiente ejemplo muestra como crear una nueva tabla en el archivo de
Access con los datos existentes en la Hoja1 de un archivo cualquiera de
Excel:

using System.Data.OleDb;

// Configuramos una conexión OleDb con el
// libro de trabajo de Excel.
//
string connString = "Provider=Microsoft.Jet.OLEDB.4.0;" +
@"Data Source=C:\Mis
documentos\Libro1.xls;" +
"Extended Properties='Excel 8.0;'";

using (OleDbConnection cnn = new OleDbConnection(connString))
{
try
{

// Creamos el comando para ejecutar la
// consulta SQL de creación de tabla.
//
string sql = "SELECT * INTO TablaExcel " +
@"IN 'C:\Mis documentos\Bd1.mdb' " +
"FROM [Hoja1$]";

OleDbCommand cmd = new OleDbCommand(sql, cnn);

// Abrimos la conexión
//
cnn.Open();

// Ejecutamos el comando
//
int n = cmd.ExecuteNonQuery();

// Obtenemos los registros afectados
//
MessageBox.Show(n.ToString());

}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}

Si todo ha ido bien, ya estás en disposición de operar con los datos
desde la propia base de datos de Access.

Un saludo y ¡Feliz Año Nuevo!

Respuesta Responder a este mensaje
#3 SoftJaén
02/01/2010 - 21:15 | Informe spam
"leonardo" preguntó:

¿hay forma de hacer que se pueda elegir la hoja del libro? esto es para
evitar el error de que los datos no estén en la hoja pre-establecida y sí
en la elegida?



¡Hombre! Yo te he puesto el clásico ejemplo que utiliza el nombre por
defecto de las hojas del archivo de Excel. ¿Que tu hoja se llama Datos de
Clientes? Entonces la consulta SQL se quedaría de la siguiente manera:

string sql = "SELECT * INTO TablaExcel " +
@"IN 'C:\Mis documentos\Bd1.mdb' " +
"FROM [Datos de Clientes$]";

Fíjate que SIEMPRE que utilices el nombre de una hoja de un libro de trabajo
de Excel, tienes que encerrar el nombre entre corchetes y acabado con el
signo $. ¿OK?

Enrique Martínez
[MS MVP - VB]

Nota informativa: La información contenida en este mensaje, así como el
código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin
garantías de ninguna clase, y no otorga derecho alguno. Usted asume
cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o
sugerido en el presente mensaje.
Respuesta Responder a este mensaje
#4 leonardo
02/01/2010 - 23:37 | Informe spam
eso estaba claro, me referí a un cuadro de diálogo que permita buscar el
archivo y allí mismo la hoja correspondiente.
así que la consulta sería con los parámetros correspondiente a la
ubicación del archivo de excel y la hoja.
De todas formas agradezco la ayuda, que es suficiente, investigaré la
forma de hacerlo y cuando lo tenga encaminado te aviso para que veas a
lo que me refería.
muchísimas gracias

SoftJaén escribió:
"leonardo" preguntó:

¿hay forma de hacer que se pueda elegir la hoja del libro? esto es
para evitar el error de que los datos no estén en la hoja
pre-establecida y sí en la elegida?



¡Hombre! Yo te he puesto el clásico ejemplo que utiliza el nombre por
defecto de las hojas del archivo de Excel. ¿Que tu hoja se llama Datos
de Clientes? Entonces la consulta SQL se quedaría de la siguiente manera:

string sql = "SELECT * INTO TablaExcel " +
@"IN 'C:\Mis documentos\Bd1.mdb' " +
"FROM [Datos de Clientes$]";

Fíjate que SIEMPRE que utilices el nombre de una hoja de un libro de
trabajo de Excel, tienes que encerrar el nombre entre corchetes y
acabado con el signo $. ¿OK?

Respuesta Responder a este mensaje
#5 SoftJaén
03/01/2010 - 09:29 | Informe spam
"leonardo" escribió:

me referí a un cuadro de diálogo que permita buscar el archivo y allí
mismo la hoja correspondiente.



Para utilizar el clásico cuadro de diálogo «Abrir», utiliza la clase
«OpenFileDialog». Consulta dicha clase en la ayuda de Visual Studio, donde
me imagino que encontrarás algún ejemplo.

así que la consulta sería con los parámetros correspondiente a la
ubicación del archivo de excel y la hoja.



Si tú deseas exportar a un archivo de Access, cualquier hoja o rango de
celdas con nombre existente en cualquier libro de trabajo de Excel, puedes
averigurar el nombre de las hojas y de los rangos mediante el método
«GetSchema» de un objeto OleDbConnection.

La siguiente función te devolverá un array de variables alfanuméricas que
puede contener sólo el nombre de las hojas de cálculo, sólo el nombre de los
rangos de celdas, o tanto los nombres de ambos:

string[] GetRangesAndSheetsNames(
string connString, bool includeSheets, bool includeRanges)
{
// Devuelve un array con el nombre de las hojas,
// y opcionalmente, con los rangos con nombre
// existentes en un libro de trabajo de Excel.

if (connString == string.Empty) return null;

using (OleDbConnection cnn = new OleDbConnection(connString))
{
try
{
cnn.Open();

DataTable dt = cnn.GetSchema("TABLES");

string[] tables = null;
object o = null;
Int32 n = 0;

if (dt.Rows.Count > 0)
{
foreach (DataRow dr in dt.Rows)
{
o = dr["TABLE_TYPE"];
if (o.ToString().ToUpper() == "TABLE")
{
// El objeto es una tabla.
//
o = dr["TABLE_NAME"];

// Si el nombre contiene el carácter $, se
// trata del nombre de una hoja; en caso
// contrario, se trata del nombre de un rango.
//
// NOTA: Si el nombre de la hoja de cálculo contiene
// espacios en blanco (Mi Nombre Hoja), el nombre
// estará encerrado entre comillas simples
/ ('Mi Nombre Hoja$')
//
Int32 p = o.ToString().IndexOf('$');

// Si se trata de un rango con nombre,
// y éstos no se incluyen, continuamos.
//
if (p == -1 && !includeRanges) continue;

// Si se trata de una hoja de cálculo, y
// éstas no se incluyen, continuamos.
//
if (p != -1 && !includeSheets) continue;

Array.Resize(ref tables, n + 1);
tables[n] = o.ToString();
n += 1;
}
}
}

return tables;
}
catch (Exception)
{
return null;
}
}
}

Ahora, una vez que sepas la ruta del archivo de Excel el cual deseas conocer
el nombre de sus hojas y rangos de celdas con nombre, llamarías a la función
de la siguiente manera:

listBox1.Items.Clear();

// Construimos la cadena de conexión
//
string connString "Provider=Microsoft.Jet.OLEDB.4.0;" +
@"Data Source=C:\Mis documentos\Libro1.xls;" +
"Extended Properties='Excel 8.0;'";

// Obtenemos tanto los nombres de las hojas como de los
// rangos de celdas con nombre
//
string[] sheets GetRangesAndSheetsNames(connString, true, true);

if (sheets == null){ return; }

// mientras recorremos el array, añadimos los elementos
// a un control ListBox
foreach (string sheetName in sheets)
{
listBox1.Items.Add(sheetName);
}

¡Es fácil! ¿No? :-)

Enrique Martínez
[MS MVP - VB]

Nota informativa: La información contenida en este mensaje, así como el
código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin
garantías de ninguna clase, y no otorga derecho alguno. Usted asume
cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o
sugerido en el presente mensaje.
Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente Respuesta Tengo una respuesta
Search Busqueda sugerida