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

#6 leonardo
04/01/2010 - 22:03 | Informe spam
ahora sí, me parece excelente
lo pruebo y comento
muchísimas gracias
leonardo

SoftJaén escribió:
Mostrar la cita
#7 leonardo
05/01/2010 - 01:28 | Informe spam
bueno, lo que he hecho es cargar un datagridview con la hoja de excel,
usé el openfiledialog y el listbox para seleccionar la hoja (con la
función que me pasaste).
ahora, con el datatable ¿cómo hago para llenar, crear, generar la tabla
que voy a usar en la aplicación?
tendré que solicitar la conexión con la base de datos de acces y allí
cargar los datos a la tabla desde el datatable?


SoftJaén escribió:
Mostrar la cita
#8 SoftJaén
05/01/2010 - 05:51 | Informe spam
"leonardo" preguntó:

¿Pero es que también vas a trabajar con cualquier base de Access que elija
el usuario?

Desde un primer momento, creía que que tenías un sólo libro de Excel y una
sóla base de datos de Access, pero por lo que observo, parece ser que vas a
dejar al usuario que elija el archivo de Excel que crea oportuno para
exportar a la base de Access que crea conveniente, los datos que le venga en
gana. :-)

Mostrar la cita
Si te refieres a llenar un objeto DataTable con los datos existentes en una
tabla de una base de Access, lo harías de la misma manera que lo has hecho
para cargar en un control DataGridView los datos de la hoja de Excel.
Obviamente, la cadena de conexión que utilices deberá de hacer referencia a
la base de Access.

Ahora bien, para crear o generar la tabla de Access, ya te indiqué
anteriormente lo que tenías que hacer. Con el comando SELECT * INTO
automáticamente se crea la tabla en la base de Access, que tendrá la
estructura y datos de la hoja de Excel seleccionada.

Pero si deseas crear "manualmente" y en tiempo de ejecución la tabla en la
base de Access, tendrás que ejecutar el comando CREATE TABLE del lenguaje
SQL del motor Microsoft Jet, que es el motor que nos permite trabajar con
bases de datos Microsoft Access.

Mostrar la cita
Para solicitar la conexión con la base de datos de Access, simplemente
tienes que hacer lo mismo que has hecho para seleccionar un archivo de
Excel: mostrar el cuadro de diálogo «Abrir» para que el usuario seleccione
la base de datos de Access. Una vez seleccionada la base de datos,
especificarías la ruta completa en el parámetro «Data Source» de la cadena
de conexión.

Para una base de datos Access 2003 e inferior, la cadena de conexión sería
la siguiente:

string connString = "Provider=Microsoft.Jet.OLEDB.4.0;" +
@"Data Source=C:\Mis documentos\Base1.mdb;"


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.
#9 leonardo
08/01/2010 - 22:33 | Informe spam
bueno, aquí va cómo lo he dejado, gracias por los aportes
Pego el código de todo el form, espero comentarios si se puede hacer mejor.
leonardo

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;


namespace Form1
{
public partial class FormImpExcel : Form
{
public FormImpExcel()
{
InitializeComponent();
}


//botón para seleccionar el archivo
private void button1_Click(object sender, EventArgs e)
{
OpenFileDialog openFD = new OpenFileDialog();
openFD.Title = "Seleccionar archivos";
openFD.Filter = "Todos los archivos (*.xl*)|*.xl*";
openFD.Multiselect = false;
//openFD.InitialDirectory = ";
if( openFD.ShowDialog() ==
System.Windows.Forms.DialogResult.OK ){
TextPathExcel.Text = openFD.FileName;

//cargo el nombre de la hojas en un listbox
listBox1.Items.Clear();

// Construimos la cadena de conexión
//
string connString "Provider=Microsoft.Jet.OLEDB.4.0;" +
@"Data Source=" + TextPathExcel.Text + ";" +
"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);
}
}
}

//botón que carga el datagrid con el archivo de excel
private void button2_Click(object sender, EventArgs e)
{
try
{
DataTable dt = new DataTable();
string strconn;
strconn = "Provider=Microsoft.Jet.OLEDB.4.0;" +
@"Data Source=" + TextPathExcel.Text + ";" +
"Extended Properties='Excel 8.0;'";

OleDbConnection mconn = new OleDbConnection(strconn);
OleDbDataAdapter ad = new OleDbDataAdapter("Select *
from ["+ TextHoja.Text + "]" , mconn);
mconn.Open();
ad.Fill(dt);
mconn.Close();
this.dgvExcel.DataSource = dt;
}
catch (OleDbException ex)
{
MessageBox.Show(ex.Message);
}
}

/* FUNCIÓN QUE DEVUELVE LAS HOJAS DEL LIBRO */
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;
}
}
}

//aquí se cargan las hojas del libro
private void listBox1_SelectedIndexChanged(object sender,
EventArgs e)
{
this.TextHoja.Text = this.listBox1.SelectedItem.ToString();
string texto = this.TextHoja.Text;
texto = texto.Replace("$'", "");
texto = texto.Replace("'", "");
this.label3.Text = texto;
}


//botón que guarda los datos del datagrid en una tabla de access
private void button3_Click(object sender, EventArgs e)
{
for (int i = 0; i < dgvExcel.Rows.Count-1; i++)
{
OleDbCommand comando = new OleDbCommand();
comando.Connection = crearConexion();
try
{
OleDbParameter par = new OleDbParameter("@var",
OleDbType.VarChar, 50);
par.Value = dgvExcel.Rows[i].Cells[0].Value.ToString();
comando.CommandText = "insert into gimnastas
(nombre) values (@var)";
comando.Parameters.Add(par);
comando.ExecuteNonQuery();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
finally
{
comando.Connection.Close();
}
}//fin del for
} //fin button3_Click



public OleDbConnection crearConexion()
{
OleDbConnection con = new OleDbConnection();
//la base de datos debe estar en la dirección ..\bin\Debug
con.ConnectionString =
"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=torneosgim.mdb";
try
{
con.Open();
}
catch (Exception e)
{
throw e;
}
return con;
}

private void dgvExcel_CellContentClick(object sender,
DataGridViewCellEventArgs e)
{

}

}
}





leonardo escribió:
Mostrar la cita
Ads by Google
Search Busqueda sugerida