Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: ActiveX/СОМ/CORBA > импорт из Excel в Delphi


Автор: ilias 22.3.2006, 22:11
Здраствуйте! помогите пожалуйста! мне нужно сделать програму в Дельфи так что она загружала большую базу Эксель и в ней можно было Выбирать какой Эксель открыть, поиск по определеным строкам, фильтрация, как мне это сделать незнаю я только начинающий и никогда с этим не сталкивался, помогите пожалуйста!!!!

Автор: Foley 22.3.2006, 23:44
Тебе проще из Эксель это все dBase переконвертить (в экселе при сохранении можно выбрать), есть специальные драйвера Эксель (по моему в ОДБЦ, и вроде в БДЕ есть). Если просто считать данные то можно так:
Код

var
 Excel: variant;
  i, j: word;
     S: string; 
begin
     Excel := CreateOleObject('Excel.Application');
     Excel.Workbooks.Open(FileName);
     Excel.Visible:=True;
     for i := 1 to 5 do
       for j := 1 to 5 do 
        begin
          S := Excel.Sheets[1].Cells[i,j].Text;
          ShowMessage(S);
        end;
end;

(delphiworld.narod.ru)

Автор: Msl 24.3.2006, 07:45
Обмен данными с Excel.

1. Для затравки и утоления жажды -фрагменты кода с комментариями (Ishodniki.RU)

Автор: {Fernando Silva-mailto:[email protected]}

В Delphi 5, для обмена данными между Вашим приложением и Excel можно использовать компонент TExcelApplication, доступный на Servers Page в Component Palette.

Совместимость: Delphi (5.x или выше)

На форме находится 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; 



2. есть служба XL Report Support на http://www.delphikingdom.com/

3. VCL - XL Report - {http://www.afalinasoft.com/rus/}

4. Если задача серьезнее и есть желание- используй
библиотеки экспорта/импорта:

XLSReadWriteII 2.0 works with Delphi 5,6,7 and C++ Builder 5 and 6.
home: http://www.axolot.com/components/xlsrwii20.htm

Удачи!

Автор: Albinos_x 24.3.2006, 20:44
Цитата(Msl @ 24.3.2006, 07:45 Найти цитируемый пост)
На форме находится TStringGrid, заполненный некоторыми данными и две кнопки, с названиями To Excel и From Excel. Так же на форме находится компонент TExcelApplication со свойством Name, содержащим XLApp и свойством ConnectKind, содержащим ckNewInstance.

Когда нам необходимо работать с Excel, то обычно мы открываем ExcelApplication, затем открываем WorkBook и в конце используем WorkSheet.

Итак, несомненный интерес представляет для нас листы (WorkSheets) в книге (WorkBook). Давайте посмотрим как всё это работает.

Посылка данных в Excel
.....

http://forum.vingrad.ru/index.php?showtopic=84634

Автор: ilias 24.3.2006, 21:52
Да спасибо я по пробовал таким способом, но он так долго грузится если база большая, а комп у меня Р3 667 Мгц. Ждал минут 10-15

Автор: Albinos_x 24.3.2006, 22:01
можно попробовать писать напрямую в файл, например в формате csv, а потом открывать экселем...
кроме того, по указанной мной ссылке показано как работать с группой ячеек, через вариантный массив, при его использовании загрузка в несколько раз ускорится...

Автор: wind1 7.4.2009, 20:26
Тоже понадобилось считать из экселя данные и возник один вопрос.
Когда выполняются следующие функции
Код

Excel := CreateOleObject('Excel.Application');
Excel.Workbooks.Open(FileName);

то создается новый процесс excel.exe.
Как корректно завершить этот процесс после того как я закончу считывание?

Автор: Данкинг 7.4.2009, 20:29
Цитата(wind1 @  7.4.2009,  21:26 Найти цитируемый пост)
Как корректно завершить этот процесс после того как я закончу считывание? 

Код

excel.application.quit;
excel:=unassigned;

Автор: mr_tg 21.4.2010, 16:57

Здраствуйте я на этом форуме новечок и делетант в програмировании. Мня тоже мучает вопрос как получать данные из excel.
у меня получается заганять в Excel но из Excel в базу Парадокс7 не получается. 

Цитата

Получение данных из Excel
Код

Как пишет MSL на верху я пробовалб но 
Код

procedure TForm1.BitBtn4Click(Sender: TObject);
var
WorkBk : _WorkBook;

красном пишет UNDECLARED IDENTIFIER: '_WorkBook;' 


Заране благадарю за помощь.
MR_TG

Автор: Akella 21.4.2010, 19:33
Выясни, в каком модуле _WorkBook и подключи в USES.
Скорее всего это в модуле ExcelXP

Автор: Данкинг 21.4.2010, 21:47
mr_tg, используй CreateOleObject, там таких проблем нет.

Автор: Albinos_x 22.4.2010, 10:27
mr_tg
статью http://forum.vingrad.ru/forum/topic-84634/view-all.html читал?

ЗЫ: 1 тема - 1 вопрос

Автор: mr_tg 22.4.2010, 11:09
спасибо друзя. я не волшебник я только учусь, и этот код скрипт я позаимствовал с этого сайта как вы понили, 
как сказал AKELLA  Uses добавил ExcelXP и отуда прошол но типер говорит 


Код

XLApp.WorkBooks.Open(NomFich,EmptyParam,EmptyParam,EmptyParam,EmptyParam,
            EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,
                                                                                          EmptyParam,EmptyParam,0);

Not enough actual parametres
 а сам код вот в таком виде
Код

procedure TForm1.BitBtn4Click(Sender: TObject);

var
//XLApp:ExcelApplication;
WorkBk : _WorkBook;
WorkSheet : _WorkSheet;
K, R, X, Y : Integer;
IIndex : OleVariant;
RangeMatrix: Variant;
NomFich : WideString;
XLApp:_Application;

begin
//XLApp:=CreateOleObject('Excel.application');
NomFich :='C:\MyDirectory\NameOfFile.xls';
IIndex := 1;
// Открываем файл 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;


я еще не успел там напартачить (изменение внести). но прога не запускается.
хотелось бы запустит и потом посмотрет как работает. и подганять под себя smile


Заране благадарю за помощь.
MR_TG


Автор: Albinos_x 25.4.2010, 15:06
Цитата(mr_tg @  22.4.2010,  11:09 Найти цитируемый пост)
Uses добавил ExcelXP и отуда прошол но типер говорит 


Цитата(mr_tg @  22.4.2010,  11:09 Найти цитируемый пост)
XLApp.WorkBooks.Open(NomFich,EmptyParam,EmptyParam,EmptyParam,EmptyParam,
            EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,
                                                                                          EmptyParam,EmptyParam,0);


ммм... могу сказать, что это не мой код... поэтому и спросил, читал ли ты статью по ссылке: в твоей команде не хватает двух параметров:
Код

XLApp.WorkBooks.Open(NomFich, EmptyParam, EmptyParam, EmptyParam,
                                       EmptyParam, EmptyParam, EmptyParam, EmptyParam, 
                                       EmptyParam, EmptyParam, EmptyParam, EmptyParam,
                                       EmptyParam, EmptyParam, EmptyParam, 0);

Автор: Norfonzor 19.5.2010, 08:26
Подскажите как указать кол-во листов при создании, добавить/удалить новый лист после последнего в эксел? 

добавление через
Код

ExcelApplication1.Worksheets.Add(Before,1,EmptyParam ,lcid);

не работает

у меня в программе работа с эксел по другому совершенно.
открываю эксел (у меня):
Код

XL := CreateOleObject('Excel.Application');
  try
XL.Visible:=false;
XL.DisplayAlerts:=False;
XL.WorkBooks.Open(ExtractFilePath(Application.Exename)+'LIB\'+Global_test);


в примерах:
Код

ExcelApplication1.AutoConnect:=true;    
ExcelWorkbook1.ConnectTo(ExcelApplication1.Workbooks.OpenXML(OpenDialog1.FileName,EmptyParam));    
ExcelWorksheet1.ConnectTo(ExcelWorkbook1.ActiveSheet as ExcelWorksheet);    
ExcelApplication1.Visible[0]:=true;


это разные способы, если да то как в моем работать с листами?

Автор: Regulum 19.5.2010, 17:38
Это разные способы.
В Вашем варианте будет так.

Добавить новый лист после последнего:
Код

XL.Sheets.Add(After:=XL.Sheets.Item[XL.Sheets.Count]);

XL.Sheets.Count - количество листов
XL.Sheets.Item[i] - i-ый лист, соответственно XL.Sheets.Item[XL.Sheets.Count] - последний лист

Удалить последний лист:
Код

XL.Sheets.Item[XL.Sheets.Count].Delete;



Автор: Akella 25.5.2010, 15:18
Цитата(mr_tg @  22.4.2010,  11:09 Найти цитируемый пост)
ак сказал AKELLA  Uses добавил ExcelXP и отуда прошол но типер говорит 


Цитата(mr_tg @  22.4.2010,  11:09 Найти цитируемый пост)
Not enough actual parametres

он тебе явно говорит, что не хватает параметров или перевести на русский не можешь?

Автор: iglstivens 25.3.2015, 11:24
Цитата(Msl @ 24.3.2006,  07:45)
Обмен данными с Excel.

1. Для затравки и утоления жажды -фрагменты кода с комментариями  (Ishodniki.RU)

Автор: {Fernando Silva-mailto:[email protected]}

В Delphi 5, для обмена данными между Вашим приложением и Excel можно использовать компонент TExcelApplication, доступный на Servers Page в Component Palette. 

Совместимость: Delphi (5.x или выше)

На форме находится 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; 
 


2. есть служба XL Report Support на  http://www.delphikingdom.com/

3. VCL - XL Report - {http://www.afalinasoft.com/rus/} 

4. Если задача серьезнее и есть желание- используй
библиотеки экспорта/импорта:   

     XLSReadWriteII 2.0 works with Delphi 5,6,7 and C++ Builder 5 and 6.
     home: http://www.axolot.com/components/xlsrwii20.htm

Удачи!

Большое спасибо, за данный код, но так как я в программировании новичок, просьба помочь данный код оптимизировать под конкретную задачу. Есть файл Excel с данными, имеется 24 столбца и порядка 10 тысяч строк, в каждой ячейки есть числовое значение. И так же имеются Online значения которые содержаться в другой таблице (принцип размещения значений аналогичный). Необходимо чтобы online таблицу со значениями сравнивали со значениями другой (большой) таблицы и находились схожие строчки по значениям, так как в online-таблице значения постоянно добавляются во время дня, то нужно на перед знать как себя будет вести оборудование в дальнейшем т.е прогнозировать. Так же хотелось что бы в окне отображался график как online-значений так и значений схожих с этими данными чтобы было все наглядно на графики.  

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)