Mejor Manera de Obtener el Valor de Texto de las Celdas en una hoja de Excel (*.xls) Archivo

StackOverflow https://stackoverflow.com/questions/1685501

  •  18-09-2019
  •  | 
  •  

Pregunta

Estoy tratando de escribir una función de importación para la obtención de datos de un archivo de excel.Cómo me hacen actualmente es como sigue:

Private Sub ReadExcel(ByVal childform As PhoneDiag.frmData, ByVal FileName As String)

        Dim xlApp As Excel.Application
        Dim xlWorkBook As Excel.Workbook
        Dim xlWorkSheet As Excel.Worksheet

        xlApp = New Excel.ApplicationClass
        xlWorkBook = xlApp.Workbooks.Open(FileName)
        xlWorkSheet = xlWorkBook.Worksheets(1)
        Dim columnrange = xlWorkSheet.Columns
        Dim therange = xlWorkSheet.UsedRange

        ''Add rows by column
        For rCnt = 2 To therange.Rows.Count

            Dim rowArray(therange.Columns.Count) As String

            For cCnt = 1 To therange.Columns.Count

                Dim Obj = CType(therange.Cells(rCnt, cCnt), Excel.Range)
                Dim celltext As String
                celltext = Obj.Value.ToString
                rowArray((cCnt - 1)) = celltext

            Next

            childform.datagridSample.Rows.Add(rowArray)

        Next

        '' make sure we close the excel.exe service after use
        xlWorkBook.Close()
        xlApp.Quit()
        System.Runtime.InteropServices.Marshal.ReleaseComObject(xlWorkBook)
        System.Runtime.InteropServices.Marshal.ReleaseComObject(xlWorkSheet)
        System.Runtime.InteropServices.Marshal.ReleaseComObject(xlApp)

    End Sub

El problema es, por supuesto, es que funciona horriblemente.De lo que he entendido, es más que probable que llega a esta línea:

Dim Obj = CType(therange.Cells(rCnt, cCnt), Excel.Range)

Todo lo que necesito es el texto de las celdas, no para crear un objeto para cada celda (y no enviarlos a la recolección de basura).Hay una manera más fácil de obtener sólo el texto?

Idealmente, si puedo conseguir un método para obtener los valores de texto de la celda, me gustaría conseguir los múltiples rowArray()'s agregado a un maestro de la matriz y actualizar el programa de valores de la tarde.

Si usted ve cualquier otro rendimiento de los consejos, que me haga saber.Sería muy apreciada.=b

EDITAR:También me doy cuenta de que tengo dos opciones, si yo fuera a crear un conjunto maestro, dicen mArr, para contener todos los datos.No sería mejor rendimiento prudente tener mArr a ser grandes y las sub matrices pequeñas, o mArr a ser pequeñas y las sub matrices de sostener más de la información?

Me pregunto porque los archivos que van a ser importados tendrán más filas que columnas, así que me preguntaba si había alguna "set" forma de hacerlo.

¿Fue útil?

Solución

La lectura del contenido de la celda individual es un enorme rendimiento asesino.Mi consejo es leer primero toda la gama en una matriz de objetos y, a continuación, recuperar los datos de la matriz.No escribo en VB.NET pero en C# el código se ve algo como esto:

Excel.Range firstCell = excelWorksheet.get_Range("A1", Type.Missing);
Excel.Range lastCell = excelWorksheet.Cells.SpecialCells(Excel.XlCellType.xlCellTypeLastCell, Type.Missing);
object[,] cellValues;
Excel.Range worksheetCells = excelWorksheet.get_Range(firstCell, lastCell);
cellValues = worksheetCells.Value2 as object[,];

Este ejemplo lee todo el contenido de una hoja en cellValues (cuidado acerca de los valores nulos).El mismo consejo se aplica a la escritura y a la hoja de hacerlo todo a la vez, con una matriz.
Si usted está interesado, tengo un puesto más en este allí
Ah, y por CIERTO, reemplazar

xlApp = New Excel.ApplicationClass

por

xlApp = New Excel.Application

Otros consejos

Aquí hay una versión de C # (pero se obtiene la esencia) que hará que los datos en una tabla de datos ...

con = new OleDbConnection(@"Provider=Microsoft.Jet.OLEDB.4.0;Data Source="+SpreadsheetLocation+";Extended Properties=\"Excel 8.0;IMEX=1;HDR=NO\"");
OleDbDataAdapter da = new OleDbDataAdapter("SELECT * FROM ["+Worksheet+"$]", con);
DataTable dt = new DataTable();
da.Fill(dt);

donde "SpreadSheetLocation" y "Hoja de trabajo" son una ruta de archivo y nombres de las hojas de trabajo, respectivamente. A continuación, puede convertir las filas DataTable a las matrices si lo desea.

Actualización: también no necesita Excel instalado en la máquina para esta solución ...

Para una lectura sencilla, que haría uso de la Excel Lector de datos disponible en CodePlex.

Las máquinas que utilizan el componente no es necesario instalar Excel y es bastante fácil de usar. Usted puede leer una hoja de cálculo en un conjunto de datos.

números

SpreadshsetGear para .NET le permitirá abrir un libro y acceder a los valores brutos de células ( , texto, lógica o error) u obtener el texto con formato de las celdas. Debido SpreadsheetGear se ejecuta como parte de la aplicación en lugar de interoperabilidad COM como con Excel, se ejecutará mucho más rápido (ver los comentarios sobre esta página para ver lo que algunos de nuestros clientes han dicho sobre el rendimiento).

Se puede ver muestras vivas aquí y descargar la versión de prueba gratuita aquí .

exención de responsabilidad: Soy dueño de SpreadsheetGear LLC

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top