HotXLS lahko postavi grafikon naravnost na delovni list, pripetega na obseg celic, namesto da bi ga dali na poseben list grafikonov. V izrazih BIFF8 to pomeni zapisati risalno obliko z zapisom OBJ tipa 5 in parkirati podtok grafikona na konec toka zapisov lista — natanko razporeditev, ki jo proizvede Excel, in natanko tisto mesto, kjer ga bralec pričakuje
Razlika šteje vsakomur, ki ustvarja operativna poročila. List grafikonov je domač kraj za en sam naslovni prikaz. Mesečna regionalna razčlenitev želi grafikon ob številkah, ki jih povzema, na istem listu, velikosti bloka celic, ki mu pripada, tako da bralec enkrat zavrti in ne preklaplja zavihkov ter izgublja kontekst
Branje je že bilo, pisanje ni
Asimetrija si zasluži ime, ker oblikuje delo. HotXLS je že znal brati vgrajene grafikone: ko tok zapisov delovnega lista vsebuje BOF, označen kot podtok grafikona, razčlenjevalnik zamenja kontekst, zbere zapise grafikona in ob zaključnem EOF vrne risalni obliki, ki jo je uvedel zapis OBJ. To pot je preizkusila vsaka delovna knjiga, napisana v Excelu, ki jo je knjižnica kadar koli odprla
Manjkala je stran avtorstva in koristna posledica je, da je nov pisec imel točno specifikacijo, ki jo je treba zadeti: proizvesti bajtno razporeditev, ki jo obstoječi bralec že znova pripne. Boljšega sprejemnega kriterija za zmožnost binarnega formata ne obstaja kot neodvisno napisan bralec, ki mu niste smeli spremeniti
Od čega je sestavljen vgrajeni grafikon
Trije kosi se morajo ujemati. Risalna plast prispeva obliko gostiteljskega kontrolnika, plast objektov zapis OBJ, katerega splošni podatki objekta razglasijo tip objekta 5, tok zapisov pa sam podtok grafikona. Zastavice možnosti na zapisu OBJ so tiste, ki jih Excel zapiše za okvir grafikona: pozicionirano, zaklenjeno, samodejna črta in samodejno polnjenje — to je tisto, zaradi česar se vgrajeni grafikon ob kliku uporabnika vede kot nativen
Sidro si zasluži opombo, ker je pogost vir napak od ena. API HotXLS sprejme številke vrstic in stolpcev od ena, v skladu s preostankom knjižnice, strankinsko sidro, zapisano v datoteko, pa je od nič. Pretvorba se zgodi znotraj AddChartObject, tako da klicatelji ostanejo v koordinatnem sistemu, ki ga uporabljajo povsod drugje; kdorkoli pa primerja šestnajstiški izpis s svojim klicem, si mora zapomniti, katero stran te meje bere
var
Book: TXLSWorkbook;
Sheet: TXLSWorksheet;
Series: array[0..1] of TXLSChartSeriesInfo;
begin
Book := TXLSWorkbook.Create(nil);
try
Book.LoadFromFile('regional-sales.xls');
Sheet := Book.Sheets[0];
FillChar(Series, SizeOf(Series), 0);
Series[0].Name := 'Actual';
Series[0].Categories := 'Data!$A$2:$A$13';
Series[0].Values := 'Data!$B$2:$B$13';
Series[0].DataLabels.ShowValue := True;
Series[0].HasDataLabels := True;
Series[1].Name := 'Target';
Series[1].Categories := 'Data!$A$2:$A$13';
Series[1].Values := 'Data!$C$2:$C$13';
Series[1].SecondaryAxis := True;
// Pripeto na E2:M20 na tem listu, od ena
Sheet.AddChartObject(xlsChartTypeColumn, 'Regional sales',
'Month', 'Amount', Series, 2, 5, 20, 13);
Book.SaveToFile('regional-sales-charted.xls');
finally
Book.Free;
end;
end;
FillChar na seznamu serij ni okras. TXLSChartSeriesInfo nosi več neobveznih podzapisov — oznake podatkov, stil na serijo, trendne črte in napakalne palice — vsak zaprt za boolean, delno inicializiran zapis na skladu pa bo oddajniku podal zastavice, ki jih ni nastavil nihče. Seznam izničite, nato nastavite polja, ki jih mislite
Katere sklice serij sprejme vgrajena pot?
Navadne obsege v stilu A1 znotraj iste delovne knjige, in ta omejitev je namerna, ne spregled. Vsak sklic se razreši proti seznamu listov delovne knjige in spremeni v indeks zunanjega sklica, ki ga zapisi grafikona potrebujejo. Poimenovani obseg ali sklic na zunanjo delovno knjigo sprofilira na ograditelja z razčlenjenim izrazom ničelne dolžine, tako da se grafikon zapiše čisto, tista posamezna serija pa nima vira podatkov, dokler je ne usmerite v obseg
Razlog je naravnost inženirska izmenjava. Polna pot prevajanja sklicev obstaja na poti listov grafikonov, ovita znotraj plasti zbirke delovnih listov, dvig ven čisto pa bi pomenil podvajanje sto vrstic logike razreševanja za primer, ki je v praksi redek. Vgrajeni grafikon skoraj vedno riše celice na svojem listu ali sorodnem podatkovnem listu. Poimenovani in zunanji sklici so pokriti na poti lista grafikonov prek AddChartSheet, tako da nič ni nedosegljivo, le doseženo iz drugega vstopa
Vse ostalo v modelu serij deluje identično na obeh poteh. Vezava sekundarne osi, črta na serijo, stila polnjenja in oznak, trendne črte, napakalne palice in oznake podatkov so vsi del TXLSChartSeriesInfo in vsi oddani na isti način, tako da se lahko definicija grafikona seli med vgrajenim objektom in listom grafikonov, spreminja pa se le klic. Mehanika skupin osi za zastavico sekundarne osi je obravnavana v skupinah sekundarne osi pri pisanju BIFF
Zakaj se je naslov grafikona prebral kot dva znaka?
Ker je bilo štetje znakov podano tam, kjer je bilo pričakovano štetje bajtov, nizi BIFF Unicode pa to napako naredijo enostavno zapisati in težko videti. Kratek niz BIFF Unicode se začne s štetjem znakov in bajtom zastavic, bajt zastavic pa nosi bit visokega bajta, ki pravi, ali je tovor en bajt na znak ali dva. Preberite 16-bitni tovor s štetjem znakov, kot da bi bila dolžina bajtov, in dobite točno polovico niza: serija, poimenovana Sales, se vrne kot Sa, naslov grafikona pa se odreže enako, ker si naslovi in oznake serij delijo pot dekodiranja
Tisto, kar to pomanjkljivost naredi omembe vredno, je, da se je ponovila trikrat v isti družini zapisov — enkrat v imenih trendnih črt, enkrat v imenih vrtilnih grafikonov in enkrat v naslovih grafikonov. Vsaka pojavitev je izgledala kot svež hrošč v novi zmožnosti. Vse tri so bile isto manjkajoče množenje. Pravilo, ki ga je končno zaprlo, je mehanično in ga je treba uporabiti brez sojenja: kadar koli berete enega od teh nizov, najprej pogledajte zastavico visokega bajta in pomnožite štetje znakov s širino tovora, preden se dotaknete medpomnilnika. Podrobnosti na ravni zapisov so v dekodiranju štetij znakov XLUnicodeString in zastavice visokega bajta
// Vgrajeni grafikon si risalno plast deli s slikami in liki, zato se
// obstoječa risba na listu ohrani. AddChartObject vrne indeks
// ustvarjenega objekta
var
ObjIndex: Integer;
begin
ObjIndex := Sheet.AddChartObject(xlsChartTypeLine, 'Trend',
'Week', 'Units', Series, 2, 8, 18, 16);
if ObjIndex < 0 then
raise Exception.Create('chart object was not created');
end;
Kje se vgrajeni grafikoni ujamejo z alternativami
Obstajajo tri poti in odgovarjajo na različna vprašanja. Vgrajeni objekt grafikona sodi ob svoje podatke na delovni list in je tisto, kar želi večina poročil. List grafikonov ustreza enemu predstavitvenemu prikazu in vam da polno pot prevajanja sklicev. Ohranjanje obstoječega grafikona iz naložene datoteke, nedotaknjeno, je pravi odgovor, ko je delovna knjiga prišla iz Excela z oblikovanjem, ki ga knjižnica naj ne bi znova razlagala; to prehodno vedenje je opisano v ohranjenih ChartML in kombiniranih grafikonih
Ker vgrajeni grafikon jaha risalno plast, soobstaja s slikami in liki na istem listu, namesto da bi jih zamenjal, splošni model te plasti pa je obravnavan v grafikonih, slikah in risbah v HotXLS. Vse tri poti pridejo z HotXLS Delphi spreadsheet component, tako da je izbira odvisna od tega, kako naj poročilo izgleda, in ne od tega, česa knjižnica zna izraziti
Metodološka točka je tista, ki jo vredi obdržati. Ko ima zmožnost binarnega formata obstoječega bralca, gradite pisca proti bralcu in ne proti svojemu branju specifikacije. Bralec kodira leta stika z datotekami, ki so jih dejansko proizvedle resnične aplikacije, vključno z deli specifikacije, ki jih ta izraža ohlapno, pisec, ki bralca zadovolji, pa je veliko bolj verjetno, da zadovolji tudi Excel