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

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

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

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

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

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

Все говорят "буду..." :) Готового примера нет (точнее есть,но большой), могу подсказать, что изменить в Вашем коде.
...
Рейтинг: 0 / 0
05.08.2019, 08:26
    #39845256
Molchan
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сравнение 2 файлов (.xlsx) посредством Delphi
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
05.08.2019, 08:27
    #39845257
Molchan
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сравнение 2 файлов (.xlsx) посредством Delphi
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
05.08.2019, 08:33
    #39845259
x1ca4064
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сравнение 2 файлов (.xlsx) посредством Delphi
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
05.08.2019, 08:35
    #39845261
Molchan
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сравнение 2 файлов (.xlsx) посредством Delphi
x1ca4064,

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


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

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

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

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

сырцы:

Код: 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
05.08.2019, 09:00
    #39845272
Molchan
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сравнение 2 файлов (.xlsx) посредством Delphi
x1ca4064,

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

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

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

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

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

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

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

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

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

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

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


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