Лучший способ получения текстового значения ячеек в файле Excel (*.xls)

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

  •  18-09-2019
  •  | 
  •  

Вопрос

Я пытаюсь написать функцию импорта для получения данных из файла 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.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top