CodeNet / Языки программирования / Delphi & Kylix / Печать и отчеты
CodeNet / Языки программирования / Delphi & Kylix / Работа с текстом
CodeNet / Языки программирования / Delphi & Kylix / Работа с текстом
Обмен данными с Excel
В delphi 5, для обмена данными между Вашим приложением и excel можно использовать компонент texcelapplication, доступный на servers page в component palette.
На форме находится tstringgrid, заполненный некоторыми данными и две кнопки, с названиями to excel и from excel. Так же на форме находится компонент texcelapplication со свойством name, содержащим xlapp и свойством connectkind, содержащим cknewinstance. Когда нам необходимо работать с excel, то обычно мы открываем excelapplication, затем открываем workbook и в конце используем worksheet. Итак, несомненный интерес представляет для нас листы (worksheets) в книге (workbook).
Давайте посмотрим как всё это работает.
Посылка данных в excel
Это можно сделать с помощью следующей процедуры :
procedure tform1.bitbtntoexcelonclick(sender: tobject); var workbk : _workbook; // определяем workbook worksheet : _worksheet; // определяем worksheet i, j, k, r, c : integer; iindex : olevariant; tabgrid : variant; begin if genericstringgrid.cells[0,1] < > '' then begin iindex := 1; r := genericstringgrid.rowcount; c := genericstringgrid.colcount; // Создаём массив-матрицу tabgrid := vararraycreate([0,(r - 1),0,(c - 1)],varolestr); i := 0; // Определяем цикл для заполнения массива-матрицы repeat for j := 0 to (c - 1) do tabgrid[i,j] := genericstringgrid.cells[j,i]; inc(i,1); until i > (r - 1); // Соединяемся с сервером texcelapplication xlapp.connect; // Добавляем workbooks в excelapplication xlapp.workbooks.add(xlwbatworksheet,0); // Выбираем первую workbook workbk := xlapp.workbooks.item[iindex]; // Определяем первый worksheet worksheet := workbk.worksheets.get_item(1) as _worksheet; // Сопоставляем delphi массив-матрицу с матрицей в worksheet worksheet.range['a1',worksheet.cells.item[r,c]].value := tabgrid; // Заполняем свойства worksheet worksheet.name := 'customers'; worksheet.columns.font.bold := true; worksheet.columns.horizontalalignment := xlright; worksheet.columns.columnwidth := 14; // Заполняем всю первую колонку worksheet.range['a' + inttostr(1),'a' + inttostr(r)].font.color := clblue; worksheet.range['a' + inttostr(1),'a' + inttostr(r)].horizontalalignment := xlhalignleft; worksheet.range['a' + inttostr(1),'a' + inttostr(r)].columnwidth := 31; // Показываем excel xlapp.visible[0] := true; // Разрываем связь с сервером xlapp.disconnect; // unassign the delphi variant matrix tabgrid := unassigned; end; end; Получение данных из excel Это можно сделать с помощью следующей процедуры : procedure tform1.bitbtnfromexcelonclick(sender: tobject); var workbk : _workbook; worksheet : _worksheet; k, r, x, y : integer; iindex : olevariant; rangematrix : variant; nomfich : widestring; begin nomfich := 'c:mydirectorynameoffile.xls'; iindex := 1; xlapp.connect; // Открываем файл excel xlapp.workbooks.open(nomfich,emptyparam,emptyparam,emptyparam,emptyparam, emptyparam,emptyparam,emptyparam,emptyparam,emptyparam,emptyparam, emptyparam,emptyparam,0); workbk := xlapp.workbooks.item[iindex]; worksheet := workbk.worksheets.get_item(1) as _worksheet; // Чтобы знать размер листа (worksheet), т.е. количество строк и количество // столбцов, мы активируем его последнюю непустую ячейку worksheet.cells.specialcells(xlcelltypelastcell,emptyparam).activate; // Получаем значение последней строки x := xlapp.activecell.row; // Получаем значение последней колонки y := xlapp.activecell.column; // Определяем количество колонок в tstringgrid genericstringgrid.colcount := y; // Сопоставляем матрицу worksheet с нашей delphi матрицей rangematrix := xlapp.range['a1',xlapp.cells.item[x,y]].value; // Выходим из excel и отсоединяемся от сервера xlapp.quit; xlapp.disconnect; // Определяем цикл для заполнения tstringgrid k := 1; repeat for r := 1 to y do genericstringgrid.cells[(r - 1),(k - 1)] := rangematrix[k,r]; inc(k,1); genericstringgrid.rowcount := k + 1; until k > x; // unassign the delphi variant matrix rangematrix := unassigned; end;