Műszaki cikk

Excel-diagramok szerkesztése a ChartML elvesztése nélkül HotXLS-szel

A HotXLS megőrzi egy importált Excel-diagram eredeti ChartML-jét, és bájtrol bájtra visszajátszza, amikor a típusos modellben semmi sem változott, így egy munkafüzet megnyitása és újramentése nem tünteti el csendben azokat a diagramrészeket, amelyeket az objektummodell nem képvisel. Szerkesszünk egy címet, egy sorozatot vagy egy tengelyt, és a HotXLS strukturálisan beolvasztja az új típusos csomópontokat az eredeti fába, ahelyett hogy a diagramot a nulláról újragenerálná

Ez a különbség — visszajátszás érintetlenül, beolvasztás szerkesztéskor — az, ami biztonságossá teszi, hogy egy Delphi-alkalmazást egy analitikus által Excelben készített diagramokra irányítsunk. Egy diagram típusos modellből történő újragenerálása mindig elveszti azt, amit a modell nem tud, és az Excel-diagramok tele vannak olyan dolgokkal, amelyeket egy könyvtár nem tud: egyéni stílusok, kiterjesztéslisták, alternatív tartalom-ágak, kiegészítőktől származó névtér-minősítésű formázás

Miért laposítja el egy munkafüzet újramentése a diagramjait?

Mert a szokásos megvalósítás azt olvassa be, amit ért, és azt írja ki, amit ért. Minden, ami közötte van — egy újabb Excel-buildből származó extLst, egy mc:AlternateContent ág, egy shape effekt, amelyre a modellnek nincs tulajdonsága — létezik a fájlban, nincs otthona az objektummodellben, és eltűnik mentéskor. A felhasználó egy olyan diagramot lát, amely elvesztette a színátmenetét, az egyéni adatcímkéit vagy a 3D-effektusát, és a munkafüzet nem tudja elmagyarázni, miért

A PreserveUnsupportedParts munkafüzeten történő engedélyezésével a HotXLS importáláskor eltárolja az eredeti UTF-8 diagram-bájtokat egy hosszal és a modellezett tartalom 64-bites ujjlenyomatával. Ha a típusos modell mentésig nem változott, visszaírja az eredeti bájtokat. Nincs XML-újrarendezés, nincs szóközeltolódás, nincs állandó UTF-16 másolat a diagramról a memóriában egy olyan diagram számára, amelyet senki sem szerkesztett

var
  Workbook: TXLSXWorkbook;
  Chart: TXLSXChart;
begin
  Workbook := TXLSXWorkbook.Create(nil);
  try
    Workbook.PreserveUnsupportedParts := True;   // set before Open
    Workbook.Open('quarterly-review.xlsx');
    Chart := Workbook.Sheets[1].Charts[0];   // Sheets[] is 1-based
    if Chart.HasPreservedXml then
      Log('original ChartML retained; untouched charts replay exactly');
    Chart.Title := 'Revenue by region, Q3 2026';  // now the merge path runs
    Workbook.SaveAs('quarterly-review-out.xlsx');
  finally
    Workbook.Free;
  end;
end;

Mit tart meg a beolvasztás, és mit birtokol a modell

A szabály a tulajdonviszony. A nyilvános modell-csomópontokról — cím, sorozatok, gyorsítótárak, plot-csoportok, tengelyek — az újonnan generált fa dönt. A nem modellezett részrák az eredetiből kerülnek át. Ez az aszimmetria szándékos, és ez az a rész, amelyet egy pillanatig érdemes emészteni: egy sorozat törlése nem támaszthatja fel a régi sorozatot a megőrzött XML-ből, tehát mindaz, amit a modell birtokol, a modellből kerül ki akkor is, amikor a modell azt mondja „elment”

A nem birtokolt tartalom a illeszkedő csomópontok mellé kerül újra beszúrásra, és az extLst a szülőben utolsóként marad, mert a séma ott követeli. Egy ismert tulajdonság törlése — egy félkövér-jelölő eltávolítása, egy szín eldobása — törlésként van kezelve, nem pedig az eredeti fából kitöltendő hézagként. Az azonos környékben lévő ismeretlen attribútumok megtartják a helyüket

A markup-compatibility tartalom specifikus kezelést kap. Elemzéskor a HotXLS átugorja az mc:Choice-t, és beolvassa az mc:Fallback-et; ha az a tartalék-ág egy olyan plot-csoportot foglal, amelyet a modell ismer, a beolvasztás az új típusos tartalmat visszaírja a tartalék részrába. Ezen lépés nélkül a mentés kibocsátaná az új plot-csoportot, és bennhagyná a régit a tartalékban, és a diagram kettőt hordozna

Egy diagram kivétele az elrendezésből

A ClearPreservedXml eldobja egy diagram eredeti XML-jét és ujjlenyomatát, így a következő mentés tisztán a típusos modellből építi újra azt a diagramot. Ez diagramonkénti döntés; a munkafüzet-szintű PreserveUnsupportedParts továbbra is szabályozza, hogy importáláskor megőrzési állapot épül-e

Akkor nyúljunk hozzá, amikor tiszta diagramot akarunk, nem hűségeset — például amikor egy sablon-diagram egy régi vállalati témából származó formázást hordoz, és a művelet lényege eldobni azt. Ne úgy nyúljunk hozzá, mint hibakeresési reflex: egy olyan diagram, amely szerkesztés után rosszul renderelődik, gyakrabban modellezési kérdés, mint megőrzési kérdés, és a megőrzött XML törlése megsemmisíti a bizonyítékot

Kombinációs diagramok és a második tengely

Az AddPlotGroup rendezett kombinációs diagramokat épít, ahol minden plot-csoport megtartja a saját diagramcsaládját és a saját elsődleges vagy másodlagos tengely-hozzárendelését. Ez az, amire a mindennapi üzleti diagramnak szüksége van: bevétel oszlopokként a bal tengelyen, árrés százalék vonalként a jobb tengelyen

A diagramok elsődleges és másodlagos kategória- és értéktengelyeket tesznek elérhetővé egy sorozattengely mellett, típusos kategória-, érték-, dátum- és sorozattengely-beállításokkal, amelyek lefedik a pozíciókat, azonosítókat, kereszteződéseket, dátum-egységeket, címke-intervallumokat és láthatóságot. A régebbi sík API — ChartType, AddSeries, a sík Series gyűjtemény — továbbra is az elsődleges plot-csoportot címezzi, így a meglévő kód tovább működik, miközben alatta a modell minden rendezett csoportot tart

var
  Chart: TXLSXChart;
  Line: TXLSXChartPlotGroup;
begin
  // Column chart anchored over rows 1..15, columns 5..12
  Chart := Sheet.Charts.Add(xlsxChartColumn, 'Revenue and margin',
    1, 5, 15, 12);
  Chart.AddSeries('Revenue', 'Data!$A$2:$A$13', 'Data!$B$2:$B$13');
  // Second plot group: a line, read against the secondary value axis
  Line := Chart.AddPlotGroup(xlsxChartLine, xlsxAxisSecondary);
  Line.AddSeries('Margin %', 'Data!$A$2:$A$13', 'Data!$C$2:$C$13');
end;

Mielőtt ez a modell létezett, egy kombinációs diagram megnyitása és újramentése egyetlen diagramcsaládba laposította, és elvesztette a másodlagos, dátum- és sorozattengelyeket. A diagramképlet-hivatkozások és a gyorsítótárazott sorozatértékek most túlélik a munkafüzet-másolásokat és a megnyitás/mentés ciklusokat is, és a diagramhorgonykat a hozzájuk tartozó diagramrészekhez kapcsolat-azonosító párosítja — így egy olyan alkalmazás, amely átrendezi a kapcsolat-bejegyzéseket, többé nem cseréli fel a diagramok tartalmát a munkalap-pozíciók között

A manuális elrendezés csapdája

Ha kézzel pozicionálunk egy plot-területet, címet, tengelycímet vagy jelmagyarázatot, írjuk mind a négy koordinátát. Az Office megköveteli, hogy az x, y, w és h teljes csoportként szerepeljen, valahányszor valamelyik jelen van, és egyébként az egész manualLayout-ot figyelmen kívül hagyja. A HotXLS mindig ezért bocsát ki teljes téglalapot, és a SetPositionAndSize egyetlen hívásban állítja be és engedélyezi

Két további részlet az Excelt követi, nem a specifikáció teljes szabadságát. A pozíció xMode és yMode edge értékre van állítva, miközben a méret factor-t használ wMode és hMode esetén, mert ez az, amit az Excel ír, és amit a többi kombinációvá alakít. És a layoutTarget csak a plot-területre kerül kibocsátásra, soha a címekre vagy jelmagyarázatra, ahol a Microsoft implementációs jegyzetek tiltják

Beillesztés egy munkafüzet oda-vissza menetébe

A diagrammegőrzés egy általános házirend egy esete: egy könyvtárnak, amely máshol szerzett dokumentumokat szerkeszt, azt kell megváltoztatnia, amire kérte, és semmi mást. Ugyanez az érvelés hajtja a HotXLS-t a témákon, számítási láncokon és munkalap-kiterjesztéseken, amelyeket a téma, extLst és calcChain veszteségmentes oda-vissza menetei jegyzetei írnak le, és a VBA-projektek és külső hivatkozások témájában a VBA és külső hivatkozások megőrzése. Magáért a diagram-szerzői felületért — diagramok létrehozása, képek és rajzok Delphiből történő elhelyezése — lásd a diagramok, képek és rajzok HotXLS-ben átjárását

A HotXLS natív Delphi és C++Builder kódból olvassa, szerkeszti és írja az XLSX-diagramokat Excel-telepítés nélkül a gépen, ami teszi, hogy a hűség könyvtár-probléma, nem automatizálási probléma — a HotXLS táblázatkezelő komponens oldal tartalmazza a diagramfunkció-listát és egy próbaverziót