Delovni zvezek, ki ga stranka želi natisniti, sledi drugačni logiki oblikovanja od tistega, ki ga bo obdelovala pivot tabela. Tiskano poročilo ima glave, ki se raztezajo čez več stolpcev, razdelilne vrstice med skupinami in glavo, ki se mora ponoviti na vsakem listu. Vse te funkcije zahtevajo združene celice v kombinaciji z nastavitvami postavitve tiskanja, pri čemer sta dve različni skupini lastnosti, ki sledita različnim API-jem v HotXLS. Razumevanje razlike med njima vam prihrani pol ur odpravljanja napak, ko stranka prinese natisnjeno kopijo z manjkajočo glavo na strani dve.
Osnova: MergeCells in MergeArea
Na fasadi XLSX je obseg združen tako, da se na njem pokliče metoda. Vmesnik IXLSXWorksheet izpostavlja:
procedure MergeCells(const ARange: WideString); overload;
procedure MergeCells(AFromRow, AFromCol, AToRow, AToCol: Integer); overload;
Preobremenitvena metoda s koordinatami je primernejša za zanke, saj se izognete gradnji niza obsega v vsaki iteraciji:
// merge the title row across columns 1-8
Sheet.MergeCells(1, 1, 1, 8);
Sheet.Cells[1, 1].Value := 'Quarterly Revenue Report';
Sheet.Cells[1, 1].HorizontalAlignment := xlHAlignCenter;
// merge a group-header row for every section
for GroupRow := FirstDataRow to LastDataRow do
if IsGroupHeader(GroupRow) then
Sheet.MergeCells(GroupRow, 1, GroupRow, 8);
Ko berete delovni zvezek z obstoječimi spojenimi obsegi, IXLSXCell.MergeArea poroča o obsegu, ki mu celica pripada. Vrednost je niz formata "A1:H1" za celico znotraj spojenega obsega ali sama celicina referenca, ko ni združena. Tipični vzorec preverjanja:
Cell := Sheet.Cells[R, C];
if Cell.MergeArea <> Cell.Name then
begin
// Cell is part of a merged region; skip satellite cells
if (Cell.MergeArea <> '') and
(Cell.Name = Copy(Cell.MergeArea, 1, Pos(':', Cell.MergeArea) - 1)) then
ProcessMergeAnchor(Cell)
// else satellite cell, do nothing
end;
Satelitne celice (tiste v spojenem obsegu, ki niso sidrišče) nosijo vrednosti Null, ki jih razčlenjevalnik poroča kot Unassigned. Koda, ki iterira celice in testira VarIsNull(Cell.Value), bo napačno "videla" luknje, ko bo prišla do satelitov, ne glede na to, ali je vsebina polja sicer gosta; vedno potrdi stanje združitve pred vrednotenjem praznosti.
Fasada XLS: IXLSWorksheet.MergeCells in RangeMergeCells
Fasada XLS nudi dve vstopni točki: IXLSWorksheet.MergeCells za spojev z nizom obsega, in RangeMergeCells za obsege, navedene s koordinatami:
// IXLSWorksheet approach (BIFF XLS)
XLSSheet.MergeCells('A1:H1');
// coordinate variant for tight loops
XLSSheet.RangeMergeCells(GroupRow, 1, GroupRow, 8);
Semantika zaokrožnega potovanja za obe fasadi je zanesljiva: spojenost je lastnost datoteke, ne vmesniška abstrakcija, zato prebranje datoteke in njeno shranjevanje pod novim imenom ohranja vsak spojeni obseg nedotaknjenega. To velja enako za staro obliko .xls, ki jo bere HotXLS, in za .xlsx, ki jo piše in bere. Gotcha obstaja, ko uvažate staro datoteko .xls z obsežnim združevanjem in jo zapisujete kot .xlsx: obseg ima drugačno mejo celic (1.048.576 vrstic pri .xlsx v primerjavi z 65.536 pri .xls), zato spojeni obsegi, ki segajo v vrstice nad staro mejo, preživijo, tisti, ki se nanašajo na vrstice 65537 ali višje, ki so bili nameščeni v .xls z razponu pod staro mejo, se ohranjajo pravilno.
Zamrznjene podokne za statične glave
Zamrzovanje vrstic glav tako, da ostanejo na zaslonu med pomikanjem, se od tiskalnih glav razlikuje na API ravni. Zamrzovanje je lastnost pogleda lista, ker se prikaže na zaslonu, tiskalniška glava pa je lastnost nastavitev strani, ker se nanaša na strani. Zamrznjeno podokno z eno vrstico na fasadi XLSX:
// freeze row 1 as a scrollable-view header on XLSX
Sheet.FreezePanes(1, 0, 1, 0);
Podpis je FreezePanes(SplitRow, SplitCol, TopRow, LeftCol). SplitRow := 1 razdeli pod vrstico 1, zamrzne jo nad razdelilnikom, TopRow := 1 postavi vrh drsečega dela na vrstico 1. Zamrzovanje dveh glav je FreezePanes(2, 0, 2, 0). Na fasadi XLS nastavite FrozenRows in FrozenCols neposredno:
XLSSheet.FrozenRows := 2; // two header rows stay pinned above the scroll region
Obe nastavitvi sta samo za gledanje in se ne pojavljata v tiskalniku. Ko tiskate, ne zamrzujete: ponavljate.
Ponavljajoče se vrstice in stolpci tiskanja
Excelova možnost "Vrstice za ponavljanje na vrhu" je shranjena v nastavitvah strani lista, ne v podoknih. V HotXLS to je lastnost PrintTitles v hierarhiji PageSetup:
// XLSX: repeat rows 1-2 as a print title on every page
Sheet.PageSetup.PrintTitles.RowFrom := 1;
Sheet.PageSetup.PrintTitles.RowTo := 2;
// repeat column A as a left-side print title
Sheet.PageSetup.PrintTitles.ColFrom := 1;
Sheet.PageSetup.PrintTitles.ColTo := 1;
Na fasadi XLS je enakovredna lastnost PrintRows z FirstRow in LastRow:
XLSSheet.PrintRows.FirstRow := 1;
XLSSheet.PrintRows.LastRow := 2;
Razlika v poименovanju odraža BIFF-ovo lastniško terminologijo, ki jo je HotXLS izpostavil raje kot poenotil; referenčna dokumentacija navaja obe skupini lastnosti za vsako fasado. Praktično pravilo: nastavite PrintTitles ali PrintRows za tiskanje in FreezePanes ali FrozenRows za pomikanje. Zamenjajte jih in stranka se pritoži, da se glava ne pojavi na strani dve, ali pa Excel pokaže zamrznjeno vrstico, ko se pomaknejo v smer dol, čeprav ste nastavili tiskanje. To je najpogostejša zmeda v celotnem prostoru predloge poročila.
Predloge na osnovi datotek vs. gradnja v pomnilniku
Obstajata dve strategiji za ponovljive postavitvene poročilne delovne zvezke. Prva: shranite predlogo .xlsx z vsem statičnim oblikovanjem, naslovi tiskanja, logo slik in formulami glave, jo odprite s HotXLS, zapolnite podatkovne celice in shranite pod novim imenom. Druga: zgradite celoten delovni zvezek v pomnilniku ob zagonu, vkodujte vsako nastavitev. Pristop predloge je manj krhek za razvijalce Delphija, ki niso lastniki oblikovalske odločitve: oblikovalec ureja predlogo v Excelu, razvijalec bere iz njenega API-ja in vpiše podatke, razvijalec ne bo nenamerno zlomil slogovnih nastavitev.
Ko bere predlogo, HotXLS ohranja vse lastnosti lista, vključno z nastavitvami tiskanja in spojenimi obsegi, ki niso bili na posredniški poti. Edina lastnost, za katero morate biti previdni pri predlogah na osnovi datotek, so ponastavitve spojenih obsegov, kadar odsevsete predloge, ki se razlikujejo v dolžini. Dinamično število odsekov z vsak odsek ima svojo glavo spojene vrstice zahteva spojevanje v vsaki zanki generiranja, ne vnaprejšnje ploske spojitve v predlogi. Predloga podpira glavo enega odseka; koda podpira dejanska N odsekov.
Zanesljivost zaokroževanja za spojene obsege
Zaokroževanje zaokroživanja HotXLS za spojene obsege je, da se vsako shranjevanje z naknadno odprtje vrne do enakovrednega modela. Celice pod staro skupaj nosijo vrednosti null za satelitne celice in vrednosti pri sidrišču. Prebirna koda, ki sprehodi celice, dobi ta vzorec brez poznavanja, katere celice so bile združene; le preveriti mora MergeArea pred vrednotenjem praznosti, kakor je opisano zgoraj. Ta garancija je tista, ki naredi predloge predvidljive čez generacije: oblikovalec doda spojeni obseg, delovni proces jo prebere in se obnese enako, ne glede na to, ali je datoteka prišla iz Excela ali iz HotXLS.
Sorodna dokumentacija: Tiskanje in nastavitve strani v HotXLS obravnava preostale lastnosti PageSetup vključno z odmiki, usmerjenostjo in skaliranjem. Slog celic in oblikovanje v HotXLS razlaga skupne zbirke slogov, ki so omenjena zgoraj. Celotna referenca lastnosti je priložena HotXLS Component.