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

Модераторы: Duncon, Naeel Maqsudov, Игорь Акопян, Хыиуду

Ответить
Manolla
Сообщения: 5
Зарегистрирован: 10 авг 2006, 15:50
Откуда: Georgia

уважаемые эксперты специалисты у меня возникла серьёзная проблема в 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
что можно сделать, или где ошибка, как оптимизировать
заранее большое спасибо
Остановите землю и я сойду
Аватара пользователя
Игорь Акопян
Сообщения: 1440
Зарегистрирован: 13 окт 2004, 17:11
Откуда: СПБ
Контактная информация:

1. Для лучшей читабельности кода обрамляйте ваш код при вставке тэгами

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

 ваш код [/code ] - будет сохранено форматирование
2. А через Delphi это делать принципиально? Вроде эта задача может решаться просто средствами Excel
Изображение
Manolla
Сообщения: 5
Зарегистрирован: 10 авг 2006, 15:50
Откуда: Georgia

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

так что либо эксел ругается при этом либо делает не полностью
заранее благодарен
Остановите землю и я сойду
Blood_Magic
Сообщения: 273
Зарегистрирован: 30 июн 2005, 14:53

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

Еще например можно отсортировать по фамилии и искать делением пополам а не в цикле
- Чем юзер похож на обезьяну?
- Он жмет на все, что жмется, дергает все, что дергается и крутит все, что крутится.
- Чем юзер отличается от обезьяны?
- У обезьяны хватает ума не воспроизводить ту последовательность, которая приводит к краху системы.
Аватара пользователя
Игорь Акопян
Сообщения: 1440
Зарегистрирован: 13 окт 2004, 17:11
Откуда: СПБ
Контактная информация:

можно в соседнем VBA форуме поискать ВПР и заодно покурить доку по этой функции в Экселе
она ведёт себя аки Lookup - по-моему как раз ваш случай :)
Изображение
Manolla
Сообщения: 5
Зарегистрирован: 10 авг 2006, 15:50
Откуда: Georgia

Спасибо большое я уже разобрался, импортировал всё в Access и там отсортировал
В любом случае большое спасибо
Остановите землю и я сойду
YurikGL
Сообщения: 142
Зарегистрирован: 16 фев 2005, 21:54
Откуда: Уфа
Контактная информация:

Я бы сохранил из Excel-я в текстовом файле с разделителями ";" и дальше бы уже его раскурочивал...
Manolla
Сообщения: 5
Зарегистрирован: 10 авг 2006, 15:50
Откуда: Georgia

Информация к размышлению:
Я протестировал (тестируемую на Cell3,06) на Pentium 3,2Hgz(время 0,54секунды)
Остановите землю и я сойду
Manolla
Сообщения: 5
Зарегистрирован: 10 авг 2006, 15:50
Откуда: Georgia

это и ясно т.к. программа использует только процессор но настолько очевидной разницы между П4 3,2 и селероном 3,06 я не ожидал
Остановите землю и я сойду
Ответить