Вопрос

Я сталкиваюсь с проблемами производительности при чтении / записи данных из / к клеткам MS-Excel. Я использую библиотеку объектов MS Excel 11.0 для автоматизации с VB.NET.

В настоящее время требуется слишком много времени для чтения и записи из / в файлы Excel. (10 минут, чтобы прочитать 1000 строк :(). Кажется, что подход к читанию и письму со ссылкой на клеточную клетку не является тем мощностью. Есть ли способ прочитать / запись данных, используя объемную работу?

Это было полезно?

Решение

Вместо того, чтобы чтение ячейки по ячейке вы можете прочитать целый диапазон и сохранить его в 2D Arrray. Затем вы можете получить доступ к 2D Array, поскольку вы получите доступ к ячейке в Excel.

Я не хорошо разбираюсь в vb.net для объектов Excel, но если вы понимаете C #, затем дайте эту ссылку быстро читать и попробуйте реализовать его.

http://dotnetperls.com/excel-interop. Прочитайте раздел «Получение данных книги»

Другие советы

Здорово!!!

Я использовал подход 2D Array и достиг огромных повышений производительности !!

Ранее я использовал сотовый апробук, как показано ниже,

Dim cell As Excel.Range = Nothing
cell = sheet.Cells(rowIndex, colIndex)
cell.Value = "Some value"

Раньше я раньше перевел диапазон ячеек и использовал для копирования значения в каждой ячейке. Здесь все sheet.Cells а также cell.Value Является ли звонком взаимодействия и для каждого вызова его выдает вызов Excel.exe, который стоит больше времени.

В 2D-подходе я заполнил данные, которые должны быть скопированы в клетках Excel, в 2D-массиве, а затем назначали 2D массив на значение выбранного повторного воздействия ячеек. Это как показано ниже,

Dim darray(recordCount - 1, noOfCol - 1) As String
//Fill the data in darray
//startPosRange = Get the range of cell from where to start writing data
startPosRange = startPosRange.Resize(recordCount, noOfCol)
startPosRange.Value = darray

После этих модификаций я собрал данные о производительности как для подходов, так и результаты удивительно велики !! Более поздний подход в 25 раз быстро, как предыдущий.

Точно так же я использовал 2D Array подход для чтения данных из клеток и видел аналогичный повышение производительности. Образцы кода, как показано ниже.

Клетчатый подход,

Dim usedRange As Excel.Range = sheet.UsedRange
For Each row As Excel.Range In usedRange.Rows()
For Each cellData As Excel.Range In row.Cells
    //Gather cellData.Value in some container.
Next

2D Array подход,

Dim usedRange As Excel.Range = sheet.UsedRange
//Here the array index starts from 1. why???
Dim darray(,) As Object = CType(usedRange.Value, Object(,))

Dim rows As Integer = darray.GetUpperBound(0)
Dim cols As Integer = darray.GetUpperBound(1)
For i As Integer = 1 To rows    
    For j As Integer = 1 To cols
        Dim str As String
        If darray(i, j) Is Nothing Then
            str = ""
        Else
            str = darray(i, j).ToString
        End If
        //Use value of str
    Next
Next

Пожалуйста, обратитесь,http://support.microsoft.com/kb/306023. , http://dotnetperls.com/excel-interop. (Спасибо ChicksentMehighe для ссылки)

Наслаждайтесь производительностью !!!

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