Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.05.28;
Скачать: CL | DM;

Вниз

Возможно ли копирование данных из Excel в базу данных?   Найти похожие ветки 

 
asd ©   (2006-05-06 20:32) [0]

Возможно ли копирование данных из Excel  в базу данных, отображая их в DBGrid?


 
KilkennyCat ©   (2006-05-06 20:54) [1]

Да. TExcelApplication


 
ЛшдлуттнСфе   (2006-05-06 20:57) [2]

Из DelphiWorld

В 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:\MyDirectory\NameOfFile.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;


 
Pavia ©   (2006-05-06 21:31) [3]

Я сам мало работал с базами данных, но магу сказать что лучше к экселю обращаться как к базе данных. Тогда работать будет быстрее и лучше.


 
asd ©   (2006-05-06 23:07) [4]

Спасибо за помощь


 
asd ©   (2006-05-07 11:29) [5]

ЛшдлуттнСфе, у меня выдаёт ошибку [Error] Unit1.pas(59): Incompatible types: "Variant" and "_Workbook". А ещё перед этим XLAPP не определяло, я объявил её типа Variant


 
ЛшдлУттнСфе   (2006-05-07 19:00) [6]

Так же на форме находится компонент TExcelApplication со свойством Name, содержащим XLApp

Как Вы поняли эту фразу? Кинули на форму невизуальный компонент TExcelApplication и обозвали его XLApp ?

И как Вы думаете, если XLApp объявить вариантом, то
> XLApp.Connect;
>  // Открываем файл Excel
>  XLApp.WorkBooks.Open(NomFich, EmptyParam, EmptyParam, EmptyParam,
> EmptyParam


возможно?!

Думать надо. Читать надо.
Успехов.


 
asd ©   (2006-05-08 13:20) [7]

А не подскажите где вы читали на эту тему?


 
KilkennyCat ©   (2006-05-08 13:37) [8]


> [7] asd ©   (08.05.06 13:20)


именно этот пример - в DelphiWorld http://www.delphiworld.narod.ru/
Остальное - в книжках.
Могу выложить, и кинуть ссылкой.


 
asd ©   (2006-05-09 11:24) [9]

Было бы отлично. Спасибо.


 
KilkennyCat ©   (2006-05-09 15:16) [10]

http://c-books.info/books/news5.php/2006/02/13/programmirovanie-dokumentov-i-prilozhenij-ms-office-v-delphi.html


 
KilkennyCat ©   (2006-05-09 15:18) [11]

http://www.a-cons.com/d5_office.rar



Страницы: 1 вся ветка

Текущий архив: 2006.05.28;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.036 c
2-1147154902
Sergey Masloff
2006-05-09 10:08
2006.05.28
Проблема с кодировками. Написал плагин к Outlook но сабж...


15-1146597572
kilonet
2006-05-02 23:19
2006.05.28
Перевод книги в электронный формат


15-1146731009
MrShadow_
2006-05-04 12:23
2006.05.28
Прозрачность отдельных компонентов...


2-1147203470
Mr tray
2006-05-09 23:37
2006.05.28
узнать хендл объекта с фокусом клавиатуры


2-1147185682
Zim'A
2006-05-09 18:41
2006.05.28
помогите правильно установить RxLib в delphi 7 studio