HotXLS gali padėti diagramą tiesiai ant darbalapio, pritvirtintą prie langelių diapazono, vietoj to, kad dėtų ją į atskirą diagramų lapą. BIFF8 kalba tai reiškia braižymo formos rašymą su OBJ tipo 5 įrašu ir diagramos substream pastatymą į lapo įrašų srauto galą, kas yra tiksliai ta išdėstytis, kurią pagamina Excel, ir tiksliai ta vieta, kur skaitytuvas tikisi jos rasti
Skirtumas svarbus kiekvienam, kuris generuoja operacinius pranešimus. Diagramų lapas yra geri namai vienam antraštiniam vaizdui. Mėnesiniam regionų suskaidymui norisi diagramos šalia skaičių, kuriuos ji apibendrina, tame pačiame lape, mastelio pagal langelių bloką, kuriam ji priklauso, kad skaitytojas slinktų kartą, vietoj kortelių perjungimo ir konteksto praradimo
Skaitymas jau buvo, rašymas – ne
Asimetriją verta įvardinti, nes ji formuoja darbą. HotXLS jau galėjo skaityti įterptas diagramas: kai darbalapio įrašų srautas turi BOF, pažymėtą kaip diagramos substream, analizatorius perjungia kontekstą, surenka diagramos įrašus, ir uždarajame EOF juos grąžina braižymo formai, kurią pristatė OBJ įrašas. Tas kelias buvo išbandytas kiekvienos Excel sukurtos darbo knygos, kurią biblioteka bet kada atvėrė
Trūko kūrybos pusės, ir naudinga išvada ta, kad naujasis rašytojas turėjo tikslią specifikaciją, į kurią taikytis: pagaminti baitų išdėstytį, kurią esamas skaitytuvas jau prikabina atgal. Nėra geresnio priėmimo kriterijaus dvinario formato funkcijai nei nepriklausomai parašytas skaitytuvas, kurio jums neleista keisti
Iš ko pagaminta įterpta diagrama
Trys dalys turi sutapti. Braižymo sluoksnis pateikia pagrindinio valdiklio formą, objektų sluoksnis pateikia OBJ įrašą, kurio bendrieji objekto duomenys deklaruoja objekto tipą 5, o įrašų srautas pateikia pačią diagramos substream. Parinkčių vėliavos ant OBJ įrašo yra tos, kurias Excel rašo diagramos rėmui: pozicionuota, užrakinta, automatinė linija ir automatinis užpildas, kas daro įterptą diagramą besielgiančią kaip gimtoji, kai naudotojas ją spaudžia
Pritvirtinimas nusipelno pastabos, nes jis yra dažnas off-by-one klaidų šaltinis. HotXLS API ima eilučių ir stulpelių numerius nuo vieneto, kaip ir likusi biblioteka, o kliento pritvirtinimas, rašomas į failą, yra nuo nulio. Konversija vyksta AddChartObject viduje, tad kvietėjai lieka koordinačių sistemoje, kurią naudoja visur kitur, bet kas bet lygina hex atkarpą su savu iškvietimu, turi prisiminti, kurią tos ribos pusę skaito
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;
// Pritvirtinta prie E2:M20 šiame lape, skaičiuojant nuo vieneto
Sheet.AddChartObject(xlsChartTypeColumn, 'Regional sales',
'Month', 'Amount', Series, 2, 5, 20, 13);
Book.SaveToFile('regional-sales-charted.xls');
finally
Book.Free;
end;
end;
FillChar ant serijų masyvo nėra dekoracija. TXLSChartSeriesInfo neša kelis pasirenkamus poįrašus – duomenų etiketes, serijos stilių, tendencijos linijas ir klaidų juostas, kiekvieną užrakintą boolean – ir dalinai inicializuotas įrašas ant steko atiduos aktyvatoriui vėliavas, kurių nė kas nustatė. Nulinkite masyvą, tada nustatykite laukus, kuriuos turite omeny
Kurias serijų nuorodas priima įterptasis kelias?
Paprastus A1 stiliaus diapazonus toje pačioje darbo knygoje, ir tas apribojimas yra sąmoningas, o ne praleidimas. Kiekviena nuoroda išsprendžiama pagal darbo knygos lapų sąrašą ir paverciama į išorinės nuorodos indeksą, kurio reikia diagramos įrašams. Pavadintas diapazonas ar išorinės darbo knygos nuoroda nukrenta į vietos laikiklį su nulinio ilgio išanalizuota išraiška, tad diagrama rašosi švariai, bet ta konkreti serija neturi duomenų šaltinio, kol jos nenukreipiate į diapazoną
Priežastis yra tiesioginis inžinerinis mainas. Pilnas nuorodų kompiliavimo kelias egzistuoja diagramų lapo maršrute, apsuptas darbalapių rinkinio sluoksnio viduje, ir švarus jo ištraukimas reikštų šimto analizės logikos eilučių dubliavimą praktikoje nedažnam atvejui. Įterpta diagrama beveik visada braižo savo paties lapo ar gretimo duomenų lapo langelius. Pavadintos ir išorinės nuorodos padengtos diagramų lapo kelyje per AddChartSheet, tad niekas neprieinama nėra, tiesiog pasiekiama iš kito įėjimo taško
Visa kita serijų modelyje veikia identiškai abiem maršrutais. Antrinės ašies susietis, serijos linija, užpildas ir žymeklio stiliai, tendencijos linijos, klaidų juostos ir duomenų etiketės visos yra TXLSChartSeriesInfo dalis ir visos išduodamos taip pat, tad diagramos apibrėžimas gali keliauti tarp įterpto objekto ir diagramų lapo keičiantis tik iškvietimui. Antrinės ašies vėliavos ašių grupės mechanika aprašyta straipsnyje antrinės ašies grupės BIFF rašyme
Kodėl diagramos pavadinimas perskaitytas kaip du simboliai?
Nes simbolių skaičius buvo paduotas ten, kur tikimasi baitų skaičiaus, ir BIFF Unicode eilutės tą klaidą lengva parašyti ir sunku pamatyti. Trumpa BIFF Unicode eilutė prasideda simbolių skaičiumi ir vėliavų baitu, o vėliavų baitas neša aukštojo baito bitą, sakantį, ar našta yra vienas baitas simboliui, ar du. Perskaitykite 16 bitų naštą su simbolių skaičiumi, lyg tai būtų baitų ilgis, ir gausite tiksliai pusę eilutės: serija, pavadinta Sales, grįžta kaip Sa, ir diagramos pavadinimas nukerpamas taip pat, nes pavadinimai ir serijų etiketės dalijasi dekodo keliu
Kas daro šį defektą žymų, tai kad jis pasikartojo tris kartus toje pačioje įrašų šeimoje: kartą tendencijos linijų pavadinimuose, kartą pivot diagramų pavadinimuose ir kartą diagramų pavadinimuose. Kiekvienas atvejis atrodė kaip šviežia klaida naujoje funkcijoje. Visos trys buvo tas pats pradingęs dauginimas. Taisyklė, galiausiai tai uždariusi, yra mechaninė ir turėtų būti taikoma be samprotavimų: kada bet skaitote vieną iš šių eilučių, pirmiausia pasižiūrėkite į aukštojo baito vėliavą ir padauginkite simbolių skaičių iš naštos pločio prieš liesdamas buferį. Įrašo lygmens detalės straipsnyje XLUnicodeString simbolių skaičių ir aukštojo baito vėliavos dekodavimas
// Įterpta diagrama dalijasi braižymo sluoksniu su vaizdais ir formomis,
// tad esamas braižymas lape išsaugomas. AddChartObject grąžina sukurto
// objekto indeksą
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;
Kur įterptos diagramos tarp alternatyvų
Trys maršrutai egzistuoja ir jie atsako į skirtingus klausimus. Įterptas diagramos objektas priklauso šalia savo duomenų ant darbalapio ir to nori dauguma pranešimų. Diagramų lapas tinka vienam pristatymo vaizdui ir duoda pilną nuorodų kompiliavimo kelią. Esamos diagramos iš įkelto failo išsaugojimas nepaliestas yra teisingas atsakymas, kai darbo knyga atėjo iš Excel su formatavimu, kurio nė kas nenori, kad biblioteka perinterpretuotų; tas praėjimo elgesys aprašytas straipsnyje išsaugoti ChartML ir kombinuotos diagramos
Kadangi įterpta diagrama važinėja braižymo sluoksniu, ji sugyvena su vaizdais ir formomis tame pačiame lape, o ne juos pakeičia, ir bendras to sluoksnio modelis aprašytas straipsnyje diagramos, vaizdai ir braižiniai HotXLS. Visi trys maršrutai keliauja su HotXLS Delphi skaičiuoklės komponentu, tad pasirinkimas yra apie tai, kaip pranešimas turėtų atrodyti, o ne apie tai, ką biblioteka gali išreikšti
Metodologinis teiginys yra tas, kurį verta pasilikti. Kai dvinario formato funkcija turi esamą skaitytuvą, statykite rašytoją prieš skaitytuvą, o ne prieš savo specifikacijos skaitymą. Skaitytuvas užkoduoja metų kontaktą su failais, kuriuos tikros programos iš tikrųjų pagamino, įskaitant dalis, kurias specifikacija formuluoja laisvai, ir rašytojas, jį tenkinantis, gerokai labiau tikėtina tenkins ir Excel