Foros del Web » Programación para mayores de 30 ;) » .NET »

Leer gran cantidad de celdas de un Excel y realizar operaciones con ellas

Estas en el tema de Leer gran cantidad de celdas de un Excel y realizar operaciones con ellas en el foro de .NET en Foros del Web. Hola a todos, primero decirles que me estoy iniciando en el mundo de C# y vengo de un lenguaje de script que es PHP asi ...
  #1 (permalink)  
Antiguo 09/04/2013, 21:07
 
Fecha de Ingreso: marzo-2011
Ubicación: Caracas
Mensajes: 140
Antigüedad: 13 años, 1 mes
Puntos: 1
Leer gran cantidad de celdas de un Excel y realizar operaciones con ellas

Hola a todos, primero decirles que me estoy iniciando en el mundo de C# y vengo de un lenguaje de script que es PHP asi que conozco muy poco. Bien el caso es que tengo un archivo de Excel (puede ser confeccionado desde Excel 2007 hasta 2013) con 4 columnas. En las tres primeras columnas se almacenan numeros telefonicos (string) de hasta 13 caracteres. En la cuarta columna se almacena solo un numero que puede ser 1, 2, 3 o 4.

Sobre la primer columna de numeros debo realizar varias cosas que enumero debajo:

1) Comprobar que el numero que este en cada celda de la columna A (primer columna) no se encuentre en ninguna celda de la columna B (2da columna) ni en ninguna celda de la columna C(3ra columna).
2) Realizar operaciones de cadenas como por ejemplo eliminar ceros (0) a la izquierda, eliminar el codigo de pais u otras mas

La columna A (es la que siempre se va a analizar) contiene en este momento 797340 celdas, la columna B contiene 91617 celdas y la columna C contiene 95891 celdas. Esos numeros son bastante grandes y la tendencia es en incremento nunca va a decrementar

Yo he creado este codigo para leer el fichero en Excel y poner los contenidos de cada columna en arreglos de forma tal que luego pueda realizar las operaciones (que aun no se como comparar entre elementos de un arreglo asi que agradeceria si alguien me diera un tip) pero el mismo es lento y provoca que todo el tiempo se me quede colgado tanto el proceso como el Windows Explorer en una PC con un Core i3 y 12GB de memoria RAM (no quiero verlo ejecutandose en algo normalito):

Código:
private void btnCargarExcel_Click(object sender, EventArgs e)
        {
            if (this.openFileDialog1.ShowDialog() == DialogResult.OK)
            {

                if (System.IO.File.Exists(openFileDialog1.FileName))
                {
                    filePath.Text = openFileDialog1.FileName.ToString();

                    Excel.Application xlApp;
                    Excel.Workbook xlWorkBook;
                    Excel.Worksheet xlWorkSheet;
                    Excel.Range range;

                    string str;

                    int rCnt = 0;

                    xlApp = new Microsoft.Office.Interop.Excel.Application();
                    xlWorkBook = xlApp.Workbooks.Open(openFileDialog1.FileName, 0, true, 5, "", "", true, Microsoft.Office.Interop.Excel.XlPlatform.xlWindows, "\t", false, false, 0, true, 1, 0);
                    xlWorkSheet = (Excel.Worksheet)xlWorkBook.Worksheets.get_Item(1);

                    range = xlWorkSheet.UsedRange;

                    for (rCnt = 1; rCnt <= range.Rows.Count; rCnt++)
                    {
                        str = (range.Cells[rCnt, 1] as Excel.Range).Value2.ToString();
                        bd.Add(cleanString(str, 10));
                    }

                    for (rCnt = 1; rCnt <= range.Rows.Count; rCnt++)
                    {
                        str = (range.Cells[rCnt, 2] as Excel.Range).Value2.ToString();
                        bl.Add(cleanString(str, 10));
                    }

                    for (rCnt = 1; rCnt <= range.Rows.Count; rCnt++)
                    {
                        str = (range.Cells[rCnt, 3] as Excel.Range).Value2.ToString();
                        cm.Add(cleanString(str, 10));
                    }

                    nrosProcesados.Text = bd.Count().ToString();
                    listBox1.DataSource = bd;

                    noProcesadosBL.Text = bl.Count().ToString();
                    listBox2.DataSource = bl;

                    noProcesadosCM.Text = cm.Count().ToString();
                    listBox3.DataSource = cm;

                    xlWorkBook.Close(true, null, null);
                    xlApp.Quit();

                    releaseObject(xlWorkSheet);
                    releaseObject(xlWorkBook);
                    releaseObject(xlApp);
                }
                else
                {
                    MessageBox.Show("No se pudo abrir el fichero!");
                    System.Runtime.InteropServices.Marshal.ReleaseComObject(appExcel);
                    appExcel = null;
                    System.Windows.Forms.Application.Exit();
                }
            }
        }
Me han recomendado que lea directamente las celdas en un arreglo pero no se como hacerlo y por mas que busco en Google los ejemplos no me quedan claros del todo y lo que hago es perderme mas y mas de lo que ya ando, alguna ayuda? Alguna mejor solucion o idea?

PD: Si alguien me puede ayudar con la comprobacion (item 1) se los voy a agradecer siempre

Saludos
__________________
Reynier Perez Mira
Skype: reynierpm
Site: http://www.reynierpm.com
  #2 (permalink)  
Antiguo 11/04/2013, 15:26
Avatar de othix  
Fecha de Ingreso: mayo-2011
Ubicación: Guatemala
Mensajes: 92
Antigüedad: 12 años, 10 meses
Puntos: 9
Respuesta: Leer gran cantidad de celdas de un Excel y realizar operaciones con ellas

Si unicamente quieres leer el excel y no escribir en el lo puedes hacer usando oledb para leer el excel y pasar la data a un DataTable lo cual seria mas facil de manipular,

LecturaEscritura-de-archivos-Excel-con-ADONET

si lo que necesitas aparte de leer es escribir el excel te recomiendo openXML
generar libros con openxml
__________________
"Todos somos muy ignorantes. Lo que ocurre es que no todos ignoramos las mismas cosas."
  #3 (permalink)  
Antiguo 12/04/2013, 15:25
 
Fecha de Ingreso: marzo-2011
Ubicación: Caracas
Mensajes: 140
Antigüedad: 13 años, 1 mes
Puntos: 1
Respuesta: Leer gran cantidad de celdas de un Excel y realizar operaciones con ellas

Gracias, lo revisare!!
__________________
Reynier Perez Mira
Skype: reynierpm
Site: http://www.reynierpm.com
  #4 (permalink)  
Antiguo 02/05/2013, 09:16
 
Fecha de Ingreso: abril-2013
Mensajes: 2
Antigüedad: 11 años
Puntos: 0
Respuesta: Leer gran cantidad de celdas de un Excel y realizar operaciones con ellas

//************************************************** *****************************
//Leer el path del archivo Excel que tiene los datos del cliente
//Dimensionar los elementos necesarios para leer y cargar los datos
OleDbConnection oConn = new OleDbConnection();
OleDbCommand oCmd = new OleDbCommand();
OleDbDataAdapter oDa = new OleDbDataAdapter();
DataSet oDs = new DataSet();

string rutaArchivo = "C:Cualquier ruta donde tienes el Excel a leer\\Prueba.xlsx";
string dato = string.Empty, rut = string.Empty, nombre = string.Empty, cuentaCte = string.Empty, totalNomina = string.Empty, cantidadReg = string.Empty, fechaEfect = string.Empty, tipoAbono = string.Empty;
//Atención: Esta es la cadena de conexión. La misma lee el archivo especificado en el path
//Capturo la extensio, dependiendo difiere de la connectionstring
if (Path.GetExtension(rutaArchivo).Equals(".xls"))
{
oConn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + (rutaArchivo) + "; Extended Properties='Excel 8.0;HDR=YES;MaxScanRows=;IMEX=1;'";
}
else
{
oConn.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + (rutaArchivo) + "; Extended Properties='Excel 12.0;HDR=YES;MaxScanRows=;IMEX=1;'";
}
// Abrir la conexión, y leer [Hoja 1] del archivo Excel
oConn.Open();
oCmd.CommandText = "select * from [Hoja1$]";
oCmd.Connection = oConn;
oDa.SelectCommand = oCmd;

//Llenar el DataSet
oDa.Fill(oDs,"Clientes");

DataTable tabla = oDs.Tables[0];
//GridView para comprobar que todos los datos se estan pasando, luego lo sacas si quieres.
GridView1.DataSource = tabla;
GridView1.DataBind();


//Recorres la tabla para capturas los datos. ese me servia ami, tu lo modificas a tu gusto.
for (int uu = 0; uu < tabla.Rows.Count; uu++)
{
nombre = tabla.Rows[uu][1].ToString();
cuentaCte = tabla.Rows[uu][2].ToString();
rut = tabla.Rows[uu][3].ToString();
totalNomina = tabla.Rows[uu][4].ToString();
cantidadReg = tabla.Rows[uu][5].ToString();

}
oConn.Close();


Espero que te sirva

Etiquetas: c#, excel;2007;, macros, programacion
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 04:43.