HotXLS запазва оригиналния ChartML на импортирана Excel диаграма и го преизпълнява байт по байт, когато нищо в типизирания модел не се е променило, така че отварянето и презаписването на работна книга не мълчаливо отстранява части от диаграма, които обектният модел не представя. Редактирайте заглавие, серия или ос и HotXLS структурно вмъква новите типизирани възли в оригиналното дърво, вместо да регенерира диаграмата от нулата
Това разграничение — преизпълнение при недокоснато, вмъкване при редактирано — е точно това, което прави Delphi приложение безопасно да се насочи към диаграми, които анализатор е изградил в Excel. Регенерирането на диаграма от типизиран модел винаги губи това, което моделът не знае, а Excel диаграмите са пълни с неща, които библиотека не знае: потребителски стилове, списъци с разширения, алтернативни клонове за съдържание, форматиране с квалифицирано пространство от имена от добавки
Защо презаписът на работна книга изравнява нейните диаграми?
Защото обичайната реализация чете това, което разбира, и записва това, което разбира. Всичко между тях — extLst от по-нова Excel изградба, клон mc:AlternateContent, ефект на форма, за който моделът няма свойство — съществува във файла, няма дом в обектния модел и изчезва при запис. Потребителят вижда диаграма, която е загубила своя градиент, потребителските си етикети за данни или своя 3D ефект, а работната книга не може да обясни защо
С PreserveUnsupportedParts, включено на работната книга, HotXLS съхранява оригиналните UTF-8 байтове на диаграмата при импорт, заедно с дължина и 64-битов отпечатък на моделираното съдържание. Ако типизираният модел не се е променил до записа, той записва оригиналните байтове обратно. Без пренареждане на XML, без дрейф на празни пространства, без резидентно UTF-16 копие на диаграмата, висящо в паметта за диаграма, която никой не е редактирал
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;
Какво запазва вмъкването и какво притежава моделът
Правилото е собственост. Публичните възли на модела — заглавие, серии, кешове, групи на чертане, оси — се решават от ново генерираното дърво. Немоделираните поддървета се пренасят от оригинала. Тази асиметрия е умишлена и е частта, която отнема момент да се интернализира: изтриването на серия не трябва да възкресява старата серия от запазеното XML, така че всичко, което моделът притежава, се взема от модела, дори когато моделът казва «изчезнало»
Непритежаваното съдържание се вмъква отново до съпоставените възли, до които е седяло, а extLst остава последен в своя родител, защото там го изисква схемата. Изчистването на известно свойство — премахване на флаг за удебелен шрифт, премахване на цвят — се третира като изчистване, а не като пролука, която да се запълва от оригиналното дърво. Непознати атрибути в същия квартал запазват своето място
Съдържанието за markup-compatibility получава специфично третиране. При синтактичен разбор HotXLS прескача mc:Choice и чете mc:Fallback; ако този резервен клон обвива група на чертане, която моделът познава, вмъкването записва новото типизирано съдържание обратно в резервното поддърво. Без тази стъпка записът би излъчил новата група на чертане и би оставил старата вътре в резерва, а диаграмата би носила две
Изключване на една диаграма
ClearPreservedXml премахва оригиналното XML и отпечатъка за една диаграма, така че следващият запис прездравява тази диаграма чисто от типизирания модел. Това е решение на ниво диаграма; PreserveUnsupportedParts на ниво работна книга все още управлява дали състоянието на запазване се изгражда при импорт
Посегнете към него, когато искате чиста диаграма вместо вярна — например когато диаграма от шаблон носи форматиране от стара корпоративна тема и смисълът на операцията е да го отхвърли. Не се обръщайте към него като рефлекс за отстраняване на грешки: диаграма, която се рендерира грешно след редакция, по-често е въпрос на моделиране, отколкото на запазване, а изчистването на запазеното XML унищожава доказателството
Комбинационни диаграми и втората ос
AddPlotGroup изгражда подредени комбинационни диаграми, при които всяка група на чертане запазва своето собствено семейство диаграми и своето собствено назначение на първична или вторична ос. Това е точно това, от което се нуждае вездесъщата бизнес диаграма: приходи като колони на лявата ос, процент на маржа като линия на дясната
Диаграмите излагат първични и вторични оси за категории и стойности плюс серия, с типизирани настройки за категория, стойност, дата и серия, покриващи позиции, идентификатори, кръстосвания, единици за дати, интервали на етикети и видимост. По-старият плосък API — ChartType, AddSeries, плоската колекция Series — все още адресира първичната група на чертане, така че съществуващият код продължава да работи, докато моделът отдолу държи всяка подредена група
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;
Преди този модел да съществува, отварянето и презаписът на комбинационна диаграма я сриваваше в едно семейство диаграми и губеше вторичните, датните и сериите оси. Референтните към формула на диаграма и кешираните стойности на серии сега оцеляват копия на работни книги и цикли на отваряне/запис, а котвите на диаграми се съпоставят с техните части чрез идентификатор на връзка — така приложение, което пренарежда записи за връзки, вече не разменя съдържание на диаграми между позиции на работен лист
Капанът с ръчно оформление
Ако позиционирате площ за чертане, заглавие, заглавие на ос или легенда ръчно, запишете и четирите координати. Office изисква x, y, w и h като цялостна група, когато което и да е от тях присъства, и игнорира цялото manualLayout иначе. HotXLS винаги излъчва пълния правоъгълник по тази причина, а SetPositionAndSize го задава и включва в едно извикване
Два допълнителни детайла следват Excel, а не пълната свобода на спецификацията. Позицията се записва с xMode и yMode, зададени на edge, докато размерът използва factor за wMode и hMode, защото това е това, което Excel записва и в което преобразува други комбинации. А layoutTarget се излъчва само за площта на чертане, никога за заглавия или легенди, където бележките за реализация на Microsoft го забраняват
Вмъкване на това в обиколка на работна книга
Запазването на диаграми е един инстанция на обща политика: библиотека, която редактира документи, авторирани другаде, трябва да променя това, което е била помолена да промени, и нищо друго. Същото разсъждение движи HotXLS за теми, вериги за изчисление и разширения на работни листове, описано в записките за беззагубителни обиколки за тема, extLst и calcChain, а за VBA проекти и външни препратки — в запазване на VBA и външни препратки. За самата повърхност за авторство на диаграми — създаване на диаграми, поставяне на изображения и чертежи от Delphi — вижте ръководството за диаграми, изображения и чертежи в HotXLS
HotXLS чете, редактира и записва XLSX диаграми от нативен Delphi и C++Builder код без инсталиран Excel на машината, което е точно това, което прави верността проблем на библиотеката, а не проблем на автоматизация — страницата на HotXLS компонент за електронни таблици има списъка с функции за диаграми и пробно изтегляне