HotXLS upoređuje dve radne sveske kroz TXLSXWorkbookCompare, koji uparuje radne listove po imenu, obilazi popunjene ćelije svakog para i prijavljuje šta se razlikuje kao strukturiranu listu zapisa razlika i, na zahtev, kao jednu čitljivu liniju po razlici. Nijedna instalacija Excela nije uključena, a poređenje se izvodi u potpunosti na učitanom modelu objekata u Delphiju ili C++Builderu
Potreba se obično pojavi kada neko prvi put pita šta se promenilo. Finansijska radna sveska se vrati iz pregleda, noćni izvoz se ponovo generiše nakon izmene koda, ili dva odeljenja pošalju verzije istog šablona. Otvaranje oba fajla jedan pored drugog radi za jedan list, a ne uspeva za dvadeset. Poređenje fajlova bajt po bajt ne odgovara ni na šta, jer se dva čuvanja iste radne sveske razlikuju na načine do kojih nikome nije stalo
Šta se računa kao razlika?
Poređenje prijavljuje osam vrsta, i skup je namerno mali: dodat ili uklonjen list, dodata ili uklonjena popunjena ćelija, ćelija čija se vrednost promenila, ćelija čija se formula promenila, i dodat ili uklonjen spojeni opseg. Sve se izražava u odnosu na levu radnu svesku kao osnovu, tako da dodata stavka postoji samo na desnoj strani, a uklonjena samo na levoj
Listovi se uparuju po imenu, a ne po poziciji. Preuređivanje radnih listova zato ne proizvodi nikakve razlike, što je skoro uvek ponašanje koje želite: korisnik koji prevlači karticu nije izmena podataka. List prisutan samo na jednoj strani prijavljuje jedan zapis na nivou lista umesto da proširi svaku popunjenu ćeliju unutra, što izveštaj o dva strukturno različita radne sveske drži čitljivim umesto hiljadu redova dugim
Vrednost ili formula, i kako se svaka upoređuje
Svaka ćelija doprinosi potpisom, a pravilo je jednostavno: ćelija koja nosi formulu upoređuje se po tekstu svoje formule sa vodećim znakom jednakosti, a ćelija bez formule upoređuje se po svojoj vrednosti pretvorenoj u tekst. Ta razlika je bitnija nego što na prvi pogled izgleda. Dve ćelije mogu nositi isti prikazani broj dok je jedna literal, a druga formula, a tretiranje njih kao jednakih bi sakrilo upravo onu izmenu koju je najviše vredno uhvatiti u pregledanoj radnoj svesci
To takođe znači da formula čiji je tekst nepromenjen ne prijavljuje razliku čak i ako se njen keširan rezultat razlikuje, što je ispravno ponašanje za poređenje autorskog sadržaja, a pogrešno ponašanje ako pokušavate da otkrijete odstupanje ponovnog izračunavanja. Za to drugo pitanje, ponovo izračunajte obe radne sveske pre poređenja, tako da vrednosti koje upoređujete budu one koje formule danas zaista proizvode
Pokretanje poređenja
Compare uzima dve učitane radne sveske i vraća broj pronađenih razlika. Lista razlika je zatim dostupna po indeksu, ili se može ispisati u bilo koji TStrings:
uses
lxHandleX, lxCompare;
var
Left, Right: TXLSXWorkbook;
Cmp: TXLSXWorkbookCompare;
Lines: TStringList;
begin
Left := TXLSXWorkbook.Create;
Right := TXLSXWorkbook.Create;
Cmp := TXLSXWorkbookCompare.Create;
Lines := TStringList.Create;
try
if (Left.Open('baseline.xlsx') <> 1) or
(Right.Open('reviewed.xlsx') <> 1) then
Exit;
if Cmp.Compare(Left, Right) = 0 then
Writeln('workbooks are equivalent')
else
begin
Cmp.Report(Lines); // jedna čitljiva linija po razlici
Lines.SaveToFile('workbook-diff.txt');
Writeln(Format('%d difference(s) written', [Cmp.Count]));
end;
finally
Lines.Free;
Cmp.Free;
Right.Free;
Left.Free;
end;
end;
Linija koju proizvede Report glasi kao value changed: Data!A2: 10 -> 99, što je dovoljno za recenzenta i dovoljno za poruku komita. To je strana usmerena ka čoveku. Programska strana je sam zapis razlike, i njega koristite kada poređenje napaja odluku, a ne dokument
Vođenje logike iz strukturiranih razlika
Svaka razlika izlaže svoju vrstu, ime lista, red i kolonu bazirane na jedan za zapise na nivou ćelije, A1 referencu za zapise na nivou spajanja, i levi i desni tekst. Zapisi na nivou lista i na nivou spajanja prijavljuju red i kolonu kao nulu, po čemu ih razlikujete bez pregledanja vrste:
var
I: Integer;
D: TlxCompareDiff;
FormulaEdits: Integer;
begin
FormulaEdits := 0;
for I := 0 to Cmp.Count - 1 do
begin
D := Cmp.Diff(I);
case D.Kind of
lckFormulaChanged:
begin
Inc(FormulaEdits);
Writeln(Format('%s R%dC%d: %s => %s',
[D.Sheet, D.Row, D.Col, D.LeftText, D.RightText]));
end;
lckSheetAdded, lckSheetRemoved:
Writeln(Format('structure: %s', [D.Describe]));
lckMergeAdded, lckMergeRemoved:
Writeln(Format('layout: %s at %s', [D.Describe, D.Ref]));
end;
end;
// Politika pregleda koja blokira samo na izmenama formula
if FormulaEdits > 0 then
raise Exception.CreateFmt(
'%d formula change(s) need sign-off', [FormulaEdits]);
end;
Dva svojstva izlaza vredi znati pre nego što napišete tvrdnje protiv njega. Redosled zapisa na nivou ćelije prati interni redosled obilaska skladišta ćelija, pa testove treba pisati nezavisno od redosleda. A potpis formule nosi sopstveni vodeći znak jednakosti, što znači da string opisa izgrađen konkatenacijom može pokazati udvojeno ==; proveravajte vrednosti polja umesto parsiranja opisne linije kada rezultat pokreće logiku
Gde poređenje radnih svezaka isplati se
Tri upotrebe same opravdavaju funkciju. Regresiono testiranje generatora izveštaja: čuvajte poznato dobru radnu svesku, ponovo generišite, uporedite i pustite izgradnju da padne na svaku neočekivanu razliku. Pregled izmena: dajte recenzentu čitljiv izveštaj umesto dva fajla. I provera migracije: nakon konverzije serije nasleđenih radnih svezaka, uporedite svaki rezultat sa svojim izvorom da dokažete da ništa nije izgubljeno
Taj treći slučaj se prirodno uparuje sa prolazima popisa i revizije opisanim u radnom stolu za reviziju i konverziju radnih svezaka, gde brojanje šta radna sveska sadrži prethodi konverziji, a poređenje sledi nakon nje. Ako se vaše razlike grupišu oko umetnutih redova, pravila prepisivanja referenci u prilagođavanju referenci formula pri umetanju i brisanju objašnjavaju zašto formule koje izgledaju nepromenjeno prijavljuju kao izmenjene
Ograničenja, jasno rečena
Poređenje pokriva vrednosti, formule, spajanja i prisustvo lista. Ne upoređuje formate brojeva, fontove, popune, pravila uslovnog formatiranja, validacije podataka, grafikone, slike ili definisana imena. Ćelija čija je vrednost identična, ali čiji se format promenio iz General u Currency, ne prijavljuje razliku, što je ispravno za poređenje podataka, a nedovoljno za pregled formatiranja
Ćelije sa vrednostima datuma zaslužuju jednu konkretnu opomenu: upoređuju se po svojoj pretvorbi u tekst, tako da radna sveska sačuvana na 1904 sistemu datuma i ona na 1900 sistemu mogu se upoređivati kao jednake ili nejednake na načine koji iznenađuju ako se osnovni serijski brojevi razlikuju. Pravila sistema datuma su obrađena u serijskim brojevima datuma i 1904 sistemu. Kada su formatiranje ili vernost na nivou objekta deo pitanja, kombinujte poređenje sa prolazom revizije koji broji te funkcije na svakoj strani
Poređenje radnih svezaka, revizija i konverzija se izvode na istom pogonu za Delphi i C++Builder; kompletna lista funkcija je na stranici HotXLS Delphi komponente za tabele