Napravili ste jedan list potpuno kako treba. Zaglavlje je spojeno, širine kolona odgovaraju podacima, prve dve vrste su zamrznute, oblast štampe i margine su podešene za čist A4 izvoz, a kartica je obojena tako da je finansije lako pronađu. Sada izveštaju treba dvanaest takvih, po jedan za svaki region, svi sa istim rasporedom. Ponovno građenje tog lista u kodu dvanaest puta je način da se ušunja tiho odstupanje: region 7 dobije kolonu za jedan poen užu, region 11 izgubi zamrzavanje i niko to ne primeti dok PDF ne stigne do menadžera. Ono što vam zaista treba jeste programska verzija Excelove desne tipke, Move or Copy, Create a copy: uzmite završeni list i napravite nezavisne duplikate
XLSX engine u HotXLS-u, nativna Delphi i C++Builder biblioteka koja čita i piše Excel datoteke bez automatizovanja samog Excela, već je mogao da pomera listove, briše listove i kopira opsege ćelija između listova. Ono što nije mogao sve do v2.91.0 bilo je da klonira ceo radni list u jednom pozivu. To izdanje dodaje dve ulazne tačke: TXLSXWorksheet.CopyFromTXLSXWorksheet.CopyFromTXLSXSheets.Duplicate, koji kopira stanje na nivou lista sa jednog radnog lista na drugi, i CopyFromTXLSXSheets.Duplicate
, koji dodaje novi list i za vas pokreće
CopyFromDuplicate. Zanimljiv deo nije to što kopira stvari. To je namerna linija povučena između onoga što se duboko kopira i onoga što se ne kopira, i zašto je ta linija baš tu.Items[]Jedan poziv za kloniranje gotovog lista1Operacija na visokom nivou je 0Duplicatenil. Prosledite joj 1-zasnovani indeks izvornog lista i dobićete potpuno novi radni list koji preslikava raspored i podatke originala. Konvencija indeksa odgovara
var
Book: TXLSXWorkbook;
Template, Copy: TXLSXWorksheet;
begin
Book := TXLSXWorkbook.Create;
try
Template := Book.Sheets.Add('Template');
Template.Cells[1, 1].Value := 'Quarterly Statement';
Template.Range['A1:C1'].Merge;
Template.ColWidth[1] := 18;
Template.FreezePanes(2, 1); // freeze top row + first column
Template.TabColorIsAuto := False;
Template.TabColor := $FF1F4E79;
// Clone with an explicit name...
Copy := Book.Sheets.Duplicate(1, 'Region-North');
// ...or let it pick the Excel-style default name.
Copy := Book.Sheets.Duplicate(1); // -> "Template (2)"
Book.SaveAs('regions.xlsx');
finally
Book.Free;
end;
end;
Items[]FreezePanes na XLSX strani, pa je prvi list indeks FreezePanes(ARow, ACol)1Cells[Row, Col], a ne Duplicate0Copy; ako prosledite indeks van opsega, dobijate CopynilSystem umesto izuzetka, istu ugovornu grešku koju koristi i ostatak XLSX kolekcije listova.CopyDve stvari u tom isječku vredi usporiti. Prvo, DuplicateFreezePanes
prima argumente red-po-red,
FreezePanes(ARow, ACol)(2), pa se poravnava sa indeksiranjem TemplateCells[Row, Col]Template (2); duplikat nasleđuje potpuno isti prelom zamrzavanja. Drugo, metoda je nazvana Template (3)DuplicateTemplate (2) a ne očiglednije
CopyRegion-North, i to nije stilistička preferencija. Region-SouthCopy(2) je standardna rutina u jedinici (3)System
Šta CopyFrom duboko kopira
Ispod haube, Duplicate dodaje list i zatim poziva CopyFrom(ASource), što možete da pozovete i direktno kada želite da klonirate na list koji ste već napravili. CopyFrom štiti od dva degenerisana slučaja unapred: kopiranje sa nil, ili kopiranje lista na samog sebe, oba odmah vraćaju i ne rade ništa. Sve posle toga je sama kopija, i ona je namerno široka
Podaci o ćelijama dolaze prvi. CopyFrom traži od izvora njegov UsedRange, usku boks-granicu popunjenih ćelija i spojenih regiona, i ponovo koristi postojeću CopyRangeTo mehaniku da prenese svaku vrednost, formulu i indeks stila po ćeliji na cilj počevši od A1. Pored ćelija, ponavlja čitav sloj stanja na nivou lista koji predložak čini dovršenim:
- Spojeni opsezi, ponovo kreirani po koordinatama tako da baner zauzme isti pravougaonik
- Širine kolona i visine redova, plus liste za skriveno, skupljeno i outline nivo, kopirane doslovno tako da nestandardni redovi i kolone ostanu potpuno poravnati
- Freeze panes i stanje prikaza: nivo zuma, prikaz mreže i nula vrednosti, smer desno-levo i tip prikaza
- Stanje zaštite sa opcijama dozvola po akciji, tako da zaključani predložak ostane zaključan na isti način
- Čitav blok podešavanja stranice: margine, orijentacija, veličina papira, skaliranje i fit-to-page, oblast štampe, naslovi štampe, zaglavlja i podnožja, i zastavice print-gridlines i print-headings
- Opseg AutoFilter-a, boja kartice i vidljivost lista
Rezultat je list koji štampa, filtrira i prikazuje se identično svom izvoru. I pošto se ćelije, spojevi i liste dimenzija fizički ponovo kreiraju na novom listu umesto da budu alijasi, duplikat je potpuno nezavisan. Upišite 999 u ćeliju na kopiji i izvor zadržava svoju originalnu vrednost; ta nezavisnost je najvažnija osobina klona namenjenog paralelnim regionalnim izveštajima, a isporučeni SheetCopy demo to izričito proverava
Šta ostavlja plitko, i zašto
Sada iskreni deo. Grafikoni, ugrađene slike, XLSX tabele, validacije podataka i pravila uslovnog formatiranja nisu kopirani. To je dokumentovana, namerna granica, ne previd, i vredi razumeti razlog da biste mogli da planirate oko nje umesto da vas iznenadi
Svaka od tih kolekcija nosi identitet i reference koje ne preživljavaju naivno kopiranje polja. Grafikon pokazuje na izvorni opseg podataka i poseduje drawing relationship u OOXML paketu; kloniranje objekta bez preslikavanja relacije i referenci serija proizvodi grafikon koji se prikazuje nad pogrešnim podacima, ili paket koji Excel označi kao oštećen. Tabela ima ime koje mora biti jedinstveno unutar radne sveske, red zaglavlja vezan za konkretne kolone i svoju automatski generisanu relaciju. Uslovno formatiranje i validacije podataka su vezani za koordinatne opsege i, u slučaju validacije, mogu referencirati druge opsege formulom. Duboko kopiranje bilo čega od ovoga kako treba znači prepisivanje referenci i pravljenje novih identiteta, što je stvaran posao sa stvarnim tačkama otkaza. Uraditi to napola, kopirati objekat ali ne i njegove reference, gore je nego ne kopirati uopšte: dobijate datoteku koja se otvara sa porukom o popravci i tiho gubi sadržaj. Zato engine kopira stvari koje može čisto da kopira, a kolekcije koje nose reference ostavlja pozivaocu, koji zna na šta cilj treba da pokazuje
U praksi to znači da je tok rada za bogatiji predložak: duplirajte list da dobijete ćelije, raspored i podešavanje štampe, a zatim ponovo izgradite grafikon, tabelu, validacije ili uslovno formatiranje na kopiji istim API-jem koji ste koristili prvi put. Pošto ih ponovo stvarate nad sopstvenim opsezima duplikata, reference izlaze ispravne po konstrukciji. Za grafikon koji čita A1:C10, dodajte novi grafikon na kopiji koji pokazuje na kopijino A1:C10; za AutoFilter koji želite da ostane živ, imajte na umu da opseg filtera prelazi preko, pa morate samo ponovo da primenite kriterijume kolona. Pravila uslovnog formatiranja i validacije podataka koje biste ponovo dodali kroz iste pozive opisane u članku o spojenim ćelijama i rasporedu predložaka izveštaja , koji prolazi kroz tabelu spojeva i model opsega koji kopija nasleđuje.Gde dupliranje spada u izveštajni pipeline
Dupliranje radnog lista je prirodan pratilac generisanja zasnovanog na tokenima. Pristup sa usidrenim tokenima u
vodiču za generisanje izveštaja iz predloška u Delphiju rešava problem upisivanja podataka u raspored koji drugi ljudi uređuju; dupliranje rešava problem potrebe za tim rasporedom mnogo puta u jednoj radnoj svesci. Spojite ih i obrazac je čist: držite jedan netaknut list sa svojim tokenima, spojevima i podešavanjem štampe, a zatim za svaki region ili period pozovite Template, popunite tokene klona podacima iz te sekcije i nastavite dalje. Netaknuti predložak se nikada ne menja, pa ostaje pouzdan izvor za sledeći klon, a svaki izlazni list kreće od rasporeda identičnog bajt za bajt.DuplicateJedna napomena o redosledu štedi čitavu klasu zabuna. Duplirajte list
pre nego što ga napunite podacima, a ne posle. Predložak treba da nosi strukturu i formatiranje, ne brojke iz prošlog kvartala, a kloniranje praznog stilizovanog lista znači da svaki duplikat počinje čist. Ako duplirate list koji već nosi podatke, ti podaci idu zajedno sa njim, jer verno kopira korišćeni opseg; to je povremeno baš ono što želite, ali za izveštaj sa grananjem obično nije.CopyFrom kopira korišćeni opseg verno; to je povremeno baš ono što želite, ali za izveštaj sa grananjem obično nije
Brza navika provere
Pošto je podela između dubokog i plitkog kopiranja nevidljiva dok je ne potražite, ubacite petolinijsku proveru u posao umesto da verujete da je sve preneto. Posle dupliranja, pročitajte nazad strukturne signale koje klon treba da nasledi i potvrdite da se poklapaju sa izvorom
Copy := Book.Sheets.Duplicate(1, 'Region-North');
WriteLn(Format('merged=%d colA=%.1f freezeRow=%d tabAuto=%d',
[Copy.MergedCells.Count, Copy.ColWidth[1],
Copy.FreezeRow, Integer(Copy.TabColorIsAuto)]));
// Prove independence: mutate the copy, confirm the source is untouched.
Copy.Cells[2, 2].Value := 999;
// Template.Cells[2, 2].Value is still whatever it was.
Broj spojeva, širina kolone, freeze red i zastavica boje kartice govore vam da je sloj koji je kopiran zaista stigao. Odvojeno, na svakom listu koji je nosio grafikon, tabelu, validacije ili uslovna formatiranja, tretirajte ih kao listu za ponovno građenje na kopiji: njihov izostanak je nameran, a ispravka je nekoliko poziva, ne prijava greške. Taj mentalni model, duboko tamo gde je bezbedno i plitko tamo gde bi reference pukle, čitava je priča o tome kako dobro koristiti ovu mogućnost
Dupliranje radnog lista i CopyFrom kopiranje stanja lista opisano ovde dolaze u v2.91.0 nativne HotXLS Delphi spreadsheet komponente, uz pokretni SheetCopysample