powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Сравнение 2 файлов (.xlsx) посредством Delphi
25 сообщений из 55, страница 1 из 3
Сравнение 2 файлов (.xlsx) посредством Delphi
    #39845237
Molchan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день. Задача такая, имеется 2 Excel файла с расширением .xlsx. Необходимо узнать имеется ли каждая запись первого файла во втором. В каждом файле порядка 8000 строк. Если сравнитьвать посредством OLE получается долго. Куда копать, как быть? Сильно не ругайте, новичок.
...
Рейтинг: 0 / 0
Сравнение 2 файлов (.xlsx) посредством Delphi
    #39845239
x1ca4064
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Molchan Если сравнитьвать посредством OLE получается долго. Куда копать, как быть?

Зависит от того, как через ОЛЕ работаете: если через Cells, это одно, а если через Range и все равно медленно, это другое.
...
Рейтинг: 0 / 0
Сравнение 2 файлов (.xlsx) посредством Delphi
    #39845241
Molchan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
x1ca4064,

Получаю данные с ексель в массив, загружаю в StringGrid. Дальше в счетчиком по строчно проверяю..
...
Рейтинг: 0 / 0
Сравнение 2 файлов (.xlsx) посредством Delphi
    #39845243
x1ca4064
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Molchanx1ca4064,

Получаю данные с ексель в массив

Эту часть можно реализовать через Cells (пробегая в цикле) или через Range (сразу вариантный массив)
...
Рейтинг: 0 / 0
Сравнение 2 файлов (.xlsx) посредством Delphi
    #39845244
Molchan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Может есть какая то возможность запихать данные во временную таблицу и уже по этой таблице SQL запросами найти что есть, чего нет?
...
Рейтинг: 0 / 0
Сравнение 2 файлов (.xlsx) посредством Delphi
    #39845245
Molchan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
x1ca4064,

Пример можно, если есть? Хотя бы кусок. Буду благодарен!
...
Рейтинг: 0 / 0
Сравнение 2 файлов (.xlsx) посредством Delphi
    #39845248
x1ca4064
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Molchanx
Пример можно, если есть? Хотя бы кусок. Буду благодарен!

Все говорят "буду..." :) Готового примера нет (точнее есть,но большой), могу подсказать, что изменить в Вашем коде.
...
Рейтинг: 0 / 0
Сравнение 2 файлов (.xlsx) посредством Delphi
    #39845256
Molchan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
x1ca4064,

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
for I:= 8 to StringGrid1.RowCount do
begin
for J:= 7 to StringGrid2 do
begin
if AnsiCompareText(StringGrid1.Cells[11, i], StringGrid2.Cells[3, j] = 0) then
begin
 // выполняем действия
break;
end;
end;
end;
...
Рейтинг: 0 / 0
Сравнение 2 файлов (.xlsx) посредством Delphi
    #39845257
Molchan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Molchanx1ca4064,

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
for I:= 8 to StringGrid1.RowCount do
begin
for J:= 7 to StringGrid2 do
begin
if AnsiCompareText(StringGrid1.Cells[11, i], StringGrid2.Cells[3, j] = 0) then
begin
 // выполняем действия
break;
end;
end;
end;



for J:= 7 to StringGrid2.RowCount do
...
Рейтинг: 0 / 0
Сравнение 2 файлов (.xlsx) посредством Delphi
    #39845259
x1ca4064
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Molchanx1ca4064,

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
for I:= 8 to StringGrid1.RowCount do
begin
for J:= 7 to StringGrid2 do
begin
if AnsiCompareText(StringGrid1.Cells[11, i], StringGrid2.Cells[3, j] = 0) then
begin
 // выполняем действия
break;
end;
end;
end;



Короче, кода нет. У Вас скорее всего, тормоза в 2 местах:
1. Получение данных - там поможет Range
2. Поиск данных - там поможет сортировка
2.5 ну и данные храните в массиве, а не в гриде.
...
Рейтинг: 0 / 0
Сравнение 2 файлов (.xlsx) посредством Delphi
    #39845261
Molchan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
x1ca4064,

1. Данные так и есть, получаю в массив.\
2. По поводу сортировки, можете поподробней?
3. Понял, не буду грузить в грид.
...
Рейтинг: 0 / 0
Сравнение 2 файлов (.xlsx) посредством Delphi
    #39845265
x1ca4064
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Molchanx1ca4064,
2. По поводу сортировки, можете поподробней?


Вы решаете такую задачу: для каждой строки из Массива1 ищете, есть ли такая же в Массиве2. В текущей реализации для поска в Массиве2 Вы его просматриваете полностью (8000 операций, грубо), а если Массив2 отсортировать, можно будет использовать двоичный поиск (13 операций, примерно).
...
Рейтинг: 0 / 0
Сравнение 2 файлов (.xlsx) посредством Delphi
    #39845268
Molchan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
x1ca4064,

Тяжело без примера :( Полезу в help..
...
Рейтинг: 0 / 0
Сравнение 2 файлов (.xlsx) посредством Delphi
    #39845269
x1ca4064
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Molchanx1ca4064,

Тяжело без примера :( Полезу в help..

Посмотрите TList, TStringList. У меня осталось подозрение, что тормоза могут быть и в части получения данных: проверьте скорость работы без поиска строк. С другой стороны, отсортировать можно и в Excel :)
...
Рейтинг: 0 / 0
Сравнение 2 файлов (.xlsx) посредством Delphi
    #39845270
Фотография LocksmithPC
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Занимался когда то такой ерундой, но плюнул. Задача идиотская.

сырцы:

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
180.
181.
182.
183.
184.
185.
186.
187.
188.
189.
190.
191.
192.
193.
194.
195.
196.
197.
198.
199.
200.
201.
202.
203.
204.
205.
206.
207.
208.
209.
210.
211.
212.
213.
214.
215.
216.
217.
218.
219.
220.
221.
222.
223.
224.
225.
226.
227.
228.
229.
230.
231.
232.
233.
234.
235.
236.
237.
238.
239.
240.
241.
242.
243.
244.
245.
246.
247.
248.
249.
250.
251.
252.
253.
254.
255.
256.
257.
258.
259.
260.
261.
262.
263.
264.
265.
266.
267.
268.
269.
270.
271.
272.
273.
274.
275.
276.
277.
278.
279.
280.
{$APPTYPE CONSOLE}

program SheetsCompare;

uses
  ActiveX, Classes, ComObj, Mainunit, SysUtils, Variants;

const
  cVector: array [0..3] of Char = (
    '?', '-', '|', '\');
    
type
  TVector = (vUnd, vRow, vCol, vRnC);

  TSheetRec = record
    fFileName: string;
    fSheetName: string;
    fRow: Integer;
    fCol: Integer;
    fVector: TVector;
    fBreakFlag: string;

    fList: TStringList;
    fError: string;
  end;

  TSheetsCompare = class(TObject)
  private
    { Private declarations }
    fMainList: TStringList;
    fResultList: TStringList;

    fSheets: array of TSheetRec;

    function LoadSheetCalc(const ASheetRec: TSheetRec): Boolean;
    function LoadSheetExcel(const ASheetRec: TSheetRec): Boolean;

    function CompareSheets: Boolean;
    function ParseParams: Boolean;
  public
    { Public declarations }
    constructor Create;
    destructor Destroy; override;

  end;

var
  hSheetsCompare: TSheetsCompare;

{ TSheetsCompare }

{ Private declarations }

function TSheetsCompare.LoadSheetCalc(const ASheetRec: TSheetRec): Boolean;
begin
  Result := False;

end;

function TSheetsCompare.LoadSheetExcel(const ASheetRec: TSheetRec): Boolean;
var
  vExcel: Variant;
  vSheet: Variant;

  sBuffer: string;

  iRow: Integer;
  iCol: Integer;

begin
  Result := False;

  vExcel := CreateOleObject('Excel.Application');
  try
    with ASheetRec do
      if FileExists(fFileName) then
        begin
          vExcel.WorkBooks.Open(FileName := fFileName, ReadOnly := True);

          vSheet := vExcel.ActiveWorkBook.ActiveSheet;

          iRow := fRow; iCol := fCol;
          sBuffer := vSheet.Cells[iRow, iCol];

          if fVector <> vUnd then
            while Trim(sBuffer) <> fBreakFlag do
              begin
                fMainList.Add(sBuffer);
                fList.Add(sBuffer);

                if fVector = vRow then
                  Inc(iRow);

                if fVector = vCol then
                  Inc(iCol);

                if fVector = vRnC then
                  begin
                    Inc(iRow);
                    Inc(iCol);
                  end;

                sBuffer := vSheet.Cells[iRow, iCol];
              end;

          vSheet := Unassigned;

          vExcel.WorkBooks.Close;
        end
      else
        fResultList.Add(Concat('File: "', fFileName, '" not found'));

  finally
    vExcel.Quit;
    vExcel := Unassigned;

  end;

end;

function TSheetsCompare.CompareSheets: Boolean;
var
  bError: Boolean;

  pCount: Integer;
  iCount: Integer;

  sBuffer: string;

  iResult: Integer;

  sResult: Char;

begin
  Result := False;

  for pCount := 0 to ParamCount - 1 do
    LoadSheetExcel(fSheets[pCount]);

  with fMainList do
    for iCount := 0 to Count - 1 do
      begin
        Result := True;

        sBuffer := Concat('Value: <', Strings[iCount], '>');;
        for pCount := 0 to ParamCount - 1 do
          with fSheets[pCount] do
            begin
              bError := not fList.Find(Strings[iCount], iResult);
              if bError then
                begin
                  sResult := 'Н';
                  Result := False;
                end
              else
                sResult := 'Д';

              sBuffer := Concat(sBuffer, #9, sResult);
            end;

        if not Result then           
          fResultList.Add(sBuffer);
      end;
end;

function TSheetsCompare.ParseParams: Boolean;
var
  pCount: Integer;

begin
  Result := True;

  for pCount := 0 to ParamCount - 1 do
    with fSheets[pCount] do
      begin
        Writeln(Concat('File name:', #9, fFileName));
        Writeln(Concat('Sheet name:', #9, fSheetName));
        Writeln(Concat('Row:', #9, IntToStr(fRow)));
        Writeln(Concat('Col:', #9, IntToStr(fCol)));
        Writeln(Concat('Vector:', #9, cVector[Integer(fVector)]));
        Writeln(Concat('Flag:', #9, fBreakFlag));
      end;

end;

{ Public declarations }

constructor TSheetsCompare.Create;
var
  iCount: Integer;
  sBuffer: string;

begin
  inherited Create;

  SetLength(fSheets, ParamCount);

  for iCount := 1 to ParamCount do
    with fSheets[iCount - 1] do
      begin
        fFileName := ExtractWord(1, ParamStr(iCount), ['#']);
        fSheetName := ExtractWord(2, ParamStr(iCount), ['#']);

        fRow := StrToIntDef(ExtractWord(3, ParamStr(iCount), ['#']), -1);
        fCol := StrToIntDef(ExtractWord(4, ParamStr(iCount), ['#']), -1);

        fVector := vUnd;
        
        sBuffer := ExtractWord(5, ParamStr(iCount), ['#']);
        sBuffer := AnsiUpperCase(sBuffer);

        if sBuffer = 'ROW' then
          fVector := vRow;
        if sBuffer = 'COL' then
          fVector := vCol;
        if sBuffer = 'RNC' then
          fVector := vRnC;

        fBreakFlag := ExtractWord(6, ParamStr(iCount), ['#']);

        fList := TStringList.Create;
        fList.Sorted := True;
      end;

  fMainList := TStringList.Create;
  with fMainList do
    begin
      Sorted := True;
      Duplicates := dupIgnore;
    end;

  fResultList := TStringList.Create;
end;

destructor TSheetsCompare.Destroy;
var
  iCount: Integer;

begin
  with fResultList do
    begin
      SaveToFile('SheetsCompare.log');
      Free;
    end;

  fMainList.Free;

  for iCount := 0 to ParamCount - 1 do
    with fSheets[iCount] do
      fList.Free;

  SetLength(fSheets, 0);

  inherited Destroy;
end;

begin
  CoInitialize(nil);

  if ParamCount > 1 then
    begin
      hSheetsCompare := TSheetsCompare.Create;
      with hSheetsCompare do
        try
          if ParseParams then
            CompareSheets;

        finally
          Free;

        end;
    end
  else
    begin
      Writeln('Error: Params count mismatch');

    end;

  CoUninitialize;
end.




мануал:

Программа для сравнения произвольных *.xls файлов. Сравнивает в длинну, ширину и глубину. Альфа.

Параметры запуска:

SheetsCompare.exe C:\SheetsCompare\Data\Journal1.xls#Лист1#2#2#Row# C:\SheetsCompare\Data\Journal2.xls#Лист1#2#3#Col# C:\SheetsCompare\Data\Journal3.xls#Лист1#1#1#RnC#654

C:\SheetsCompare\Data\Journal1.xls# - полный путь к файлу
Лист1# - имя листа (не работает)
2# - строка
2# - столбец
Row# - вектор данных (Row - вниз, Col - вправо, RnC - правониз (диагональ по чухонски),
неопознанный вектор устанавливается в Und(efined) программа возьмет только данные стартовой ячейки)
Конец - флаг остановки (если не указать этот параметр, прога остановится на первой пустой ячейке,
а если указать, но прога его не найдет - вылетит бряк. (щёчик прикрутить штоле...))

Протокол выпадет в *.log файл.

Туду:

Доработать выбор листа: "Лист1" (пока отрабатывает только первый лист), добавить обработку *.odt, отвязатся от excel`я.


Написано на коленке под острой интоксикацией коньяком. Не обессудь.
...
Рейтинг: 0 / 0
Сравнение 2 файлов (.xlsx) посредством Delphi
    #39845272
Molchan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
x1ca4064,

Получение данных происходит быстро.. Пользователь не будет сам сортировать, выгружаю в Excel и прога должна сразу обработать...
...
Рейтинг: 0 / 0
Сравнение 2 файлов (.xlsx) посредством Delphi
    #39845273
Molchan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
LocksmithPC,

Спасибо.
...
Рейтинг: 0 / 0
Сравнение 2 файлов (.xlsx) посредством Delphi
    #39845283
Фотография defecator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
MolchanДобрый день. Задача такая, имеется 2 Excel файла с расширением .xlsx. Необходимо узнать имеется ли каждая запись первого файла во втором. В каждом файле порядка 8000 строк. Если сравнитьвать посредством OLE получается долго. Куда копать, как быть? Сильно не ругайте, новичок.

Подобную задачу проще решить родными средствами Excel - скриптами
...
Рейтинг: 0 / 0
Сравнение 2 файлов (.xlsx) посредством Delphi
    #39845284
ёёёёё
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MolchanПолучаю данные с ексель в массив, загружаю в StringGrid. Дальше в счетчиком по строчно проверяю..
"Твою ж мать..." - (с)
...
Рейтинг: 0 / 0
Сравнение 2 файлов (.xlsx) посредством Delphi
    #39845295
Molchan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
defecator,

Если бы нужно было просто сравнить, то не написал бы в этой ветке..
...
Рейтинг: 0 / 0
Сравнение 2 файлов (.xlsx) посредством Delphi
    #39845299
Фотография defecator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Molchandefecator,

Если бы нужно было просто сравнить, то не написал бы в этой ветке..

написано в первом посте, что
Molchanимеется 2 Excel файла с расширением .xlsx. Необходимо узнать имеется ли каждая запись первого файла во втором.

и больше ничего иного
...
Рейтинг: 0 / 0
Сравнение 2 файлов (.xlsx) посредством Delphi
    #39845308
982183
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YouTube Video
...
Рейтинг: 0 / 0
Сравнение 2 файлов (.xlsx) посредством Delphi
    #39845319
ёёёёё
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Molchan,

пробегаешься по первой табличке, берешь текстовое представление каждой строки, помещаешь его в словарь. В качестве ключа используешь строку, в качестве значения - "ничего".

Затем пробегаешься по второй табличке, также берешь текстовое представление каждой строки и проверяешь наличие ее в словаре.
...
Рейтинг: 0 / 0
Сравнение 2 файлов (.xlsx) посредством Delphi
    #39845322
Molchan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
defecator,

Ветка то Delphi, думаю говорит само за себя.. Долой разговоры:) По делу подсказать сможешь что?
...
Рейтинг: 0 / 0
Сравнение 2 файлов (.xlsx) посредством Delphi
    #39845324
ёёёёё
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Molchan...

Какой из предложенных способов ты выбрал?
...
Рейтинг: 0 / 0
25 сообщений из 55, страница 1 из 3
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Сравнение 2 файлов (.xlsx) посредством Delphi
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]