Быстрая обработка данных Excel в Delphi - Программные продукты. Vlad 7. Праздники ещё не закончились, работать лень, но надо как- то уже прекращать заниматься кишкоблудством и начинать работать в полную силу. Ну, а чтобы как- то себя расшевелить и начать уже работу в блоге, решил первый пост сделать простым - снова сказать несколько слов про Excel. Дело в том, что с момента выхода поста под названием . Это, конечно хорошо, но этот пост (читай название) дает лишь небольшое представление о том как работать с Excel в Delphi. Никто ведь не изучает сразу квантовую механику с первого класса? Сначала учимся основам вообще - математика, физика и т.
- 20.01.2009, 07:23 Инструкция: Использование Excel из Delphi Что бы начать работу с Экселем, нужно создать OLE объект: Я буду показывать примеры на Ap.Cells но Вам никто не мешает использовать Ap.Range
- Приёмы, функции, процедуры. Пишем шуточные програмки.
- Метки: Ado, delphi, Excel, MS Excel, БД. Автор: Admin Базы данных Подписаться на RSS ленту. К записи “Работа с ADO в Delphi на примере БД MS Excel.
Так я решил поступить в начале рассказа про Excel- сначала дать общее представление, а потом по- тихоньку раскрывать тему более подробно и детально. Но поисковики немного спутали карты, подняв пост выше других про Excel.
Соответственно, те из посетителей, кто уже имеют представление о работе с Excel, видя представленные в статье примеры, возмущаются по поводу того, что чтение данных в этом случае будет происходить медленно. И я не спорю, да проход по каждой ячейке листа - это жуткие тормоза. А ускорить процесс чтения можно и необходимо.
Поэтому можно считать, что эта статья - расширение к основам. За полтора года мне предлагали кучу вариантов того как ускорить чтение данных с листа Excel - от использования MSXML и других готовых библиотек до самопальных процедур и функций. Что ж, любую задачу можно решить несколькими способами.
Рассмотрим несколько вариантов и определимся какой из вариантов окажется наиболее быстрым. Ну, а какой вариант окажется более удобным - это уже каждый решит для себя сам. Чтение данных из Excel. Вначале рассмотрим вариант чтения данных использованием которого грешат те, кто только начинает свое знакомство с Excel в Delphi - чтение данных из каждой ячейки по отдельности. Тестовая процедура с таким вариантом чтения может выглядеть следующим образом: procedure TForm. Slow. Variant; var Rows, Cols, i,j: integer; Work.
Продолжаем копаться в листах Excel и изучать особенности работы с ними. Сегодня Рассмотрим применение указанных выше свойств листа Worksheet при работе с Excel в Delphi. Часть 7: Пример обмена данными с Excel используя VCL и OLE. Эффективная работа с Excel -ом из Delphi -приложений немыслима.
Sheet: OLEVariant; d: TDate. Time; begin//открываем книгу. Excel. App. Workbooks. Open(ed. File. Text); //получаем активный лист. Work. Sheet: =Excel. App. Active. Workbook. Active. Sheet; //определяем количество строк и столбцов таблицы.
Rows: =Work. Sheet. Used. Range. Rows. Count; Cols: =Work.
Sheet. Used. Range. Columns. Count; String. Grid. 1. Row. Count: =Rows; String. Grid. 1. Col. Count: =Cols; //засекаем время начала чтенияd: =Now; //выводим данные в таблицуfor I : = 0 to Rows- 1 dofor j : = 0 to Cols- 1 do. String. Grid. 1. Cells. Можно было бы сделать счётчик исключительно на чтение данных с листа, но я решил не перегружать исходник лишними переменными. Если будет желание - можете переписать чуть- чуть исходник и получить .
На рисунке ниже представлено значение счётчика после чтения данных: 1. Так можно и не дождаться окончания операции.
Если внимательно посмотреть на процедуру, представленную выше, то можно видеть, что в цикле мы каждый раз при каждой итерации вначале получаем диапазон, занятый данными, затем в этом диапазоне получаем определенную ячейку и только потом считываем значение в ячейке. На самом деле столько лишних операций для чтения данных с листа не требуется. Тем более, когда данные располагаются непрерывным массивом. Более выгодным в этом случае вариантом чтения будет чтение данных сразу из всего диапазона в массив. На деле реализация этого варианты работы окажется даже проще, чем представленного выше. Вот вариант чтения данных целым диапазоном: procedure TForm.
Range. Read; var Rows, Cols, i,j: integer; Work. Sheet: OLEVariant; FData: OLEVariant; d: TDate.
Time; begin//открываем книгу. Excel. App. Workbooks.
Open(ed. File. Text); //получаем активный лист. Work. Sheet: =Excel. App. Active. Workbook. Active. Sheet; //определяем количество строк и столбцов таблицы. Rows: =Work. Sheet. Used. Range. Rows. Count; Cols: =Work.
Sheet. Used. Range. Columns. Count; //считываем данные всего диапазона. FData: =Work. Sheet. Used. Range. Value; String. Grid. 1. Row. Count: =Rows; String. Grid. 1. Col. Count: =Cols; //засекаем время начала чтенияd: =Now; //выводим данные в таблицуfor I : = 0 to Rows- 1 dofor j : = 0 to Cols- 1 do. String. Grid. 1. Cells.
В эту переменную мы прочитали за 1 операцию весь диапазон, занятый данными. После того как диапазон прочитан FData будет содержать матрицу, каждый элемент которой будет типом данных, определенным в Excel. Смотрим на время выполнения операции: Как видите, прирост скорости оказался колоссальным, учитывая даже то, что в счётчик попало время обновления String. Grid'а. Здесь было бы уместно показать и обратный метод работы с Excel, т. Для примера я написал процедуру, которая считывает большой объем данных из String.
Grid и записывает эти данные на второй лист открытой книги Excel: procedure TForm. Write. Data; var i,j: integer; FData: Variant; Sheet,Range: Variant; begin//создаем вариантный массив. FData: =Var. Array. Create(. Обратите внимание, что при записи в Excel не используются никакие циклы - запись происходит в 2 простых действия: выделяем диапазон, используя в качестве границ диапазона первую и последнюю ячейкиприсваиваем диапазону значение из массива.
Для полноты картины ниже на рисунке представлено значение счётчика, который отсчитал время от момента создания массива до активации приложения Excel включительно: Естественно, что с ростом объема данных будет расти и время выполнения операции. Так, например, лист, содержащий 1. Если для Вас такое время неприемлемо, то представленная выше процедура может быть немного ускорена использованием пары методов Var. Array. Lock() и Var.
Array. Un. Lock(), но при этом следует учитывать, что матрица FData будет транспонирована. Что ещё стоит сказать по поводу чтения/записи данных в Excel? Наверное то, что предложенные выше методы работы в обязательном порядке требуют наличия установленного Excel на том компьютере где запускается Ваша программа. В связи с этим обстоятельством может потребоваться более универсальный способ работы с Excel. Здесь, опять же, может быть несколько вариантов работы, но я покажу, а точнее укажу только на один из них - с использованием библиотека XLSRead. Write. Про эту библиотеку мне поведал один из читателей блога в комментарии как раз- таки к посту . Чтобы лишний раз Вас не переправлять на комментарий с примером использования этой библиотеки, я с разрешения GS (ник автора кода) просто опубликую здесь уже готовые примеры использования библиотеки XLSRead.
Write: Упрощенный пример для Delphi 7var. Intl. Xls: TXLSRead. Write. II2; I, J: Integer; begin// создаем объект. Intl. Xls : = TXLSRead. Write. II2. Create(nil); // название книги.
Intl. Xls. Sheets? Мне же в заключении остается только добавить и подчеркнуть, что самые правильные ответы и примеры к вопросам, касающимся работы с Excel содержаться в Справке для разработчиков в самом Excel и надо только воспользоваться поиском. Например, если вам довольно часто приходится перетаскивать данные из базы данных в Excel и в работе используется ADO, то специально для таких случаев в справке рассказывается про интересный метод объекта Range под названием Copy. From. Recordset, а если вам надо разукрасить свою таблицу Excel в разные цвета и установить разные виды границ ячеек, то специально для таких случаев в справке приводится подробные перечень всех перечислителей Excel'я.
Ну, а если не получится, то милости прошу - задавайте вопросы здесь или на нашем форуме.