Pergunta

Eu estou tentando escrever uma função de importação para a obtenção de dados a partir de um arquivo excel. Como eu atualmente fazê-lo é a seguinte:

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

O problema é, naturalmente, é que ele corre terrivelmente. Pelo que eu pude perceber, ele mais do que provavelmente se resume a esta linha:

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

Tudo que eu preciso é o texto das células, para não criar um objeto para cada célula (e depois não enviá-los para a coleta de lixo). Existe uma maneira mais fácil de ficar apenas o texto?

O ideal é que se eu conseguir um método para obter os valores de texto do celular, eu gostaria de obter o rowArray múltipla () 's adicionados a uma matriz mestre e atualizar os valores do programa mais tarde.

Se você ver quaisquer outras dicas de desempenho, deixe-me saber. Ele seria muito apreciado. = B

EDIT: Eu também percebo que eu tenho duas opções se eu fosse para criar uma matriz mestre, dizem Marr, para conter todos os dados. Seria melhor desempenho sábio ter Marr a ser grandes e as sub matrizes pequeno, ou Marr para ser pequeno e os sub matrizes para armazenar mais da informação?

Eu pergunto porque os arquivos que serão importados terá mais linhas do que colunas, então eu queria saber se havia alguma maneira "set" de fazê-lo.

Foi útil?

Solução

conteúdo da célula leitura é, individualmente, um assassino grande desempenho. Meu conselho é ler primeiro toda a gama em um array de objetos e, em seguida, recuperar os dados a partir dessa matriz. Eu não escrevo em VB.NET, mas em C # o código é algo como isto:

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 exemplo lê todo o conteúdo de uma folha em cellValues ??(cuidado com valores nulos). O mesmo conselho se aplica a escrever para a folha -. Fazer tudo de uma vez, com uma variedade
Se você estiver interessado, tenho um longo post sobre este
Ah, e BTW, substitua

xlApp = New Excel.ApplicationClass

por

xlApp = New Excel.Application

Outras dicas

Aqui está uma versão C # (mas você começa a essência) que irá receber os dados em uma tabela de dados ...

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);

onde "SpreadSheetLocation" e "Folha de trabalho" são um caminho de arquivo e nomes de folha de trabalho, respectivamente. Você pode, então, converter as linhas DataTable para matrizes se você gosta.

Update: você também não precisa Excel instalado na máquina para esta solução ...

Para uma leitura simples, eu uso o Excel Leitor Dados disponível no CodePlex.

Machines usando o componente não precisa Excel instalado e é muito fácil de usar. Você pode ler uma planilha em um DataSet.

SpreadshsetGear for .NET permitirá que você abrir um livro e acessar os valores brutos de células (números , texto, lógica ou de erro) ou obter o texto formatado das células. Porque SpreadsheetGear é executado como parte do seu aplicativo em vez de interoperabilidade como com o Excel, ele vai correr muito mais rápido (ver os comentários sobre desta página para ver o que alguns de nossos clientes disseram sobre o desempenho).

Você pode ver amostras vivas aqui e descarregue a versão gratuita aqui .

Disclaimer: eu próprio SpreadsheetGear LLC

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top