Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Программа для сравнения xls Файлов


Автор: Stolzen 30.11.2006, 11:35
Хочу сделать программу для сравнения двух экселевских файлов, т.е. программа должна открыть первый и второй файлы, просканировать их и выдать в результате в третий файл (напр, "result.xls"), то, что есть во втором, но нет в первом.

Сейчас в голове набросал примерный алгоритм работы:

1. Пользователь вводит пути к двум файлам, а так же номера столбцов (напр "А" и "В" - в первом, "С" и "D" - во втором, т.е. это - переменные)

2. программа открывает их.

3. создать копию второго файла и назвать её "result.xls"

4. Запускается цикл:
Код

for i := 1 to (кол-во ячеек первого файла) do
for j := 1 to (кол-во ячеек второго файла) do

if ( (ЯЧЕЙКА A i (т.е текст ячеки №1 1-го файла)) = (ЯЧЕЙКА С j (текст ячеки №2 2-го файла)) ) И (ЯЧЕЙКА B i) = (ЯЧЕЙКА D j)
then  удалить всю строку № j файла "result.xls"


5. Открыть "result.xls"

Может, что-то в этом алгоритме можно реализовать по-другому? (например, цикл)
Какой компанент лучше всего здесь ипользовать (учитывая то, что я с экселем через делфи вообще никогда еще не работал)?


Автор: PROeXT 30.11.2006, 12:03
Можно сделать через ADO и использовать компоненты TDataSet. В таком случае твои Excel файлы будут типа БД...

Автор: Stolzen 30.11.2006, 13:21
Цитата(PROeXT @  30.11.2006,  20:03 Найти цитируемый пост)
Можно сделать через ADO и использовать компоненты TDataSet. В таком случае твои Excel файлы будут типа БД...


На самом деле я из всего этого ничего не понял  smile 

Автор: PROeXT 30.11.2006, 15:57
Счас поищу примерчик...

Для удобства объявим константы:

Код

Const
 ConnectStr='Provider=MSDASQL.1;Persist Security Info=True;Extended Properties="DSN=Файлы Excel;'+
            'DBQ=%s;DefaultDir=%s;DriverId=790;MaxBufferSize=2048;PageTimeout=5;"';
 ErrorConnectToExcel='Ошибка при попытке открыть файл Excel.';
 ErrorFileNotFound='Указанный Вами файл Excel не найден.'; 


Итак, подключение к файлу Excel:

Код

 IF Length(Trim(edSourceFile.Text))=0 Then Exit;
 IF Not FileExists(edSourceFile.Text) Then
 Begin
  ShowMessage(ErrorFileNotFound);
  BitBtnBack.Click;
 End; {IF}
 With DtMdlMain,acExcel Do
 Begin
  IF Connected Then Connected:=False;
  Try       
ConnectionString:=Format(ConnectStr,[edSourceFile.Text,ExtractFilePath(edSourceFile.Text)]);
   Connected:=True;
   aqExcel.SQL.Text:='SELECT * FROM [tfoms_pasp$]';
   aqExcel.Open;
  Except
   ShowMessage(ErrorConnectToExcel);
  End; {Try}
 End; {With}


Самое главное - указать имя страницы (в моем случае это tfoms_pasp). И не забудь добавить к нему (названию) символ $. Он этого очень хочет  smile 

Если все прошло нормально, то в aqExcel(TADOQuery) загружаются все данные твоего Excel файла, представленные в виде таблицы...

Естественно, что операцию, описанную выше, тебе придется повторить дважды... Но, уверен, что ты уже и сам понял, что к чему  smile 

Автор: Stolzen 30.11.2006, 19:49
2 PROeXT: Еще не совсем вкурил, проснусь, с утра на свежую голову гляну... 
Может быть по этому компаненту хелп какой-нить есть? (Как он, кстати, называется, а тоя че-то наити название нигде не могу...)

Автор: PROeXT 30.11.2006, 21:43
В Delphi 7, например, в палитре компонентов есть вкладка... Она так и называется ADO. На ней расположены следующие компоненты:
ADOConnection - для осуществления связи с "физическим" источником данных. В твоем случае в роли такого источника данных выступают файлы Excel
ADOCommand - для выполнения запросов, не возвращающих параметров. Т.е. запросов типа Insert,Delete
ADOTable - Аналогия с TTable (недаром у них общий предок TDataSet)
ADOQuery - Аналогия с TQuery. Если у меня вдруг появляется задача, аналогичная твоей - я использую тока его, так как люблю контролировать весь процесс... А как это еще можно сделать без запросов?

Тебе нужно твой ADOTable/ADOQuery просто привязать к настроенному ADOConnection (см. пример выше), и все получится...

PS. В моем примере (выше), acExcel - Это компонент TADOConnection, а aqExcel - TADOQuery  smile 

Автор: Stolzen 1.12.2006, 00:09
2 PROeXT, 

Приду днем с института, обмозгую, попробую написать прогу.

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