HotXLS створює спарклайни Excel (Sparklines — міні-діаграми, які Excel малює всередині однієї комірки) у Delphi та C++Builder за один виклик: метод TXLSXWorksheet.AddSparklineGroup будує групу спарклайнів над діапазоном даних, а при збереженні книги записує її як блок розширення x14 всередині списку розширень робочого аркуша extLst, який відтворюється в Excel 2010 і новіших версіях, а старіші переглядачі пропускають його без помилок. Жодних об'єктів діаграм, креслень чи прив'язок
Сценарій, за якого спарклайни є незамінними, завжди однаковий. Книга інформаційної панелі (dashboard) містить кілька сотень рядків (по одному на продукт, регіон чи рахунок), кожен із яких містить по дванадцять щомісячних показників, і наприкінці кожного рядка потрібно показати графік тренду. Якщо реалізувати це за допомогою звичайних діаграм, вам доведеться створити сотні елементів діаграм DrawingML, кожен із власним XML-файлом, зв'язком та геометрією прив'язки, не кажучи вже про те, як це вплине на розмір файлу та час його відкриття. Група спарклайнів — це один XML-блок, який вказує: «намалювати маленький графік від B2:M2 у N2, та від B3:M3 у N3», що дешево повторюється для будь-якої кількості рядків
Чому спарклайни є розширенням x14, а не діаграмою?
Спарклайни з'явилися в Excel 2010, через три роки після заморожування базової схеми ECMA-376, тому вони не могли перебувати у звичайній розмітці робочого аркуша без порушення роботи існуючих парсерів. Рішенням від Microsoft став механізм списку розширень: робочий аркуш може завершуватися елементом <extLst>, який містить блоки <ext>, кожен з яких позначений URI, що ідентифікує функцію ([MS-XLSX] §2.3.6). Спарклайни використовують URI {05C60535-1F16-4fd2-B633-F4F36F0B64E0} та простір імен x14. Переглядач, який розпізнає цей GUID, аналізує блок; той, який не розпізнає — зобов'язаний його пропустити. Це вся історія прямої сумісності, і саме тому Excel 2007 відкриває книгу зі спарклайнами без помилок — він просто показує вихідні числа без графічних елементів
Варто звернути увагу на одну деталь цього механізму, оскільки вона суперечить загальноприйнятій думці: в корені робочого аркуша не потрібне оголошення mc:Ignorable. Самого фільтра ext GUID цілком достатньо, і власний механізм запису Excel оголошує простір імен x14 локально в елементі <ext>, не змінюючи корінь. HotXLS наслідує цей самий шаблон, зберігаючи решту XML робочого аркуша недоторканою. У цьому полягає і структурна відмінність від звичайних діаграм: діаграма є окремим компонентом 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;
Перерахування TXLSXSparklineType містить три типи спарклайнів, які пропонує Excel: xlsxSparklineLine для графіків трендів, xlsxSparklineColumn для мініатюрних гістограм та xlsxSparklineStacked для діаграм виграшу/програшу (win/loss), де кожне значення відображається як блок вгору чи вниз. Кожен елемент спарклайну складається всього з двох рядків — F (вихідний діапазон аркуша) та Sqref (комірка, в якій малюється графік), тому для окремих рядків нічого більше налаштовувати не потрібно. Групи також можна створювати вручну через колекцію Worksheet.SparklineGroups, якщо ви хочете почати з порожньої групи замість стандартної
Маркери, колірні слоти та масштабування осей у типізованій моделі
Клас TXLSXSparklineGroup надає весь набір параметрів з панелі інструментів спарклайнів 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 серіалізує кожну групу як елемент x14:sparklineGroup, що містить атрибути типу та перемикачів, колірні слоти як дочірні елементи та список x14:sparklines, елементи якого пов'язують формулу діапазону xm:f із цільовою коміркою xm:sqref. Вся структура знаходиться всередині блоку <extLst><ext uri="{05C60535-1F16-4fd2-B633-F4F36F0B64E0}"> наприкінці компонента робочого аркуша з оголошенням простору імен x14 безпосередньо в блоці, точно так само, як це робить Excel. Робочий аркуш без груп спарклайнів взагалі не генерує extLst, тому файли, в яких ця функція не використовувалася, залишаються побайтово ідентичними до результатів попередніх версій HotXLS — відповідно до правил консервативного запису, описаних у статті про інфраструктуру збереження даних без втрат
Одна деталь специфікації має значення, якщо ви порівнюєте вихідні дані з результатами Excel або вручну перевіряєте XML: за замовчуванням товщина лінії 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