Ver Mensaje Individual
  #1 (permalink)  
Antiguo 09/04/2013, 21:07
reynierpm
 
Fecha de Ingreso: marzo-2011
Ubicación: Caracas
Mensajes: 140
Antigüedad: 13 años, 8 meses
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