Maneira melhor de começar o valor de texto de células em um (* .xls) arquivo Excel
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.
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 há
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