HotXLS създава Excel Sparklines – миниатюрните диаграми, които Excel изчертава в единична клетка – от Delphi и C++Builder с едно извикване: методът TXLSXWorksheet.AddSparklineGroup изгражда спарклайн група над диапазон от данни, а при записване на работната книга тя се записва като разширителен блок x14 в списъка extLst на работния лист, който Excel 2010 и по-нови версии визуализират, а по-старите програми пропускат без проблеми. В процеса не се използват диаграмни обекти, графични части или координати
Сценарият, при който спарклайновете показват своята стойност, винаги е един и същ. Информационна работна книга съдържа няколко стотици редове – по един за продукт, регион или акаунт, всеки с дванадесет месечни стойности – и е необходимо да се изведе графично представяне на тренда в края на всеки ред. Ако решите да направите това с реални диаграми, ще трябва да създадете стотици DrawingML части, всяка със собствен XML файл, връзка и геометрия, да не говорим за въздействието върху размера на файла и времето за отваряне. Спарклайн групата представлява един-единствен XML блок, който указва: „начертай малка линия от B2:M2 в N2, и от B3:M3 в N3“, което се повтаря изключително бързо и с малък обем данни за всички ваши редове
Защо спарклайновете са x14 разширение, а не стандартна диаграма?
Спарклайновете се появиха в Excel 2010, три години след замразяването на основната схема ECMA-376, така че те не можеха да съществуват в стандартния XML код на работния лист, без да повредят по-старите програми. Решението на Microsoft е механизмът за списък с разширения: работният лист може да завършва с елемент <extLst>, съдържащ блокове <ext>, всеки маркиран с URI идентификатор за съответната функция ([MS-XLSX] §2.3.6). Спарклайновете използват URI {05C60535-1F16-4fd2-B633-F4F36F0B64E0} и пространството от имена x14. Програма, която разпознава този GUID, анализира блока, а по-стара програма го пропуска. Това гарантира пълна съвместимост и затова Excel 2007 отваря файла нормално – той просто показва изходните числа без мини диаграмите
Един детайл от този механизъм си струва да бъде споменат, тъй като опровергава често срещано предположение: не е необходима декларация mc:Ignorable в корена на работния лист. Филтрирането по GUID на разширението е напълно достатъчно и Excel записва пространството от имена x14 локално в елемента <ext>, вместо да променя корена на документа. HotXLS следва същия модел, което запазва структурата на работния лист чиста. Това е и основната структурна разлика спрямо стандартните диаграми: диаграмата е отделна DrawingML част със собствен процес на визуализация, описан в съпътстващата статия за диаграми, изображения и чертежи, докато спарклайнът представлява метаданни на работния лист, които самата мрежа на таблицата изчертава
Как се добавят спарклайнове към XLSX файл програмно?
Методът TXLSXWorksheet.AddSparklineGroup(AType, ASourceRange, ALocation) е бързият път за създаване: той изгражда група от даден тип, попълва я с подразбиращия се цвят на Excel и добавя първия спарклайн, съпоставящ източник от работен лист с клетката домакин. Върнатият обект TXLSXSparklineGroup след това приема допълнителни спарклайнове чрез своя метод Add – по една двойка F/Sqref за ред, като всички те споделят типа и форматирането на групата. За информационни табла това е идеалната структура: една обща група, един набор от визуални опции и стотици редове
var
Book: TXLSXWorkbook;
Sheet: TXLSXWorksheet;
Grp: TXLSXSparklineGroup;
Row: Integer;
begin
Book := TXLSXWorkbook.Create;
try
Book.Open('dashboard.xlsx');
Sheet := Book.Sheets[0];
// One group: every product row shares type and formatting
Grp := Sheet.AddSparklineGroup(xlsxSparklineLine,
'Sheet1!B2:M2', 'N2');
for Row := 3 to 201 do
Grp.Add(Format('Sheet1!B%d:M%d', [Row, Row]),
Format('N%d', [Row]));
Book.SaveAs('dashboard-trends.xlsx');
finally
Book.Free;
end;
end;
Маркери, цветове и мащабиране на осите в типизирания модел
Класът TXLSXSparklineGroup предоставя всички опции от менюто Sparkline Tools на Excel като стандартни свойства. Шест булеви настройки акцентират върху определени точки: Markers за всяка точка от спарклайн линията, както и HighPoint, LowPoint, NegativePoints, FirstPoint и LastPoint. Те се асоциират с осем ARGB цвята – ColorSeries, ColorNegative, ColorAxis, ColorMarkers, ColorFirst, ColorLast, ColorHigh, ColorLow – като стойност 0 означава пропускане на атрибута във файла и Excel прилага своите настройки по подразбиране. Форматът за цвят ARGB е същият, какъвто се използва в цялата библиотека, така че $FFD00000 съответства на същия червен цвят, използван в стиловете за условно форматиране
Grp := Sheet.AddSparklineGroup(xlsxSparklineStacked,
'Sheet1!B2:M2', 'N2');
Grp.NegativePoints := True; // losing months stand out
Grp.ColorNegative := $FFD00000;
Grp.HighPoint := True;
Grp.ColorHigh := $FF00B050;
Grp.MinAxisType := xlsxSparklineAxisGroup; // one scale for all rows
Grp.MaxAxisType := xlsxSparklineAxisGroup;
Grp.DisplayEmptyCellsAs := xlsxSparklineEmptyGap;
Свойствата MinAxisType и MaxAxisType приемат индивидуално, групово или персонализирано мащабиране: индивидуалното мащабира всеки спарклайн спрямо неговите собствени минимум и максимум, което прави ред с малки вариации между 99 и 101 да изглежда толкова динамичен, колкото ред с тройни разлики. Груповото мащабиране поставя всички елементи на обща вертикална скала, така че височината на графиката съответства на едно и също количество във всеки ред – което обикновено е предпочитано при сравнителни отчети. Свойството DisplayEmptyCellsAs определя поведението при празна клетка: оставяне на празно пространство, третиране като нула или свързване на съседните стойности с линия
Какво записва HotXLS в extLst на работния лист при запис
При запис HotXLS сериализира всяка група като XML елемент x14:sparklineGroup, съдържащ типа и атрибутите, цветовете като под-елементи и списък x14:sparklines, чиито членове свързват диапазон xm:f с клетката домакин xm:sqref. Цялата структура се записва в <extLst><ext uri="{05C60535-1F16-4fd2-B633-F4F36F0B64E0}"> в края на работния лист с пространството от имена x14, точно както го прави Excel. Работен лист без спарклайн групи изобщо не генерира елемент extLst, така че файловете, които не използват тази функция, изглеждат напълно идентични с резултатите от по-ранните версии на HotXLS – същата дисциплина за консервативен запис на XML кода, описана в статията за запазване на данни при двупосочно четене и запис
Един детайл от спецификацията е важен, ако сравнявате XML изхода с този на Excel: подразбиращата се дебелина на линията lineWeight е 0.75 пункта, а не цитираните в някои неофициални източници 1.25. [MS-XLSX] дефинира CT_SparklineGroup@lineWeight с подразбираща се стойност 0.75, което съответства на дебелината, която интерфейсът на Excel прилага. HotXLS спазва това правило: настройте LineWeight на стойност, различна от 0.75, и атрибутът ще бъде записан; оставете я на 0.75 и той ще бъде пропуснат. Грешка в стойността в коя да е посока води до генериране на линии, които изглеждат малко по-дебели или по-тънки от тези в Excel
Двупосочно четене/запис, копиране на листове и разширения, които HotXLS не моделира
Отварянето е огледален процес на записването. Когато HotXLS отваря работна книга със спарклайнове – независимо дали са генерирани от HotXLS или от Excel – анализаторът филтрира по съответния GUID и реконструира всяка група, член, цвят и опция за оста в типизирания модел, так че целият процес на отваряне-редактиране-запис ги запазва напълно. Копирането на работен лист в друга работна книга клонира спарклайн групите заедно с останалата част от листа, което прави лесно генерирането на отчети с шаблони: съхранявате форматиран шаблон, копирате го за всеки отчет и пренасочвате диапазоните
Списъкът extLst може също така да съдържа разширителни блокове, за които HotXLS няма типизиран модел – Excel записва x14 блокове за функции като срезове (slicers) и разширено условно форматиране в същия списък. От версия v2.131.0 тези външни блокове се запазват непокътнати при двупосочно пренаписване, вместо да се изтриват: анализаторът ги улавя, прави ги достъпни само за четене чрез Worksheet.RawWorksheetExts и ги записва обратно при запис на файла. Те се прехвърлят заедно с листа, когато той се копира в друга работна книга. Запазеният XML се реконструира от събитията на анализатора, така че той е семантично еквивалентен на оригинала, а не напълно идентичен по байтове, но Excel го приема без проблеми и функциите се запазват. Практическото следствие от това е важно при реална работа: отварянето и презаписването на клиентски файл вече не премахва разширенията, които HotXLS не поддържа типизирано
Реалната граница на функционалността: спарклайновете се визуализират в Excel 2010 и по-нови версии, както и във всеки друг четец, който поддържа x14 разширенията; Excel 2007 показва чистите данни без графиките, което съответства на планираната обратна съвместимост. Трите типа спарклайнове, осемте цвята, настройките за точки и трите режима за оси покриват напълно възможностите, които предлага интерфейсът на Excel. Поддръжката на спарклайнове, съвместно с останалата част от представеното XLSX ядро, се доставя с HotXLS Delphi Excel Component за Delphi и C++Builder