Страница 1 из 1

сортировка в Delphi&Ecxel

Добавлено: 10 авг 2006, 16:10
Manolla
уважаемые эксперты специалисты у меня возникла серьёзная проблема в Delphi и Excel
я приведу код:

Код: Выделить всё

var
  Form1: TForm1;
  MyDir: String;
  X1,X2,X3: Variant;
  FirstNameF1,LastNameF1,FirstNameF2,LastNameF2: String;
  F1,F2: Integer;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
  GetDir(0,MyDir);
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  I1,I2,I3: Integer;
begin
  X1:=CreateOleObject('Excel.Application');
  X1.DisplayAlerts:=False;
  X1.WorkBooks.Open(MyDir+'\Output\File1.xls');
  X2:=CreateOleObject('Excel.Application');
  X2.DisplayAlerts:=False;
  X2.WorkBooks.Open(MyDir+'\Output\File2.xls');
  X3:=CreateOleObject('Excel.Application');
  X3.DisplayAlerts:=False;
  X3.WorkBooks.Add;
  F1:=StrToInt(Edit1.Text);
  F2:=StrToInt(Edit2.Text);
  I3:=0;
  for I1:=1 to F1 do
    begin
      FirstNameF1:=X1.Cells[I1,1];
      LastNameF1:=X1.Cells[I1,2];
      for I2:=1 to F2 do
        begin
          FirstNameF2:=X2.Cells[I2,1];
          LastNameF2:=X2.Cells[I2,2];
          if (FirstnameF1=FirstNameF2) and (LastNameF1=LastNameF2) then
              begin
                I3:=I3+1;
                X3.Cells[I3,1].Value:=X1.Cells[I1,1].Value;
                X3.Cells[I3,2].Value:=X1.Cells[I1,2].Value;
                X3.Cells[I3,3].Value:=X1.Cells[I1,3].Value;
                X3.Cells[I3,4].Value:=X1.Cells[I1,4].Value;
                X3.Cells[I3,5].Value:=X1.Cells[I1,5].Value;
                X3.Cells[I3,6].Value:=X2.Cells[I2,3].Value;
                X3.Cells[I3,7].Value:=X2.Cells[I2,4].Value;
              end;
        end;
    end;
  X1.Quit;
  X2.Quit;
  X3.Visible:=True;
end;

end.

код простой он ищет по фамилии и имени одинаковых людей в 2 разных файлах Excel-a, и вставляет данные тех кого находит даже при повторении(надо так) в 3 файл заново созданный.
Проблемма в быстродействии :
При поиске 2 персон (с совпадением 1 записи) в файле с 14664-мя записями ушло 2 минут 05 секунд на Intel Cell3,06GHz.



мне надо искать 34000 персон в итоге он будет искать( приблизительно 708 минут)


:D
что можно сделать, или где ошибка, как оптимизировать
заранее большое спасибо

Добавлено: 11 авг 2006, 11:09
Игорь Акопян
1. Для лучшей читабельности кода обрамляйте ваш код при вставке тэгами

Код: Выделить всё

 ваш код [/code ] - будет сохранено форматирование
2. А через Delphi это делать принципиально? Вроде эта задача может решаться просто средствами Excel

Добавлено: 11 авг 2006, 13:07
Manolla
Спасибо за совет но Excel я не так хорошо знаю для, если не составит труда поподробнее объяснить как это можно в экселе сделать
я хелпа экселовско читал, но не знаю как в фильтре указать куда записывать остальные данные помимо имён и фамилий в 3 файл

так что либо эксел ругается при этом либо делает не полностью
заранее благодарен

Добавлено: 11 авг 2006, 16:32
Blood_Magic
попробуй в StringList например выгрузить значения столбцов 1 и 2, и сравнивать, должно быть быстрее чем через OLE.

Еще например можно отсортировать по фамилии и искать делением пополам а не в цикле

Добавлено: 11 авг 2006, 17:48
Игорь Акопян
можно в соседнем VBA форуме поискать ВПР и заодно покурить доку по этой функции в Экселе
она ведёт себя аки Lookup - по-моему как раз ваш случай :)

Добавлено: 14 авг 2006, 10:28
Manolla
Спасибо большое я уже разобрался, импортировал всё в Access и там отсортировал
В любом случае большое спасибо

Добавлено: 14 авг 2006, 21:13
YurikGL
Я бы сохранил из Excel-я в текстовом файле с разделителями ";" и дальше бы уже его раскурочивал...

Добавлено: 15 авг 2006, 13:59
Manolla
Информация к размышлению:
Я протестировал (тестируемую на Cell3,06) на Pentium 3,2Hgz(время 0,54секунды)

Добавлено: 15 авг 2006, 14:01
Manolla
это и ясно т.к. программа использует только процессор но настолько очевидной разницы между П4 3,2 и селероном 3,06 я не ожидал