Лучший способ получения текстового значения ячеек в файле Excel (*.xls)
Вопрос
Я пытаюсь написать функцию импорта для получения данных из файла Excel.Как я сейчас это делаю, выглядит следующим образом:
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
Проблема, конечно, в том, что он работает ужасно.Насколько я могу судить, это, скорее всего, сводится к этой строке:
Dim Obj = CType(therange.Cells(rCnt, cCnt), Excel.Range)
Мне нужен только текст из ячеек, а не создавать объект для каждой ячейки (и потом не отправлять их на сборку мусора).Есть ли более простой способ получить текст?
В идеале, если я смогу получить метод для получения текстовых значений ячейки, я хотел бы добавить несколько rowArray() в главный массив и обновить значения программы позже.
Если вы увидите какие-либо другие советы по производительности, дайте мне знать.Это будет высоко ценится.=б
РЕДАКТИРОВАТЬ:Я также понимаю, что у меня есть два варианта, если я создам главный массив, скажем, mArr, для хранения всех данных.Было бы лучше с точки зрения производительности, чтобы mArr был большим, а подмассивы маленькими, или mArr был маленьким, а подмассивы содержали больше информации?
Я спрашиваю, потому что файлы, которые будут импортированы, будут иметь больше строк, чем столбцов, поэтому мне было интересно, есть ли какой-нибудь «установленный» способ сделать это.
Решение
Чтение содержимого ячеек по отдельности сильно снижает производительность.Мой совет — сначала прочитать весь диапазон в массив объектов, а затем извлечь данные из этого массива.Я не пишу на VB.NET, но на C# код выглядит примерно так:
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[,];
В этом примере все содержимое листа считывается в cellValues (осторожно с нулями).Тот же совет касается и записи на лист — делайте все сразу, одним массивом.
Если вам интересно, у меня есть более длинный пост на эту тему. там
Да, и кстати, замените
xlApp = New Excel.ApplicationClass
к
xlApp = New Excel.Application
Другие советы
вот версия С# (но вы поняли суть), которая будет получать данные в таблицу данных...
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);
где «SpreadSheetLocation» и «Worksheet» — это путь к файлу и имена рабочих листов соответственно.Затем вы можете преобразовать строки данных в массивы, если хотите.
Обновлять :для этого решения вам также не нужен Excel, установленный на компьютере...
Для простого чтения я бы использовал Читатель данных Excel доступен на CodePlex.
На компьютерах, использующих этот компонент, не требуется установка Excel, и его довольно легко использовать.Вы можете прочитать рабочий лист в набор данных.
SpreadshsetGear для .NET позволит вам открыть книгу и получить доступ к необработанным значениям ячеек (числа, текст, логические значения или ошибки) или получить отформатированный текст ячеек.Поскольку SpreadsheetGear работает как часть вашего приложения, а не COM Interop, как в Excel, он будет работать намного быстрее (см. комментарии к эта страница чтобы узнать, что некоторые из наших клиентов говорят о производительности).
Вы можете увидеть живые образцы здесь и скачайте бесплатную пробную версию здесь.
Отказ от ответственности:Я владею ООО SpreadsheetGear.