HotXLS može ponovo da napiše jedan radni list unutar postojećeg XLSX paketa bez parsiranja ili ponovnog komprimovanja ostatka fajla. TXLSDirectWriter.BeginPatch otvara izvorni paket, kopira svaki unos osim ciljnog lista sa njegovim komprimovanim bajtovima doslovno, i dozvoljava vam da ponovo napišete taj jedan list kroz obične pozive AddSheet, AddRow i Write*. Grafikoni, pivot keš memorije, teme, stilovi i deljeni stringovi se nikada ne dekomprimuju
Tok rada koji ovo rešava pojavljuje se u izveštavanju i osvežavanju podataka. Radna sveska stiže od poslovnog tima noseći pivot tabele, isečke, uslovno formatiranje i deceniju akumuliranog formatiranja. Svake noći jedan list podataka treba zameniti svežim brojevima. Učitavanje i ponovno čuvanje cele radne sveske košta minute po fajlu i, što je važnije, rizikuje vernost na funkcijama koje modul za učitavanje mora da rekonstruiše. Zakrpljivanje zaobilazi oba problema tako što ne dira ono što ne mora da dirne
Zašto je kopiranje komprimovanih bajtova zanimljiv deo?
Zip unos koji se kopira na komprimovanom nivou košta jedno kopiranje toka. Isti unos proveden kroz normalnu putanju pisanja košta inflaciju pri ulasku i deflaciju pri izlasku, a deflacija je skuplja polovina. Na radnoj svesci sa velikim pivot keš memorijom i nekoliko desetina ugrađenih slika, ta razlika je razlika između zakrpe koja se završi za vreme potrebno da se upiše novi list i one koja provede najveći deo vremena rekomprimujući bajtove koje nikada nije ni pregledala
HotXLS koristi CopyCompressedFrom za ovo, koji upisuje komprimovane bajtove izvornog unosa direktno u ciljnu arhivu. Kada unos ne može biti kopiran na taj način, jer koristi drugačiji metod kompresije ili slabu enkripciju, pisač se vraća na dekomprimovano kopiranje toka umesto da ne uspe. Markeri direktorijuma se preskaču, jer pisač proizvodi svoje sopstvene
Zamena na mestu, ili pisanje u novi fajl
Dva preklopljena poziva pokrivaju dva oblika koje ovaj zadatak može poprimiti. Oblik na mestu pripremi rezultat u privremenom fajlu pored originala, zatvori ručku izvora, zatim obriše i preimenuje, tako da rušenje usred pisanja ostavlja original netaknutim. Oblik sa eksplicitnim ciljem ostavlja izvor netaknutim i može ili zameniti list ili dodati novi:
var
W: TXLSDirectWriter;
begin
W := TXLSDirectWriter.Create;
try
W.BeginPatch('monthly-dashboard.xlsx', 'Data'); // na mestu
W.AddSheet('Data');
W.AddRow(1);
W.WriteString(1, 'Region');
W.WriteString(2, 'Revenue');
W.AddRow(2);
W.WriteString(1, 'North');
W.WriteNumber(2, 184320.55);
W.AddRow(3);
W.WriteFormula(1, '=SUM(B2:B2)');
W.Close;
finally
W.Free;
end;
end;
Varijanta umetanja uzima izvor i ciljnu putanju plus InsertSheet:
// Izvor ostaje netaknut; cilj dobija dodatni radni list nazvan Extra
W.BeginPatch('template.xlsx', 'output.xlsx', 'Extra', True);
W.AddSheet('Extra');
W.AddRow(1);
W.WriteString(1, 'appended by the nightly job');
W.Close;
Umetanje je deo koji zahteva pravu hiruršku knjigovodstvenu preciznost. Pisač parsira registar listova u xl/workbook.xml i mapu relacija koja vezuje svaki list za njegov deo, zatim bira sledeći slobodan broj dela, identifikator lista i identifikator relacije. Tipovi relacija prate konvencije izvornog paketa, pa zakrpljivanje stroge ISO 29500 radne sveske emituje stroge tipove relacija, a zakrpljivanje prelazne emituje prelazne tipove
Šta zakrpa namerno odbacuje i ograničava
Lanac izračunavanja se odbacuje u oba režima. U režimu zamene njegovi unosi opisuju ćelije u listu koji više ne postoji u tom obliku; u režimu umetanja pomeranje indeksa lista ga potpuno poništava. Excel ponovo izgrađuje lanac pri sledećem preračunavanju, pa je odbacivanje ispravno, ne gubitničko. Deo je izostavljen iz kopije, a njegov unos relacije i preklapanje tipa sadržaja su hirurški uklonjeni
Dve semantike autorstva se menjaju unutar zakrpe, i obe slede isto načelo: zakrpa ne sme da poremeti delove koje nije prepisala. Stringovi se pišu direktno u list umesto da se dodaju u tabelu deljenih stringova, jer izvorna tabela prelazi netaknuta. A StyleIndex upućuje na unose u cellXfs izvornog paketa, ne na tabelu stilova koju pisač gradi. To znači da možete referencirati formate koje originalna radna sveska već definiše, što je obično upravo ono što osvežavanje podataka želi, ali takođe znači da morate znati koji indeks nosi koji format
// Unutar zakrpe, StyleIndex indeksira cellXfs IZVORNOG paketa.
// Datum treba eksplicitan indeks koji se tamo mapira na format datuma:
W.WriteDateTime(3, EncodeDate(2026, 8, 22), DateStyleIndexFromTemplate);
// Preklopljena verzija WriteDateTime bez stila se odbija u režimu
// zakrpe, jer pretpostavlja sopstvenu tabelu stilova pisača, koju
// zakrpa nikada ne pravi
Šest ulaznih tačaka autorstva je ograđeno: dodavanje tabela, grafikona, slika, komentara, definisanih imena i stilova ćelija sve podiže izuzetak u režimu zakrpe, sa drugom sigurnosnom mrežom u trenutku zatvaranja koja ne uspe ako je bilo koji od njihovih brojača različit od nule. Svaka od tih funkcija bi zahtevala uređivanje delova koje zakrpa kopira doslovno, a pola-uređen paket je gori od odbijene operacije. Tačno jedan list može biti zakrpljen po operaciji
Kada zakrpiti, a kada učitati
Zakrpljivanje je pravi alat kada je radna sveska velika, izmena je ograničena na jedan list, a ostatak fajla mora preživeti bit po bit. Pogrešan je alat kada izmena obuhvata nekoliko listova, kada je potrebno novo formatiranje ili novi objekti, ili kada je fajl dovoljno mali da normalno učitavanje i čuvanje ne košta ništa. Za masovno generisanje od nule, putanja striminga opisana u pisaču direktnog striminga ostaje bolji izbor, i deli isti API AddRow i Write*, pa je prelazak između dva mehanički
Manipulacija na nivou lista unutar učitane radne sveske, kada zaista želite pun model objekata, obrađena je u dupliranju radnih listova u XLSX paketima. A ako je razlog zbog kog razmišljate o zakrpi to što je obrada cele radne sveske postala spora, merenja i ponašanje memorije u performansama velikih radnih svezaka vredi pročitati pre biranja pristupa
Provera da li je zakrpa zaista uradila ono što mislite
Tri provere hvataju gotovo svaku grešku. Potvrdite da su delovi koje ste očekivali da prežive i dalje u arhivi, da je xl/calcChain.xml nestao, i da ponovno otvaranje fajla kroz TXLSXWorkbook prijavljuje broj listova koji očekujete, nepromenjen za zamenu i uvećan za jedan za umetanje. Čitanje zakrpljenog lista i poređenje nekoliko vrednosti i formula zatvara petlju
Jedan detalj implementacije iz razvoja ove funkcije vredi ponoviti, jer može ujesti svakog ko piše sličan kod na nivou zip-a. Imena delova radnog lista se upoređuju po prefiksu, a greška od jedan u dužini prefiksa znači da predikat nikada ne pogodi, pa novoupisan deo sudara se sa postojećim imenom, a čitači koji uzmu poslednji unos sa datim imenom tiho biraju pogrešan list. Ako se čini da zakrpa zamenjuje sadržaj dva lista, prvo pogledajte poklapanje imena pre nego XML
Zakrpljivanje na mestu, striming pisanje i pun model objekata radne sveske isporučuju se u istoj biblioteci za Delphi i C++Builder; lista funkcija je na stranici HotXLS Delphi komponente za tabele