Примечания к выпуску HotXLS
История версий HotXLS с пользовательскими возможностями, исправлениями, улучшениями XLS/XLSX, экспортом, совместимостью и обновлениями документации
Последний выпуск
- Последняя версия: 2.136.0; Дата релиза: 2026-07-05
Версия 2.136.0
Added
- Chart axes are now fully programmable: a new
TXLSXChartAxismodel on each chart'sCategoryAxisandValueAxisexposesLogBase(logarithmic scale, e.g. 10 for base-10 log),Orientation(normal / reversed),MajorGridlines/MinorGridlines,MinValue/MaxValue(NaN = auto),MajorUnit/MinorUnit,CrossesAt,TickLblPos, andDispUnits(display units: hundreds / thousands / millions / billions / trillions). All default to Excel's auto behaviour, so existing charts emit the same XML as before; the writer adds<c:logBase>,<c:orientation>,<c:majorGridlines>,<c:majorUnit>,<c:crossesAt>,<c:tickLblPos>, and<c:dispUnits>only when the caller sets a non-default value, and reopening such a chart restores every setting
Версия 2.135.0
Added
- Chart error bars are now programmable and round-trip on the XLSX engine: each
TXLSXChartSeriesgainsAddErrorBar(dir)returning aTXLSXChartErrBarwithValueType(fixed / percentage / stdDev / stdErr / custom),Value,PlusValue/MinusValue(custom), andNoEndCap; one error-bar slot per direction (X / Y) is stored, the writer emits the matching<c:errBars>block, and reopening restores the direction, type, and magnitude so scientific / engineering charts keep their uncertainty indicators
Версия 2.134.0
Added
- Chart data labels are now programmable and round-trip on the XLSX engine: each
TXLSXChartSeriesgainsShowValue,ShowCategoryName,ShowSeriesName,ShowLegendKey,ShowPercent,ShowBubbleSize, andSeparatorproperties that emit the matching<c:dLbls>block with its<c:show*/>children; reopening such a chart restores the switches so 'show value' / 'show percent' settings survive a save-edit-save cycle
Версия 2.133.0
Добавлено
- Векторные форматы изображений EMF и WMF теперь являются основными типами изображений в движке XLSX:
TXLSXImageFormatполучаетxlsxImageEmf/xlsxImageWmf, модуль записи (writer) выводит соответствующие типы содержимогоimage/x-emf/image/x-wmfи расширения.emf/.wmf, а распознаватель формата (sniffer) распознает заголовки EMF (01 00 00 73), позиционируемый WMF (D7 CD C6 9A) и стандартный WMF — благодаря чему изображения, вставленные из Word или PowerPoint, которые Excel внедряет как векторные данные, теперь сохраняются при повторном сохранении (round-trip) вместо того, чтобы быть отброшенными
Исправлено
- Подпотоки диаграмм BIFF8, у которых запись GELFRAME (
$1066) пересекает границу продолжения в 8224 байта, больше не теряют геометрию заливки и линий: модуль чтения (reader) теперь принимает самопродолжение GELFRAME (Excel записывает еще одну$1066вместо стандартного$003CCONTINUE), а также позволяет стандартным записям CONTINUE объединяться внутри контекста диаграммы, соответствуя существующей многосегментной отправке модуля записи - Фоновые изображения колонтитулов BIFF8 (
$0866), полезная нагрузка которых выходит за пределы записей продолжения, больше не повреждаются: каждый сегмент продолжения дублирует 14-байтовый заголовок MSO, который модуль чтения теперь удаляет перед объединением, так что встроенные данные изображения больше не смещаются на 14 байт на сегмент
Версия 2.132.19
Исправлено
- Очистка хранилищ устаревшего XLS и зашифрованного XLSX теперь детерминированно освобождает потоки составных файлов, предотвращая блокировку временных файлов после операций сохранения, загрузки, VBA или работы с зашифрованными пакетами
- Форматированное отображение расширенных целочисленных значений variant теперь последовательно применяет запрошенный числовой формат, соответствуя существующему поведению для стандартных целочисленных значений
- Общие строки, валидация данных, листы диаграмм, ZIP-архивы, рисование PNG и формулы с повторяющимся текстом теперь более надежно очищают временные буферы при возникновении ошибок и операциях с длинным текстом
Версия 2.132.18
Исправлено
- Присвоение значений внутреннему построителю строк теперь очищает предыдущий текст при присвоении пустой строки, предотвращая сохранение устаревшего содержимого в повторно используемых буферах XML и текста
Версия 2.132.17
Исправлено
- Создание листов диаграмм XLS теперь принимает имена исходных листов в кавычках, содержащие восклицательный знак, отклоняет слишком большие ссылки на строки до того, как они смогут перерасти в допустимую строку BIFF, и ограничивает имена легенд линий тренда лимитом короткого текста BIFF, чтобы создаваемые записи диаграмм оставались корректными
Версия 2.132.16
Исправлено
- Внутренние списки строковых ключей и ключей объектов теперь удаляют устаревшие ключи поиска при перезаписи существующего слота, предотвращая разрешение старых ключей в замещающие записи
- Внутренние замены списков объектов и кэши преобразованных уникальных ключей теперь освобождают собственные записи при перезаписи, очистке и уничтожении, предотвращая утечки памяти при повторяющихся операциях с книгами и стилями
Версия 2.132.15
Исправлено
- Прямое потоковое чтение XLSX теперь декодирует логические ячейки, которые хранят литеральные значения OOXML, такие как true и false
- Обновления индексов внутренних списков строк теперь удаляют устаревшие ключи при перезаписи существующего слота, предотвращая разрешение старых имен в новое значение
Версия 2.132.14
Исправлено
- Сообщения подсказок и ошибок валидации данных BIFF8, первый символ которых равен NUL, теперь сохраняют границы записей вместо записи несоответствующей длины DV
Версия 2.132.13
Исправлено
- Анализ XML-текста теперь отклоняет вложенные начала сущностей, такие как &&, вместо того чтобы молча отбрасывать незавершенную сущность
- Декомпилированные формулы теперь записывают числовые константы с инвариантным десятичным разделителем-точкой, чтобы текст формулы оставался переносимым между региональными настройками
Версия 2.132.12
Исправлено
- Прозрачность палитры PNG теперь игнорирует прозрачные цвета, которые отсутствуют в палитре изображения, вместо того чтобы помечать произвольный индекс палитры как прозрачный
- Формулы SUMPRODUCT теперь прекращают сканирование оставшихся строк после первой строки вне используемого диапазона в аргументах длинного диапазона, избегая ненужного чтения ячеек и сохраняя вычисленный результат
Версия 2.132.11
Исправлено
- Формулы TEXT теперь возвращают #VALUE!, если не удается применить недопустимый или слишком большой числовой формат, вместо того чтобы обрабатывать это как пустой успешный результат
- Усечение таблицы общих строк теперь освобождает правильные хвостовые блоки и сохраняет таблицу пригодной для повторного использования после больших циклов удаления
Версия 2.132.10
Исправлено
- Точные поиски MATCH теперь поддерживают подстановочные знаки Excel, а метаданные смещения строк классического XLS теперь игнорируют строки вне блока вместо повреждения структуры сохраненной книги
- Метаданные сжатого текста PNG теперь безопасно освобождают временные буферы, если обработка чанка вызывает исключение
Версия 2.132.9
Исправлено
- Метаданные сжатого текста PNG, вставка в список чанков и обработка порядка байтов CRC теперь остаются стабильными на всех поддерживаемых платформах Windows
Версия 2.132.8
Исправлено
- Формулы LEFT и RIGHT теперь возвращают #VALUE!, если num_chars не удается преобразовать в допустимое целое число
Версия 2.132.7
Исправлено
- Формулы SEARCH теперь поддерживают подстановочные знаки ?, * и ~ в стиле Excel
- Валидация имени листа теперь отклоняет недопустимые символы имени листа Excel при переименовании листов
- Удаление ручных разрывов страниц теперь работает после вставки разрыва перед существующими разрывами
Версия 2.132.6
Исправлено
- Формулы DATE теперь соответствуют поведению циклического переноса месяцев и дней, совместимому с Excel, включая такие вызовы, как DATE(2008,14,2)
- Чтение свойства Hidden для диапазонов столбцов теперь сообщает видимость каждого столбца вместо смешивания с состоянием видимости строк
- Метаданные строк BIFF на пределе строк Excel 97-2003 теперь загружаются корректно, сохраняя настройки для строки 65536
Версия 2.132.5
Исправлено
- Загрузка книг BIFF теперь допускает некорректные цвета вкладок листов, усеченные метки сводных таблиц и недействительные фрагменты дат кэша сводных таблиц без вызова исключений
- Загрузка пакетов книг и потоков теперь более последовательно очищает неудачные пути настройки архива и хранилища, избегая утечки ресурсов при неверных входных данных или неудачном открытии хранилищ на основе потоков
Версия 2.132.4
Исправлено
- Обработка ZIP-архивов теперь завершает текущий пакет перед повторным использованием того же объекта архива для другого пакета, а открытие архивов на основе файлов теперь допускает одновременное чтение несколькими пользователями
Версия 2.132.3
Исправлено
- Запись пакетов книг теперь сохраняет имена записей ZIP, отличные от ASCII, с использованием метаданных UTF-8, предотвращая появление кракозябр при наличии текста Unicode в именах частей пакета
- Вывод XML теперь записывает необработанный текст и значения атрибутов в виде байтов UTF-8, когда экранирование отключено, соответствуя объявленной кодировке документа
- Вычисление формул теперь очищает состояние выполнения после исключений в обратных вызовах и корректно обрабатывает отмену вычислений с большими числами в сборках Delphi с поддержкой Unicode
- Извлечение матрицы формул массивов теперь учитывает ненулевые нижние границы массивов Variant вместо вызова ошибки для корректных массивов с базой от единицы
Версия 2.132.2
Изменено
- Сортировка диапазонов теперь использует стабильный проход упорядочивания O(n log n) для больших отсортированных диапазонов, сохраняя существующее поведение повторного сохранения (round-trip) содержимого строк
- Анализ и форматирование чисел в ODS и XLSX теперь повторно используют инвариантное состояние форматирования вместо его постоянного создания на часто используемых путях выполнения
Исправлено
- Анализ XML теперь принимает корректные блоки CDATA и инструкции обработки UTF-8 без повреждения текста или сбоев на корректной разметке
- Анализ формул теперь принимает экспоненциальное представление со знаком и корректно отклоняет поврежденные или усеченные байты формул
- Классические пути открытия и сохранения книг теперь надежно освобождают потоки и хранилища после ошибок, предотвращая блокировку временных файлов
- Обработка двоичных буферов теперь проверяет границы копирования и чтения, увеличивает целевые буферы перед копированием и корректно отклоняет некорректные обратные ссылки сжатия VBA
Версия 2.132.1
Исправлено
- Исправлено сообщение об ошибке, возникающее, когда зашифрованная книга использует неподдерживаемую схему шифрования: ранее в нем утверждалось, что шифрование ECMA-376 Agile Encryption не может быть прочитано, хотя дешифрование Agile (AES-128/192/256) поддерживается начиная с версии 2.119.0. Теперь в сообщении перечислены действительно поддерживаемые схемы
- Open теперь перенаправляет вызывающих абонентов на TXLSXWorkbook.OpenEncrypted, когда он отклоняет зашифрованный пакет OOXML, вместо сообщения о том, что зашифрованные книги не поддерживаются
Версия 2.132.0
Изменено
- Загрузка XLSX стала значительно быстрее: модуль чтения XML теперь интернирует повторяющиеся имена элементов и преобразует значения текста и атрибутов непосредственно из своего буфера сканирования, сокращая выделение памяти на ячейку более чем наполовину. Многопоточное открытие (2.128.0) получило наибольшую выгоду — удаленные выделения памяти были именно теми, которые сериализовали рабочие потоки — теперь на многоядерных машинах книги с несколькими листами открываются почти в два раза быстрее по сравнению с однопоточным путем; однопоточное открытие также выигрывает несколько процентов
Версия 2.131.0
Добавлено
- Блоки расширения листов, которые HotXLS не моделирует — записи
<ext>в<extLst>листа, отличные от спарклайнов, записываемые Excel для таких функций, как условное форматирование x14 или срезы — теперь сохраняются дословно при открытии книги и записываются обратно при сохранении, поэтому повторное открытие и сохранение файла больше не удаляет эти расширения. Перехваченные блоки доступны только для чтения черезWorksheet.RawWorksheetExtsи переносятся вместе с листом при его копировании в другую книгу
Версия 2.130.0
Добавлено
- Сохраненные книги, содержащие формулы, теперь несут в себе часть цепочки вычислений
xl/calcChain.xml, позволяя Excel инициализировать свой механизм зависимостей на основе записанного порядка вместо его перестройки при загрузке. После вызоваRecalculateцепочка следует за топологическим порядком графа зависимостей; в противном случае ячейки с формулами перечисляются в порядке документа (верная подсказка, которую Excel уточняет на лету). Данная часть, ее тип содержимого и связь с книгой выводятся вместе и сохраняются при повторном сохранении (round-trip)
Версия 2.129.0
Добавлено
- Новое свойство
Workbook.ParallelParseThreadsнастраивает количество рабочих потоков для многопоточного пути Open, представленного в версии 2.128.0 (0 = автоматически, один рабочий поток на ядро процессора). Анализ листов требует много ресурсов, а выделение памяти сериализуется между потоками, поэтому на некоторых рабочих нагрузках небольшое явное ограничение работает так же хорошо — или даже лучше — чем полное количество ядер; свойство позволяет интеграторам выбирать оптимальное значение для своих файлов
Версия 2.128.0
Добавлено
- Многопоточная загрузка XLSX: открытие книги теперь выполняет анализ XML каждого листа — это основные затраты для больших файлов — в рабочих потоках, благодаря чему многолистовые книги открываются быстрее на многоядерных машинах. Части листов извлекаются из пакета заранее, и каждый рабочий поток работает только со своим листом, поэтому загруженная книга идентична результату последовательной загрузки
- Новое свойство
Workbook.ParallelParse(по умолчаниюTrue) возвращает к однопоточному анализу при значенииFalseперед вызовомOpen— это отключение одной строкой кода для ограниченных сред
Изменено
- Обратный вызов чтения
OnProgressпо-прежнему срабатывает один раз для каждого листа в вызывающем потоке, но теперь при отправке каждого листа на анализ, а не строго между листами
Версия 2.127.0
Добавлено
- Инкрементный пересчет на движке XLSX: новый метод
Workbook.Recalculateстроит граф зависимостей формул, вычисляет каждую ячейку с формулой один раз в порядке зависимости и сохраняет каждый результат в кэшированном значении ячейки. Последующие вызовы пересчитывают только те ячейки, на которые повлияли изменения значений со времени последнего прохода — в связанных моделях (финансовые таблицы, каскады отчетов) редактирование одного входного значения пересчитывает только зависимые от него формулы вместо пересчета всей книги - Летучие функции (
NOW,TODAY,RAND,OFFSET,INDIRECT) пересчитываются при каждом проходе, так же как и формулы, ссылки которых не могут быть разрешены статически (имена нескольких областей, внешние книги) — движок выполняет избыточный пересчет вместо риска получить устаревший результат - Вместо зацикливания обнаруживаются циклические ссылки:
Recalculateвозвращает код ошибки, когда формулы образуют круговую цепочку, пропускает участников цикла и при этом вычисляет каждую формулу за его пределами. Ссылки между листами, именованные диапазоны и CSE-формулы массивов (результаты распределяются по закрепленному диапазону) полностью участвуют в графе зависимостей
Изменено
- Существующий путь
Calculateпо запросу остался без изменений;Recalculate— это отдельный выбираемый API, и книги, которые никогда его не вызывают, ведут себя точно так же, как раньше
Версия 2.126.0
Добавлено
- Спарклайны в движке XLSX: теперь листы содержат группы спарклайнов — встроенные в ячейки мини-диаграммы, которые Excel отображает на основе диапазона данных — с тремя типами Excel (график, гистограмма, выигрыш/проигрыш). Создайте одну с помощью
Worksheet.AddSparklineGroupили создайте группы вручную через новую коллекциюWorksheet.SparklineGroups, добавляя любое количество спарклайнов в группу с указанием исходного диапазона и ячейки отображения для каждого - Группы спарклайнов предоставляют полный набор параметров, предлагаемых Excel: толщину линий, маркеры точек данных, переключатели выделения максимальных/минимальных/отрицательных/первых/последних точек, восемь слотов цветов ARGB (ряд, отрицательные, ось, маркеры, первый, последний, максимальный, минимальный), масштабирование вертикальной оси для всей группы или для отдельного спарклайна, а также обработку пропусков/нулей/интервалов для пустых исходных ячеек
- Спарклайны сохраняются при полном цикле сохранения и открытия: сохранение выводит блок расширения листа
extLst([MS-XLSX] §2.3.6) со спарклайнами, чтобы Excel 2010 и более поздние версии отображали их, а открытие такой книги — будь она записана HotXLS или Excel — перестраивает каждую группу, параметр и диапазон, обеспечивая их сохранение после циклов редактирования. Копирование листа в другую книгу также клонирует его группы спарклайнов
Версия 2.125.0
Добавлено
- Семь функций работы с текстом с подсчетом байтов DBCS из анализа пробелов XLSSuit теперь вычисляются на обоих движках:
LEFTB,RIGHTB,MIDB,LENB,FINDB,SEARCHBиREPLACEB. Каждая функция обрабатывает входные данные как байтовую строку в соответствии с системной кодовой страницей ANSI, поэтому символы CJK (китайский/японский/корейский) занимают 2 байта, в то время как ASCII занимает 1; операции, которые разделили бы пару начального и конечного байтов DBCS, возвращаются к ближайшей границе символа, соответствуя поведению Excel
Версия 2.124.0
Добавлено
- Пять функций проверки гипотез и функций распределения из анализа пробелов XLSSuit теперь вычисляются на обоих движках:
Z.TEST(односторонняя правосторонняя вероятность того, что среднее значение выборки составляет не менееxпри нулевой гипотезе),T.TEST(p-значение парного двухвыборочного t-теста; несвязанные типы с равной/неравной дисперсией отложены),CHISQ.TEST(p-значение критерия согласия через правостороннюю функцию распределения хи-квадрат CDF),HYPGEOM.DIST(гипергеометрический PMF/CDF с кумулятивным флагом) иNEGBINOM.DIST(отрицательный биномиальный PMF/CDF). Вычисление p-значения повторно использует существующие вспомогательные функции CDF нормального распределения/Стьюдента/хи-квадрат через независимые вложенные процедуры, поэтому ни один из существующих методов Calc не меняется
Версия 2.123.0
Добавлено
- Четырнадцать функций формул, которые при сравнении с XLSSuit были определены как недостающие, теперь вычисляются на обоих движках:
AVERAGEIF(среднее по одному критерию, аналог SUMIF/COUNTIF, которого не хватало движку),WORKDAY.INTLиNETWORKDAYS.INTL(пользовательские маски выходных дней с помощью числовых кодов 1-17 или 7-символьной строки Mon-Sun),XIRRиXNPV(внутренняя ставка доходности и чистая приведенная стоимость для денежных потоков с нерегулярными датами, решаемые методом дихотомии),CEILING.PRECISE/FLOOR.PRECISE/ISO.CEILING(округление без учета знака),PERCENTRANK.INC/PERCENTRANK.EXC(процентный ранг с соответствующей включающей/исключающей интерполяцией),MODE.MULT(выводит все значения с одинаковой максимальной частотой),ERF.PRECISE(функция ошибок Гаусса через ее знакочередующийся ряд),ACCRINT(накопленные проценты) иISPMT(проценты за период при амортизации с постоянной основной суммой)
Версия 2.122.0
Добавлено
- Вложенные комментарии (Excel 365) теперь сохраняются при повторном сохранении (round-trip) в движке XLSX: методы
AddThreadedCommentиAddThreadedReplyна листе строят родительско-дочернее дерево ответов с привязкой к ячейке, автоматически регистрируют каждого автора в новом спискеPersonsна уровне книги и выводят выделенную частьxl/threadedComments/threadedCommentN.xmlдля каждого листа плюсxl/person/person.xmlна уровне книги; повторное открытие такого пакета восстанавливает дерево диалогов и список участников из этих частей, поэтому цепочки ответов, идентификаторы и отображаемые имена сохраняются при полном цикле чтения и записи
Версия 2.121.0
Добавлено
- Вычислитель формул теперь рассчитывает функции динамических массивов Excel 365:
XMATCH,SORT,UNIQUEиSEQUENCE, присоединяясь к уже поддерживаемымXLOOKUPиFILTER; результаты распределяются как двумерные массивы, поэтомуSEQUENCE(3;2;1;1)возвращает сетку 3×2,SORTпереупорядочивает строки по любому ключевому столбцу по возрастанию или убыванию,UNIQUEсворачивает повторяющиеся строки, сохраняя первое вхождение, аXMATCHсообщает позицию искомого значения (начиная с 1) с теми же режимами точного совпадения, использования подстановочных знаков, следующего меньшего или следующего большего, что иXLOOKUP
Версия 2.120.0
Добавлено
- Новый метод
PasteFromClipboardна листах обоих движков считывает текст с разделителями-табуляциями из буфера обмена Windows — полезную нагрузку, которую Excel помещает туда при копировании диапазона, или просто выделение из любого другого приложения — и записывает его в ячейки, начиная с заданных строки и столбца, с тем же приведением числовых, календарных и логических типов данных, которое уже использует загрузчик CSV; текст с ведущим знаком=становится действующей формулой, аналогично тому, как выполняет вставку сам Excel
Версия 2.119.0
Добавлено
- Чтение шифрования ECMA-376 Agile Encryption — защиты паролем, которую Excel 2010 и более поздние версии применяют по умолчанию:
OpenEncryptedтеперь анализирует дескриптор шифрования XML, извлекает ключи с помощью хеширования SHA-512 с числом итераций, проверяет пароль и расшифровывает сегментированный пакет AES-CBC (AES-128/192/256), благодаря чему книги, защищенные паролем непосредственно в Excel, открываются без установленного Excel OpenEncryptedобрабатывает все три случая через единую точку входа: обычный незашифрованный.xlsx, Standard Encryption (наш циклSaveAsEncrypted) и Agile Encryption; неверный пароль вызывает одну и ту же понятную ошибку в любой схеме
Исправлено
- Сохранение книги
.xlsx, размер XML-файла листа которой превышал примерно 116 KB — около 3000 строк обычных строковых данных — приводило к сбою с переполнением стека; контрольная сумма CRC-32 модуля записи ZIP теперь обрабатывает данные частями по 64 KB, что уводит бэкенд сжатия с его пути кода больших входных данных, который выделяет избыточный рабочий буфер в стеке. Результат вычисления контрольной суммы не изменился - Дедупликация общих строк теперь выполняется через хэш-таблицу вместо сканирования списка строк, а часть
sharedStrings.xmlсобирается с помощью предварительно увеличенного построителя строк вместо многократного объединения — вместе с константным временем обращения к индексу ячеек это сокращает время сохранения 120 000 ячеек со строками с десятков секунд примерно до трети секунды
Версия 2.117.0
Изменено
- XLSX ячейка access является now constant-time: лист ячейка коллекция carries hash индекс over (строка, столбец), replacing previous linear scan — so populating, reading back, или loading large лист scales linearly с ячейка count instead из quadratically; filling 100,000 ячейки now takes well under second where it previously took minutes
- speedup applies across engine:
Cells[r, c],HasCell, книга loading, saving, cross-книга copies, auto-fit, и каждый helper который touches ячейки через position all benefit; строка и столбец insertion или deletion rebuilds индекс в single pass
Версия 2.116.0
Добавлено
- PDF export в классический XLS engine: new
SaveAsPDFметоды on лист и книга render используемый диапазон (или caller-supplied диапазон черезTXLSPDFExport) as paginated grid — ячейка display текст через number формат, gridlines, столбец widths derived из Excel widths и scaled к fit страница, и automatic multi-страница pagination - Output является self-contained PDF 1.4 файл с no external dependencies, с помощью built-в Helvetica шрифт с WinAnsi текст encoding; portrait или landscape A4 orientation, страница margin, и шрифт size являются configurable on exporter
- этот является data-presentation export alongside HTML и RTF: it reproduces tabular content и layout для reports и document handoff rather than full per-ячейка styling
Версия 2.115.0
Добавлено
- один-call chart creation из data диапазон в XLSX engine: new
AddChartFromRangebuilds complete chart и derives its series automatically из rectangular data block — equivalent из Excel's "insert chart из selection" — с series-в-столбцы или transposed series-в-строки layout - Named shortcuts
AddColumnChart,AddBarChart,AddLineChart,AddPieChart, иAddAreaChartpick chart type через имя over same один-call flow, reading series names из header строка и category labels из first столбец - Series references являются qualified с source лист's quoted имя, so generated chart keeps working когда placed on any лист и survives save и reload
Версия 2.114.0
Добавлено
- RTF import в классический XLS engine, inverse для существующий
SaveAsRTFexport: newOpenRTFметоды on лист и книга read RTF document's table в лист ячейки —\celladvances столбец,\rowadvances строка — starting at A1 - Recovers tabular data из файлы produced через
SaveAsRTF, Word, или WordPad: numeric текст является stored as номера so формулы keep working, hex (\'hh) и Unicode (\uN) escapes decode correctly, и header groups (шрифт table, цвет table, stylesheet, info) являются skipped - Documents с no table fall back к paragraph mode, importing each
\paras next строка в столбец
Версия 2.113.0
Добавлено
- Reading из encrypted
.xlsxкниги:OpenEncryptednow decrypts ECMA-376 Standard Encryption (AES-128) packages, completing round trip с существующийSaveAsEncrypted— it reads compound-файл container, derives key из пароль, verifies it, и loads recovered книга - wrong пароль raises clear "пароль является incorrect" error, и
OpenEncryptedon plain unencrypted.xlsxcontinues к load it directly, so callers может route каждый файл через один запись point
Изменено
- unsupported-encryption message now names ECMA-376 Agile Encryption specifically as remaining unsupported scheme, since Standard Encryption reading и writing являются both доступен
Версия 2.112.0
Добавлено
- New
TaggedTextсвойство on XLSX ячейки converts between rich текст и lightweight markup:<b>,<i>,<u>,<s>,<sub>,<sup>,<color=#RRGGBB>,<font=Name>, и<size=N>, с</>/&escapes — so multi-формат ячейка content может be produced из template String instead из assembling run объекты через hand - Writing markup builds run list и keeps
Valueas concatenated plain текст; markup без tags stores plain String с no rich payload; reading serializes each run's attributes as complete tag задает; unknown tags pass через as literal текст
Исправлено
- rich-текст run consisting entirely из whitespace (для example single styled space between words) now survives save и reload; previously space was dropped когда файл was reopened
Версия 2.111.0
Добавлено
- New
OnProgressсобытие on XLSX книга reports load и save progress: it fires once per лист as it является parsed duringOpenили emitted duringSaveAs, carrying phase (reading или writing), current 1-основанный лист number, и total — so applications может drive progress bar over long multi-лист operations at negligible callback cost
Версия 2.110.0
Добавлено
- New
TXLSRowCursordataset-стиль строка cursor для.xlsx/.xlsmфайлы:Open,SelectSheet, thenFindFirst/FindNextwalk лист один строка at time с только current строка's ячейки в memory — pull-driven alternative кTXLSDirectReader's callbacks для sequentially processing multi-million-строка листы - Each строка exposes its 1-основанный лист строка number, populated ячейки в document order (типизированный значение, формула текст, стиль индекс), и
ValueByCollookup который возвращаетNullдля столбцы not populated on который строка; строки с no populated ячейки являются skipped - лист names и count являются доступен after
Open(файл и stream overloads), с shared strings и date-формат detection handled same way as streaming reader
Версия 2.109.0
Добавлено
- New
TXLSXCellFormat"формат brush" для XLSX engine: describe шрифт, fill, граница, alignment, number формат, и protection once, then stamp any number из targets сApply(single ячейка),ApplyRange,ApplyRows,ApplyCols, илиApplySheet - только aspects actually touched являются applied — brush который задает just
Font.Boldleaves targets' fills, границы, и number форматы untouched — so brushes compose с существующий formatting like Excel's формат painter - Each apply resolves touched aspects в книга стиль pools once и then writes только pool indices per ячейка, so formatting large диапазоны costs один pool lookup per aspect rather than per ячейка;
ApplyRangematerializes missing ячейки пока строка/столбец/лист forms stamp существующий ячейки только
Версия 2.108.0
Добавлено
- Localizable Boolean display текст: new
XLSBooleanTrueText/XLSBooleanFalseTextvariables control how Boolean ячейка значения render wherever display текст является produced —FormattedText, HTML export, и auto-fit measurement — so localized applications может show для example WAHR/FALSCH или VRAI/FAUX
Изменено
- Boolean ячейки now display as
TRUE/FALSEчерез default, matching Excel's grid, instead для runtime'sTrue/Falsecapitalization
Версия 2.107.0
Добавлено
- New
OnPasswordсобытие on классический XLS книга: когдаOpenmeets encrypted книга и supplied пароль является missing или wrong, событие asks application для пароль и retries open (up к three attempts) — so interactive tools может prompt user instead из pre-loading passwords или inspecting error codes - событие receives current пароль через справочник и
Retryflag; leavingRetryatFalsegives up и возвращает original пароль error
Версия 2.106.0
Добавлено
- New
TXLSFileMonitorкласс watches книга файл on disk и firesOnFileChangedкогда another process — typically Excel — saves over it, so applications может reload и refresh their view automatically - Polling-основанный (last-write time plus size,
IntervalMsconfigurable, 1 s default), so it works on local disks и network shares alike без message loop;SynchronizeEventchooses between main-thread delivery для UI handlers (default) и direct watcher-thread delivery для console или service code - файл который briefly disappears during save cycle does not fire false событие; change является reported once new content является в place
Версия 2.105.0
Добавлено
- Bounded auto-fit в классический XLS engine, matching limits XLSX engine already offers: new
AutoFit(Columns, AMin, AMax),ColumnsAutoFit(AMinWidth, AMaxWidth), иRowsAutoFit(AMinHeight, AMaxHeight)overloads clamp каждый fitted столбец ширина (Excel ширина units) или строка высота (points) к given диапазон — 0 leaves side unbounded, и all-empty столбец или строка still receives requested minimum
Версия 2.104.0
Добавлено
- New Только чтение
FormattedTextсвойство Возвращает ячейка's display текст — stored значение rendered через its number формат, way Excel shows it в grid — covering thousands separators, decimals, percentages, date и time masks, multi-section positive/negative/zero masks, и Boolean форматы - доступен в both engines: on
IXLSRangeв классический XLS engine (multi-ячейка диапазоны render their anchor ячейка) и onTXLSXCellв XLSX engine (rich-текст ячейки вернуть their concatenated run текст)
Версия 2.103.0
Добавлено
- New
DetectExcelContentFormatфункция (файл имя и stream overloads) identifies книга's container из its leading bytes rather than файл extension — reporting BIFF/OLE compound файл, OOXML.xlsxpackage, OpenDocument.odspackage, или plain delimited текст — so applications может route renamed или extension-less файлы к right loader
Изменено
TXLSWorkbook.Opennow sniffs content signature и rejects ZIP-основанный packages (.xlsxили.odsrenamed к.xls) с clear message naming right loader, instead из failing с opaque error codeTXLSXWorkbook.Opennow recognizes OLE compound-файл content (legacy.xlsrenamed к.xlsx, или encrypted package) и reports what файл actually является, instead из surfacing ZIP parser error
Версия 2.102.0
Добавлено
- Cross-книга лист copy в классический XLS (BIFF8) engine now brings книга-level defined names формула uses over к destination — same thing Excel does когда лист moves between книги: имя destination already has является bound as-является (no duplicate является created), missing имя является registered с its original definition и visibility so формула recompiles against it, и имя whose definition cannot resolve в destination (для example, it points at лист который does not exist there) leaves формула on its computed значение as before
Версия 2.101.0
Добавлено
- Cross-книга лист copy в классический XLS (BIFF8) engine now re-points формулы at source книга as external link когда destination has no лист для referenced имя и source has been saved к файл: copied ячейка stays live формула (its references switch к [SourceBook]лист form), source's computed значение является kept as cached result so reads keep working until link является refreshed, и external книга справочник round-trips через save и reload; формулы carrying defined-имя references, и copies из unsaved source книги, keep computed значение as before
Версия 2.100.0
Добавлено
- Array формулы now survive лист copies в классический XLS (BIFF8) engine: each array диапазон является rebuilt as whole в copy — within same книга и across книги alike — с root формула recompiled against destination's лист names; array destination cannot recompile keeps its computed значения instead
Исправлено
- Copying диапазон который содержит array-формула ячейки between классический XLS листы no longer risks crash on spill ячейки (which carry no формула tree из their own); such ячейки now transfer their computed значение
Версия 2.99.0
Добавлено
- Chart листы может now be copied between классический XLS (BIFF8) книги: chart record stream является cloned в destination, series category / значение / имя references являются recompiled against destination's лист names (series whose лист has no same-имя counterpart falls back к empty справочник so файл still opens), chart шрифт references migrate через значение в destination шрифт table, и страница setup, tab цвет, zoom, и visibility для chart лист come along; этот removes last documented limitation для cross-книга лист copy
Версия 2.98.0
Добавлено
- Cross-книга лист copy в классический XLS (BIFF8) engine now preserves rich-текст formatting inside ячейки: each formatting run's шрифт является migrated через значение в destination книга's шрифт table и run является rewritten к point at it, so mixed-шрифт strings keep their appearance instead из falling back к plain текст; phonetic (Far-East) auxiliary data travels с String as well
Исправлено
- шрифты referenced только через rich-текст runs (и not через any ячейка формат) являются no longer dropped из шрифт table когда saving классический XLS книга, и runs now follow same шрифт reordering as ячейка форматы on save, so rich-текст strings keep correct шрифты after save/reload cycle
Версия 2.97.0
Добавлено
- Cross-книга лист copy в классический XLS (BIFF8) engine now also clones embedded pictures: image bytes migrate в destination книга's picture store (identical images являются shared rather than duplicated), и each picture frame keeps its ячейка anchor, size, visibility, и transparent цвет; new CrossWorkbookCopyXls sample project demonstrates классический-engine copy end к end
Изменено
- классический XLS cross-книга copy limitations являются now documented: chart листы являются not copied (AddCopy возвращает nil для them), и формула whose лист справочник has no same-имя лист в destination keeps source's computed значение instead из becoming external справочник
Версия 2.96.0
Добавлено
- Cross-книга лист copy в классический XLS (BIFF8) engine now also clones conditional форматы (ячейка-является и expression rules, data bars, цвет scales, icon задает, и their differential styles), data validations (list, numeric, date, текст-length, и custom rules с prompt и error boxes), AutoFilter definition с its per-столбец criteria (dropdown buttons являются rebuilt в copy), и таблицы (ids и names являются re-issued so they stay unique в destination книга); rule формулы являются recompiled against destination's лист names, matching behavior из ячейка формулы
Версия 2.95.0
Добавлено
- классический XLS (BIFF8) листы может now be copied из один книга в another: TXLSWorksheets.AddCopy добавляет new лист к destination книга и copies source лист's ячейка значения, формулы (re-encoded as текст so destination recompiles them against its own лист names, keeping same-имя 3D references live), merged ячейки, комментарии, гиперссылки, строка heights, столбец widths, outline levels, frozen panes, лист protection, страница setup, manual страница breaks, tab цвет, и view settings; ячейка, строка, и столбец форматы являются migrated через значение в destination книга's формат table, so styled source produces independently styled copy
- Cross-книга формат migration в классический XLS engine now carries full-precision RGB и тема цвета alongside each формат запись, so fills, шрифты, и границы keep their exact цвета instead из falling back к palette approximations; этот also applies к диапазон-level paste between книги
Версия 2.94.0
Добавлено
- Cross-книга лист copy now clones conditional форматы (с their differential styles и dataBar / colorScale / iconSet visual payloads), таблицы, data validations, и charts (с каждый series); each sub-объект deep-copies its own state в destination лист
- Cross-книга формула references являются rewritten: справочник whose лист имя exists в destination resolves as-является, otherwise it becomes external справочник back к source книга (which является registered as external link) или #REF! когда source has no файл identity; rewrite applies к ячейка формулы, conditional-формат rules, data-validation формулы, и chart series диапазоны alike
Версия 2.93.0
Добавлено
- лист может now be copied из один книга в another: TXLSXSheets.AddCopy добавляет new лист к destination книга и copies source лист's ячейки, формулы, merged диапазоны, столбец/строка sizing, hidden/collapsed/outline flags, freeze panes, view state, protection, страница setup, AutoFilter диапазон, и tab colour onto it; six per-ячейка стиль indices являются remapped в destination книга's own шрифт/Fill/граница/NumberFormat/Alignment/Protection pools via значение-equality lookup, so styled source produces independently-styled copy rather than indices pointing at wrong pool
- six per-attribute стиль pools (шрифты, Fills, границы, NumberFormats, Alignments, Protections) each expose 1-основанный LookupOrAdd который deduplicates через значение; new CrossWorkbookCopy sample project demonstrates cross-книга copy с стиль сохранение
Версия 2.92.0
Добавлено
- XLSX книги now поддержка сводные таблицы: TXLSXWorksheet.AddPivotTable scans flat source диапазон, auto-builds pivot cache, и Возвращает типизированный сводная таблица для строка / столбец / страница / data-axis wiring, mirroring long-standing BIFF8 (XLS) engine API so same code targets either формат; PivotSetDataFieldFormat assigns number формат к each aggregated значение field
- Excel-created сводные таблицы круговой обмен без loss через Open then Save: XLSX engine preserves each pivot cache definition, cache records, и сводная таблица part verbatim и replays original bytes on save, so re-saving книга never drops или alters its pivots even когда they use возможности типизированный модель does not expose
Версия 2.91.0
Добавлено
- Автофильтр рабочего листа теперь можно применять к данным, так что сохраненная книга открывается с уже скрытыми несовпадающими строками, аналогично поведению Excel при выборе значения из выпадающего списка фильтра
- Встроенные изображения предоставляют свою геометрию в реальных единицах (сантиметрах, дюймах, пунктах) наряду со значениями EMU, и их размер можно изменять с помощью коэффициента масштабирования с возможностью сохранения пропорций
- Поля параметров страницы теперь можно задавать напрямую в сантиметрах в качестве удобной метрической альтернативы полям в дюймах
- Защищенные рабочие листы XLSX теперь предоставляют пятнадцать детальных переключателей разрешений (форматирование ячеек, вставка/удаление строк и столбцов, сортировка, AutoFilter, выделение заблокированных/разблокированных ячеек и другие) через новое свойство AllowOption, что соответствует списку флажков в Excel «Рецензирование» > «Защитить лист»; настройки для каждого действия сохраняются при записи и чтении файла
- Рабочие листы XLSX теперь можно дублировать (TXLSXSheets.Duplicate): добавляется новый лист, на который копируются ячейки исходного листа, объединенные диапазоны, размеры столбцов/строк, закрепленные области, состояние просмотра, защита, параметры страницы и цвет вкладки, аналогично команде Excel: щелчок правой кнопкой мыши > «Переместить или скопировать» > «Создать копию»
- Двадцать два новых примера проектов демонстрируют возможности библиотеки: шифрование книги, комментарии к ячейкам, гиперссылки, определенные имена, вычисление AutoFilter, встроенные изображения, шаблон счета-фактуры, расширенное условное форматирование XLSX, объединенные ячейки, группировка строк/столбцов, закрепленные области, многолистовая структура, формулы массива, копирование/перемещение диапазонов, поиск/замена, системы дат, rich text, расширенные параметры CSV, параметры экспорта HTML, пользовательские числовые форматы, скрытые строки/столбцы и защита рабочего листа
Версия 2.90.29
Изменено
- Потоковый прямой читатель теперь подсчитывает каждую заполненную ячейку, даже если обработчик для отдельных ячеек не прикреплен, поэтому обычный вызов ReadFile можно использовать для быстрого определения размера листа; возвращаемое количество и свойство CellCount сообщают о числе отсканированных заполненных ячеек
Версия 2.90.28
Добавлено
- Формулы теперь можно вычислять пошагово, что эквивалентно команде Excel «Вычислить формулу»: новый трассировщик сокращает выражение по одному подшагу за раз, начиная с самого внутреннего, и сообщает о каждом сокращении вместе с его исходным подвыражением, тем же подвыражением после замены операндов их значениями и результирующим значением, чтобы приложения могли показать, как формируется результат; он соблюдает приоритет операторов, сохраняет ссылки на диапазоны нетронутыми для таких функций, как SUM, и повторно использует механизм вычислений листа, так что каждый шаг совпадает с полным перерасчетом
Версия 2.90.27
Добавлено
- Книги XLSX теперь можно создавать ячейка за ячейкой с помощью нового потокового прямого писателя, который выводит каждый лист прямо в пакет по мере поступления строк, не создавая полное дерево ячеек в памяти, поэтому очень большие файлы можно генерировать с почти постоянным потреблением памяти; писатель обрабатывает встроенные строки, числа, логические значения, даты и формулы на нескольких листах и взаимодействует с потоковым прямым читателем
Версия 2.90.26
Добавлено
- Книги XLSX теперь можно сканировать ячейка за ячейкой с помощью нового потокового прямого читателя, который вызывает события для каждой ячейки и каждого листа без создания полного дерева ячеек в памяти, поддерживая почти постоянное потребление памяти для очень больших файлов; каждая сообщаемая ячейка несет свое значение, тип (число, строка, логическое значение, дата или ошибка), текст формулы и индекс стиля, с дополнительным распознаванием дат и поддержкой раннего прерывания
Версия 2.90.25
Добавлено
- Классические листы XLS теперь могут добавлять гиперссылки из ссылок на ячейки в стиле A1 с сохранением нормализации URL-адресов, целевых подадресов книг, отображаемого текста и всплывающих подсказок
Версия 2.90.24
Добавлено
- Разрывы страниц Classic XLS теперь можно добавлять из позиций строк или столбцов с индексацией от 1 и ссылок на ячейки в стиле A1 с помощью перегрузок коллекции разрывов страниц и вспомогательных функций рабочего листа
Версия 2.90.23
Добавлено
- Рабочие листы и коллекции фигур Classic XLS теперь могут создавать объекты рисования прямоугольников, овалов, линий и типизированных автофигур из строк диапазонов в стиле A1
Версия 2.90.22
Добавлено
- Коллекции фигур Classic XLS теперь могут создавать текстовые поля из строк диапазонов в стиле A1 с помощью перегрузки AddTextBox
Версия 2.90.21
Добавлено
- Текстовые поля Classic XLS теперь можно перепозиционировать из строк диапазонов в стиле A1 с помощью новой перегрузки SetArea
Версия 2.90.20
Добавлено
- Текстовые поля рабочего листа Classic XLS теперь можно создавать из строк диапазонов в стиле A1 с помощью перегрузки AddTextBox
Версия 2.90.19
Добавлено
- Рабочие листы Classic XLS теперь могут создавать текстовые поля для рисования непосредственно из привязок к строкам и столбцам с помощью нового метода AddTextBox
Версия 2.90.18
Добавлено
- Рабочие листы Classic XLS теперь могут создавать комментарии к ячейкам непосредственно из координат строк и столбцов с помощью новых перегрузок AddComment
Версия 2.90.17
Добавлено
- Определенные имена Classic XLS теперь можно создавать из имени рабочего листа и координат строки/столбца с помощью новых перегрузок Names.Add
Версия 2.90.16
Добавлено
- Вставка изображений Classic XLS теперь может размещать изображения из файлов и TBitmap в указанной ячейке рабочего листа без изменения текущего выделения
Версия 2.90.15
Добавлено
- Столбцы автофильтра Classic XLS теперь можно найти по индексу поля в коллекции AutoFilterColumns
Версия 2.90.14
Добавлено
- Определенные имена Classic XLS теперь можно найти по ячейке рабочего листа с помощью новых перегрузок FindByCell в коллекции Names
Версия 2.90.13
Добавлено
- Диапазоны Classic XLS теперь поддерживают создание комментария с текстом и автором за один вызов AddComment
Версия 2.90.12
Добавлено
- Комментарии Classic XLS теперь предоставляют свойство Author для установки и чтения сохраненного автора комментария через типизированный API
Версия 2.90.11
Исправлено
- Копирование диапазонов Classic XLS теперь сохраняет авторов скопированных комментариев вместе с текстом комментария
Версия 2.90.10
Исправлено
- Classic XLS AddHyperlink теперь сохраняет цели ячеек книги как внутренние подадреса, а не как внешние пути к файлам
Версия 2.90.9
Исправлено
- Копирование диапазонов Classic XLS теперь сохраняет гиперссылки ячеек в месте назначения, включая адрес, подсказку и отображаемый текст
Версия 2.90.8
Исправлено
- Гиперссылки XLS и XLSX теперь перед сохранением нормализуют адреса, начинающиеся с www, в абсолютные http-URL, сохраняя при этом отображаемый текст
Версия 2.90.7
Исправлено
- Classic XLS ApplyAutoFilter теперь игнорирует индексы полей вне диапазона перед перестроением диапазона фильтра, сохраняя существующие критерии вместо их очистки
Версия 2.90.6
Исправлено
- Ряды диаграмм Classic XLS теперь отклоняют ссылки на собственные листы диаграмм без учета регистра, предотвращая недействительные источники данных Area3D при различии регистра в имени листа
Версия 2.90.5
Исправлено
- Листы диаграмм Classic XLS теперь используют обычную защиту имен рабочих листов при применении пользовательских имен листов диаграмм, предотвращая появление повторяющихся имен, отличающихся только регистром
Версия 2.90.4
Исправлено
- Сводные таблицы Classic XLS теперь сопоставляют имена исходных рабочих листов без учета регистра при создании или повторном использовании кэшей сводных таблиц
Версия 2.90.3
Исправлено
- Переименование рабочего листа Classic XLS теперь отклоняет дубликаты без учета регистра, сохраняя однозначное поведение поиска после переименования
Версия 2.90.2
Исправлено
- Поиск имен рабочих листов Classic XLS теперь не чувствителен к регистру в функциях SheetByName, TryGetSheetByName, Index и IDByName
Версия 2.90.1
Исправлено
- Поиск определенных имен Classic XLS теперь не чувствителен к регистру, поэтому имена, разрешенные через коллекцию Names книги, ведут себя согласованно после сохранения и повторного открытия
Версия 2.90.0
Изменено
- НЕСОВМЕСТИМОЕ ИЗМЕНЕНИЕ — коллекция листов XLSX теперь индексируется с 1.
Workbook.Sheets[i],Sheets.IndexByNameи целочисленное свойствоActiveSheetтеперь считают с 1, чтобы соответствовать движку XLS, поэтому первый лист — этоSheets[1], а неSheets[0]; позиционные помощникиActiveIndex,Activate,Moveи аргумент индекса листа вSaveAsCSV/SaveAsHTML/SaveAsRTFостаются 0-базированными - НЕСОВМЕСТИМОЕ ИЗМЕНЕНИЕ — FreezePanes принимает строку первой в обоих движках. Движки XLS и XLSX теперь совместно используют
FreezePanes(ARow, ACol); метод XLSXFreezePane(ACol, ARow)и обратная двухаргументная перегрузка XLS удалены, поэтому вызов, который замораживал N столбцов и M строк, должен поменять два аргумента местами - НЕСОВМЕСТИМОЕ ИЗМЕНЕНИЕ — классы листов XLS потеряли вводящий в заблуждение префикс I.
IXLSWorksheetиIXLSWorkSheetsстановятсяTXLSWorksheetиTXLSWorksheets(они всегда были классами, а не interfaces); настоящие interfacesIXLSWorkbookиIXLSRangeне меняются - НЕСОВМЕСТИМОЕ ИЗМЕНЕНИЕ — enum оператора проверки данных XLS переименован. Члены
TXLSDvOperatorменяются сxlsDv...наxlsDvOp...(напримерxlsDvOpBetween), поэтому они больше не имеют общего префикса с enum типа проверки и согласованы с именами XLSXxlsxDvOp...
Версия 2.89.46
Исправлено
- Пользовательские темы сохраняются после прохода XLSX туда и обратно. При открытии книги с собственной темой и повторном сохранении эта тема сохраняется вместо замены встроенной темой Office, поэтому цвета на основе темы больше не перезаписываются незаметно
- Перекрывающиеся объединенные области отклоняются. Объединение диапазона ячеек, который пересекает уже существующую объединенную область, теперь отклоняется вместо записи перекрывающихся записей, из-за которых Excel сообщает, что сохраненный файл поврежден
- Дата, записанная как значение ячейки, отображается как дата. При присвоении даты или времени ячейке, которая всё еще использует числовой формат General, теперь применяется формат даты по умолчанию, поэтому в Excel значение отображается как дата, а не как сырой серийный номер; установленный вручную числовой формат не меняется
Безопасность
- Глубоко вложенные формулы больше не могут исчерпать стек. Читатель формул .xls ограничивает глубину вложения токенов формулы, поэтому некорректная или враждебная книга с экстремальной вложенностью отклоняется вместо риска сбоя
Версия 2.89.45
Исправлено
- Имена записей ZIP, помеченные как UTF-8, читаются корректно. Когда архив помечает имя элемента как UTF-8 (бит 11 флагов общего назначения), имя декодируется как UTF-8, а не как локальная кодовая страница архива
- Ячейки с ошибкой в .xls сохраняются. Ячейка, хранящая значение ошибки напрямую (запись BOOLERR с установленным флагом ошибки), сохраняет код ошибки вместо того, чтобы читаться как пустая
- Шифрование пакета размером более 2 ГБ завершается с понятной ошибкой. Стандартное шифрование отклоняет слишком большой payload вместо переполнения 32-битной арифметики размера
Версия 2.89.44
Исправлено
- Экспорт формул ODS сохраняет определённые имена. Определённое имя, похожее на ссылку на ячейку (например,
TaxRate2), больше не переписывается как недопустимый адрес ячейки ODF, а разбор_xlnm.Print_Titlesбольше не разбивает имя листа, содержащее запятую - Импорт ODS безопасен после последнего столбца. Строка, чьи повторяющиеся ячейки с форматированным текстом выходят за пределы последнего столбца листа, больше не обращается к освобождённому прототипу rich text
Версия 2.89.43
Исправлено
- Экспорт RTF сохраняет не-ASCII текст. Текст ячейки записывается с Unicode-экранированием
\u, а заголовок объявляет кодовую страницу, поэтому символы CJK / кириллица / ударение экспортируются корректно вместо замены на «?» согласно кодовой странице записи - Навигационный фрейм многостраничного HTML экранирует имена листов. Имена листов на странице индекса и набора фреймов HTML-экранируются, а не-ASCII символы становятся числовыми ссылками на символы, поэтому вкладка с именем, содержащим разметку или не-ASCII буквы, отображается корректно
Версия 2.89.42
Исправлено
- Числа в научной нотации в формулах разбираются корректно. Литерал вида
1E3или2.5E-3внутри формулы теперь токенизируется как единое число, а не как число с лишним именем после него - SEARCH является Unicode-безопасной. Регистронезависимая функция SEARCH больше не выполняет приведение регистра через кодовую страницу ANSI, поэтому поиск не-ASCII символов в find-text / within-text находит совпадение на правильной позиции символа
Версия 2.89.41
Исправлено
- Система дат 1904 применяется к датам ячеек XLSX. Чтение или запись книги, использующей базу дат Mac 1904, теперь сдвигает серийные номера дат на 1462 дня, поэтому даты в таких книгах совпадают с Excel, а не оказываются примерно на четыре года смещёнными
Версия 2.89.40
Исправлено
- Даты в сторонних файлах XLSX загружаются как даты. Ячейка, чей стиль использует любой встроенный или пользовательский числовой формат даты/времени — не только собственный стиль дат HotXLS — теперь читается как значение даты, а не как необработанный серийный номер, включая форматы даты/времени для локалей CJK
Версия 2.89.39
Исправлено
- Числовые форматы даты определяются точнее. Код формата распознаётся как дата/время только по неэкранированным токенам даты вне строковых литералов и секций в скобках, поэтому литерал вида
#,##0 "MM"больше не воспринимается как дата, а однобуквенные коды вродеm/dбольше не пропускаются - ZIP-архивы с большим комментарием корректно читают запись конца каталога. Запись конца центрального каталога разбирается из буфера сканирования только когда она полностью захвачена, а иначе перечитывается из файла, устраняя возможную ошибку чтения, когда комментарий делит запись на две части окна сканирования
Версия 2.89.38
Исправлено
- Зашифрованный XLSX, записанный со стандартным шифрованием, теперь открывается в Excel. Зашифрованный пакет шифруется AES-128 в режиме ECB, как того требует формат, а не CBC, который оставлял всё после первого блока нечитаемым
- Дешифрование RC4 защищённых паролем BIFF8 (.xls) файлов исправлено. Ключевой поток теперь повторно генерируется и потребляется синхронно с позицией потока, поэтому правильный пароль расшифровывает тело книги вместо получения искажённых ячеек
Версия 2.89.37
Исправлено
- Удаление листа сохраняет согласованность определённых имён. Удаление листа теперь убирает определённые имена книги с областью видимости этого листа и сдвигает имена с областью видимости последующих листов на одну позицию вниз, поэтому сохранённая книга больше не указывает именем, привязанным к листу (например, область печати или заголовки), на неправильный лист
Версия 2.89.36
Исправлено
- Чтение повреждённых файлов .xls стало надёжнее. Записи нескольких ячеек с числами / пустыми ячейками и цветовая палитра больше не выходят за границы при повреждённых полях длины, а читатель книги освобождается вместо утечки при ошибке открытия файла
- Вставка изображений больше не приводит к утечке при сбое. Загрузка повреждённого или нечитаемого изображения (BMP / WMF / EMF / JPEG / PNG) освобождает его временный поток и битмап вместо утечки
- Дублирование записей стилей при сохранении устранено. Стиль, первое совпадение которого находится на первой позиции таблицы, теперь корректно используется совместно вместо двойной записи при оптимизации стилей BIFF
- HTML-экспорт экранирует имена шрифтов, поэтому имя шрифта, содержащее
&,<,>или", больше не нарушает атрибут стиля экспортируемой ячейки
Версия 2.89.35
Исправлено
- Несколько функций листа теперь соответствуют Excel.
EXPвозвращает результат вместо ошибки «неподдерживаемая», одноаргументнаяWEEKDAYнумерует воскресенье как 1,MODсохраняет знак и дробную часть делителя, аLEFT/RIGHT/MIDвозвращают#VALUE!при отрицательной длине или неверном числе аргументов - Не-ASCII числовые ссылки на символы в XLSX теперь читаются корректно. Числовые XML-сущности вроде
中в общих строках, тексте ячеек и атрибутах декодируются в полный символ вместо одного усечённого байта - Текстовые правила условного форматирования выдерживают двойные кавычки. Текст, содержащий
"в правилах containsText / beginsWith / endsWith, экранируется так, что сохранённая книга остаётся корректной - Правки диапазона условного форматирования больше не оставляют лишний диапазон. Очистка или перемещение столбца из области условного форматирования больше не создаёт перекрывающийся фантомный диапазон
- Индексные цвета вкладок листов в .xls используют правильную запись палитры, а даты с числовым форматом внутри записей нескольких ячеек (MULRK) сохраняют определение даты в системе дат 1904
- Критерии AutoFilter «первые/последние N процентов» проходят полный цикл. Загрузка фильтра «первые N процентов» или «последние N процентов» из .xls больше не преобразует его в простое количество элементов
- Гиперссылки mailto: распознаются как URL, а ScreenTip-подсказки гиперссылок записываются так, что они проходят полный цикл вместо удаления
- HTML-экспорт выводит допустимые размеры шрифтов в локалях с десятичной запятой, поэтому экспортированные шрифты ячеек больше не возвращаются к шрифту браузера по умолчанию
- Чтение повреждённых или усечённых файлов стало надёжнее. Повреждённые рисунки OfficeArt, выходящие за пределы индексы стилей / цветов / палитры / темы и JPEG не по базовому профилю больше не вызывают сбой или неправильные размеры, а также устранена утечка памяти общих строк при загрузке rich text
Версия 2.89.34
Добавлено
- Управление текстовыми полями на листе XLSX стало проще.
TXLSXWorksheetдобавляетIndexOfTextBoxAt,FindTextBoxAt,DeleteTextBox,DeleteTextBoxAt,DeleteTextBoxesInRangeиClearTextBoxes, позволяя находить и удалять отдельные текстовые поля по якорной ячейке или пересекающемуся диапазону - Ручные разрывы страниц XLSX можно находить и удалять по диапазону.
TXLSXWorksheetдобавляетIndexOfRowBreak,IndexOfColBreak,RemoveRowBreaksInRangeиRemoveColBreaksInRangeдля непосредственного управления разрывами страниц по строкам и столбцам
Исправлено
- Листы XLSX, содержащие только текстовые поля, теперь записывают связь рисунка. Лист, содержащий только отдельные текстовые поля без изображений, диаграмм, комментариев, гиперссылок и таблиц, теперь создаёт соответствующую связь рисунка
xl/worksheets/_rels/sheetN.xml.rels, чтобы сохранённый пакет разрешал ссылку<drawing r:id="...">
Версия 2.89.33
Изменено
- Демо рабочего места C++Builder теперь соответствует функциям проверки Delphi. Пример WorkbookAudit в C++Builder выводит те же значения серьёзности, рекомендуемые действия и доказательства проверки, что и версия Delphi, в списке книг и в отчётах JSON, CSV и HTML, а пример ConversionWorkbench в C++Builder записывает формат источника, действие и примечание проверки для каждой задачи конвертации, включая сводные счётчики действий в HTML-отчёте
Версия 2.89.32
Изменено
- Демо ConversionWorkbench теперь запускается без участия пользователя из командной строки. Вызов
ConversionWorkbench.exe <folder> [/targets=xlsx,csv,html] [/persheet] [/skip] [/quiet]сканирует папку, конвертирует каждый источник в запрошенные форматы, записывает отчёты о конвертации и завершается;/quietскрывает окно, чтобы конвертации можно было запускать из скриптов и планировщика задач - Пакетные конвертации остаются интерактивными. Полоса прогресса отслеживает список задач (отмеченные источники умножить на отмеченные форматы), кнопка «Отмена» прерывает пакет с отчётами по завершённым задачам, а двойной щелчок по строке результата открывает созданный файл (или выходную папку для наборов CSV по листам)
- Параметры рабочего места сохраняются между сеансами. Папка, форматы назначения, разделитель, параметры HTML, переключатели ODS, CSV по листам, пропуск существующих и потоковая запись хранятся в INI-файле рядом с исполняемым файлом; пароль шифрования намеренно не сохраняется
Версия 2.89.31
Изменено
- Демо WorkbookAudit теперь запускается без участия пользователя из командной строки. Вызов
WorkbookAudit.exe <folder> [/r] [/quiet]сканирует папку (опционально с подпапками), проверяет каждую книгу, экспортирует отчёты JSON, CSV и HTML и завершается;/quietскрывает окно, чтобы аудит можно было запускать из скриптов и планировщика задач - Большие пакеты остаются интерактивными. Полоса прогресса отслеживает пакет, кнопка «Отмена» прерывает его (оставшиеся файлы помечаются как «Отменены»), а выбор книги теперь заполняет панель детализации по листам с информацией о структуре, формулах, ссылках и защите
- Папка аудита и выбор подпапок сохраняются. Параметры хранятся в INI-файле рядом с исполняемым файлом и восстанавливаются при следующем запуске
Версия 2.89.30
Изменено
- Демо WorkbookAudit теперь определяет серьёзность проверки и рекомендуемые действия. Основной список, а также отчёты JSON, CSV и HTML включают серьёзность, рекомендуемое действие и доказательства проверки, чтобы пакетные аудиты могли направлять зашифрованные, содержащие макросы, со внешними ссылками, защищённые, перегруженные стилями или формулами книги без чтения каждой строки листа
- Демо ConversionWorkbench теперь записывает журнал проверки конвертации. Каждая задача записывает формат источника, действие и примечание проверки, а HTML-отчёт агрегирует счётчики действий для принятых результатов, наборов CSV по листам, повторно использованных файлов, неподдерживаемых форматов назначения, восстановленных источников, кандидатов на повторную попытку и результатов ручной проверки
Версия 2.89.29
Добавлено
- Классические книги XLS теперь считывают свойства документа при открытии. При открытии существующего файла .xls или stream значения
Title,Subject,Author,Keywords,Comments,CompanyиManagerзаполняются из сводной информации файла, как в модели XLSX; свойства, сохраненные Excel, включая нелатинский текст в локализованных кодовых страницах ANSI, корректно декодируются
Версия 2.89.28
Изменено
- Демо ConversionWorkbench получило четыре пакетные опции. Примеры Delphi и C++Builder теперь могут разделять каждый лист в отдельный CSV (
<name>.<sheet>.csv), записывать защищенный паролем XLSX черезSaveAsEncrypted, пропускать уже существующий вывод и включать потоковую запись XLSX для больших книг
Версия 2.89.27
Изменено
- Демо WorkbookAudit теперь сканирует глубже и отмечает риски. Примеры добавляют рекурсивный обход подпапок, относительные имена файлов, обнаружение защищенных паролем XLSX через
CanReadEncryptedи столбец Flags для VBA, внешних ссылок, скрытых листов, защищенных листов и зашифрованных файлов - Отчеты аудита содержат более богатые метаданные. JSON-отчет группирует свойства документа в
docProps, все три формата добавляют количество изображений по листам, а имена с областью листа для классических XLS собираются вместе с именами уровня книги
Версия 2.89.26
Добавлено
- Демо Delphi и C++Builder теперь включают пакетный конвертер ConversionWorkbench. Пример собирает источники XLS, XLSX, CSV и ODS из папки и конвертирует выбранные файлы в комбинации XLSX, CSV, HTML, RTF, ODS и XLS с подходящей объектной моделью, включая
SaveXLSWorkbookAsXLSX - Параметры конвертации доступны по форматам. Форма предлагает разделитель CSV, заголовок HTML и class таблицы, а также переключатели ODS для диаграмм и изображений; недоступное направление XLSX в XLS сообщается как неподдерживаемое
- Каждый запуск пишет отчет о конвертации.
ConversionReport.csvиConversionReport.htmlзаписывают статус, время и размер вывода, а генератор создает готовые входные XLS, XLSX, CSV и ODS
Версия 2.89.25
Добавлено
- Демо Delphi и C++Builder теперь включают инструмент пакетного аудита WorkbookAudit. Пример сканирует книги XLS и XLSX и суммирует структуру листов, формулы, внешние ссылки, гиперссылки, стили, объединенные диапазоны, комментарии, таблицы, условное форматирование, проверки данных, диаграммы, AutoFilter, закрепленные области и состояние защиты
- Результаты аудита экспортируются как отчеты JSON, CSV и HTML. Один щелчок записывает
AuditReport.json,AuditReport.csvиAuditReport.htmlрядом с проверенными файлами, включая метаданные книги, пулы стилей, определенные имена и строки деталей по листам - Демо аудита самодостаточно. Генератор создает классические книги XLS и XLSX с формулами, внешними ссылками, скрытыми листами, гиперссылками, комментариями, таблицами, диаграммами и защищенными листами, поэтому полный процесс запускается сразу
Версия 2.89.24
Исправлено
- Экспорт XLSX в CSV теперь записывает вычисленные результаты формул.
TXLSXWorkbook.SaveAsCSVвычисляет ячейки с формулами перед записью CSV или TSV, поэтому ячейки только с формулами экспортируют отображаемые значения вместо текста формул
Версия 2.89.23
Добавлено
- Экспорт OpenDocument теперь настраивается параметрами. Новый объект параметров позволяет исключать диаграммы или встроенные изображения из сохраняемого
.odsи задавать строку generator через новые перегрузки SaveAsODS - Исключенное содержимое не оставляет лишних ссылок. При отключении диаграмм или изображений также удаляются папки объектов, рамки рисунков и записи манифеста
Версия 2.89.22
Добавлено
- Файлы OpenDocument теперь открываются обычным вызовом Open. Файл или поток
.odsавтоматически определяется и загружается без предварительного выбора между.xlsxи.ods - Добавлен краткий вызов SaveAsODS. Сохранение в OpenDocument больше не требует передачи значения формата файла
- Загруженный формат можно запросить. SourceFormat сообщает, был ли источник книги OpenXML или OpenDocument
Версия 2.89.21
Исправлено
- Надстрочные и подстрочные фрагменты сохраняются при записи форматированного текста в
.xlsx. Вертикальная позиция записывается в shared string и читается обратно - Надстрочный и подстрочный текст переносится между форматами. Форматированный текст из
.odsсохраняет эти фрагменты после повторного сохранения как.xlsx
Версия 2.89.20
Добавлено
- Экспорт и импорт ODS теперь переносят цветовые шкалы и полосы данных в условном форматировании. Точки значений и цвета записываются и читаются обратно
- Поддержано условное форматирование на основе формул. Правило записывается как условие is-true-formula в синтаксисе OpenDocument и читается как правило формулы
Версия 2.89.19
Добавлено
- Экспорт и импорт ODS сохраняют сообщения ввода для проверки данных. Заголовок и текст подсказки записываются вместе с предупреждением об ошибке и читаются обратно
- Цвет вкладки листа сохраняется. Цвет записывается и читается из
.ods, поддерживая распространенный атрибут расширения и стандартный атрибут OpenDocument
Версия 2.89.18
Добавлено
- Экспорт и импорт ODS сохраняют группы строк и столбцов. Группы структуры записываются как вложенные элементы и восстанавливаются со своим уровнем
- Свернутые группы остаются свернутыми. При сохранении они помечаются как не отображаемые и восстанавливаются при загрузке
Версия 2.89.17
Добавлено
- Экспорт и импорт ODS сохраняют область печати. Диапазон печати листа записывается в
.odsи читается обратно - Ручные разрывы страниц сохраняются. Разрывы строк и столбцов записываются как маркеры break-before и восстанавливаются
Версия 2.89.16
Добавлено
- Экспорт и импорт ODS сохраняют колонтитулы. Левая, центральная и правая области записываются и читаются с полями страницы, даты, времени, имени листа и текста
- Каждый лист сохраняет свои колонтитулы. Для листов с разным содержимым записываются отдельные стили страниц
Версия 2.89.15
Добавлено
- Экспорт и импорт ODS сохраняют поворот текста. Угол сохраняется и корректно преобразуется между правилами электронных таблиц и OpenDocument
- Отступ ячейки сохраняется. Уровень отступа записывается как левое поле и читается обратно
Версия 2.89.14
Добавлено
- Экспорт ODS теперь записывает форматированный текст. Каждый форматированный фрагмент сохраняется как span с собственным автоматическим стилем text-family, сохраняя шрифт, размер, жирный, курсив, подчеркивание, зачеркивание, цвет, надстрочный или подстрочный формат
- Одинаковые стили фрагментов используются совместно. Один и тот же формат повторно использует один автоматический стиль, а простая ячейка остается абзацем без span
Версия 2.89.13
Добавлено
- Импорт ODS сохраняет форматирование rich text. Ячейки с несколькими text spans не сводятся к простому тексту
- Простые ячейки остаются простыми. Один неформатированный фрагмент, число, дата или формула не превращаются в rich text
Версия 2.89.12
Добавлено
- Импорт ODS теперь читает диаграммы. Встроенные объекты диаграмм разбираются и восстанавливаются на своем листе
- Диапазоны серий диаграмм восстанавливаются. Диапазоны значений и категорий преобразуются из записи OpenDocument
- Поврежденная или отсутствующая диаграмма безопасно пропускается. Загрузка продолжается, а резервное изображение в той же рамке все равно импортируется
Версия 2.89.11
Добавлено
- Экспорт ODS теперь записывает встроенные изображения. Изображения листа сохраняются в
Pictures/, ссылаются из рамки рисунка и регистрируются в манифесте - Размер изображения сохраняется. Ширина и высота записываются в сантиметрах
- Изображения на объединенных ячейках сохраняют привязку. Привязка использует левую верхнюю ячейку объединенного диапазона, а изображения вне сетки пропускаются
Версия 2.89.10
Исправлено
- Уровень ошибки проверки данных ODS теперь сохраняется после цикла сохранения и открытия. Предупреждение или информационное сообщение больше не открывается как stop alert
Версия 2.89.9
Добавлено
- Экспорт ODS теперь записывает диаграммы. Каждая диаграмма листа сохраняется как встроенный поддокумент диаграммы внутри пакета
- Диаграммы ссылаются со своего листа. Рамка рисунка указывает на встроенный объект, а манифест объявляет его для LibreOffice
- Диапазоны серий переводятся. Диапазоны значений и категорий преобразуются в запись OpenDocument
Версия 2.89.8
Добавлено
- Импорт ODS теперь читает встроенные изображения. Изображения из
Pictures/извлекаются и распознаются как PNG, JPEG, GIF или BMP по содержимому - Положение изображения сохраняется. Ячейка привязки и размеры рамки переносятся
- Отсутствующие изображения безопасно пропускаются. Отсутствующая ссылка не мешает открыть документ
Версия 2.89.7
Добавлено
- Экспорт ODS теперь записывает закрепленные области. Закрепленные строки и столбцы сохраняются в настройках вида
- Экспорт ODS теперь записывает параметры страницы. Размер бумаги, ориентация и поля сохраняются, резервом служит A4 книжной ориентации
Версия 2.89.6
Добавлено
- Импорт ODS теперь читает закрепленные области. Строки и столбцы из настроек вида восстанавливаются
- Импорт ODS теперь читает диапазоны AutoFilter. Фильтрованный диапазон, сохраненный как диапазон базы данных, возвращается на свой лист
Версия 2.89.5
Добавлено
- Импорт ODS теперь читает условное форматирование. Правила сравнения значений ячеек импортируются и применяются
- Интервальные правила сохраняют обе границы. between и not-between восстанавливают оба порога
- Правила сравнения проходят полный цикл. Правила в
.odsоткрываются с оператором, порогами и целевым диапазоном
Версия 2.89.4
Добавлено
- Импорт ODS теперь читает проверки данных. Числовые диапазоны, выпадающие списки, проверки длины текста и скалярные сравнения импортируются
- Детали проверки сохраняются. allow-empty-cell, стиль предупреждения и текст сообщения попадают в модель
- Элементы списка сохраняются после цикла. Выпадающий список, записанный в
.ods, открывается со своими значениями
Версия 2.89.3
Добавлено
- Экспорт ODS теперь записывает структурные элементы. Именованные диапазоны, гиперссылки ячеек, скрытые строки и столбцы, AutoFilter, условные форматы и проверки включаются в пакет
- Именованные диапазоны и гиперссылки проходят полный цикл. Адреса, цели, отображаемый текст, подсказка и скрытое состояние сохраняются
- AutoFilter, условные форматы и проверки выводятся. Потребители вроде LibreOffice могут их сохранить
Версия 2.89.2
Добавлено
- Импорт ODS теперь читает полные стили ячеек. Шрифт, размер, жирный, курсив, подчеркивание и зачеркивание импортируются вместе с кэшированными значениями и числовыми форматами
- Цвет шрифта, заливка фона и границы импортируются. Явные цвета становятся RGB, фон становится сплошной заливкой, а четыре границы сохраняют стиль и цвет
- Выравнивание импортируется. Горизонтальное и вертикальное выравнивание, а также перенос текста применяются к ячейке
- Наследование родительского стиля учитывается. Цепочка parent-style ODS проходится атрибут за атрибутом
- Цикл записи и чтения замкнут. Стили, записанные
SaveAsв.ods, читаются обратно черезOpenODS
Версия 2.89.1
Добавлено
- Экспорт в ODS теперь записывает полные стили ячеек. При сохранении в
.odsимя и размер шрифта, полужирное и курсивное начертание, подчёркивание, зачёркивание и цвет шрифта переносятся в пакет, поэтому оформленные ячейки сохраняют свой вид при повторном открытии - Записываются заливка фона и границы ячеек. Сплошные цвета фона и четыре стороны ячейки (верхняя, нижняя, левая, правая) выводятся с их толщиной, типом линии и цветом
- Выравнивание и перенос текста сохраняются. Горизонтальное и вертикальное выравнивание текста, а также параметр переноса текста переносятся в стили ячеек ODS
- Стили сочетаются с числовыми форматами. Один стиль ячейки может объединять шрифт, заливку и границы с числовым форматом, а одинаковые сочетания стилей используются совместно, благодаря чему пакет остаётся компактным
Версия 2.89.0
Добавлено
- Экспорт в электронную таблицу OpenDocument (.ods).
SaveAsтеперь принимаетxlsxOpenDocumentSpreadsheetи записывает корректный пакет ODF напрямую, без промежуточного формата XLSX - Значения ячеек записываются с типом. Текст, числа, логические значения и даты выводятся со своими типами значений ODF, поэтому при повторном открытии значения сохраняют свой смысл
- Числовые форматы сохраняются. Распространённые форматы (десятичные разряды, разделитель тысяч, валюта, проценты, научная запись и даты ISO) записываются как стили данных ODF, и на них ссылаются использующие их ячейки
- Структура листа переносится. Листы, ширина столбцов и диапазоны объединённых ячеек записываются в пакет
- Полный цикл через HotXLS. Пакет, записанный
SaveAs, можно прочитать обратно черезOpenODSс сохранением значений, числовых форматов, ширины столбцов и объединений
Версия 2.88.249
Добавлено
- Функции доверительного интервала теперь вычисляются в формульном движке.
CONFIDENCE.NORMиспользует квантиль нормального распределения, аCONFIDENCE.T— квантиль распределения Стьюдента, чтобы вернуть полуширину доверительного интервала для среднего - Доступны современные имена статистических функций.
PERCENTILE.INC,PERCENTILE.EXC,QUARTILE.INC,QUARTILE.EXC,RANK.AVG,COVARIANCE.PиCOVARIANCE.Sвычисляют процентили и квартили с включением и исключением концов, ранжирование с усреднением совпадающих рангов, а также ковариацию генеральной совокупности и выборки - Псевдонимы для устаревших форм.
MODE.SNGLиRANK.EQсопоставляются с существующимиMODEиRANK
Версия 2.88.248
Добавлено
- Функция биномиального распределения теперь вычисляется в формульном движке.
BINOM.DISTвычисляет функцию вероятности и функцию распределения, используя регуляризованную неполную бета-функцию для накопленной формы - Функция распределения Пуассона теперь вычисляется в формульном движке.
POISSON.DISTвычисляет функцию вероятности и функцию распределения, используя верхнюю неполную гамма-функцию для накопленной формы - Устойчивое вычисление. Обе функции вероятности используют факториал в логарифмически-гамма форме, чтобы сохранять точность при больших значениях, а недопустимые параметры возвращают
#NUM!
Версия 2.88.247
Добавлено
- Функции бета-распределения теперь вычисляются в формульном движке.
BETA.DISTиBETA.INVвычисляют функцию распределения, плотность вероятности и обратные к ним значения на необязательном интервале[A, B] - Доступны функции распределения Стьюдента (t).
T.DIST,T.DIST.RT,T.DIST.2T,T.INVиT.INV.2Tохватывают левый хвост, правый хвост, двустороннюю вероятность и обратные к ним значения - Доступны функции F-распределения.
F.DIST,F.DIST.RT,F.INVиF.INV.RTвычисляют функцию распределения, правый хвост и обратные к ним значения - Общее ядро вычислений. Все три семейства используют регуляризованную неполную бета-функцию с вычислением через непрерывную дробь, обратные значения находятся методом деления пополам, а недопустимые параметры возвращают
#NUM!
Версия 2.88.246
Добавлено
- Функции гамма-распределения и распределения хи-квадрат теперь вычисляются в формульном движке.
GAMMA.DIST,GAMMA.INV,CHISQ.DIST,CHISQ.DIST.RT,CHISQ.INVиCHISQ.INV.RTвычисляют функцию распределения, плотность вероятности, правый хвост и обратные к ним значения в реальном времени черезCalculate - Доступен высокоточный логарифм гамма-функции.
GAMMALN.PRECISEвозвращает натуральный логарифм гамма-функции - Точное и надежное вычисление. Накопленные значения используют разложения регуляризованной неполной гамма-функции в ряд и в непрерывную дробь, обратные значения находятся методом деления пополам, а недопустимые параметры возвращают
#NUM!
Версия 2.88.245
Добавлено
- Функции непрерывных распределений теперь вычисляются в формульном движке.
EXPON.DIST,WEIBULL.DIST,LOGNORM.DISTиLOGNORM.INVвычисляют функцию распределения, плотность вероятности и обратные значения в реальном времени черезCalculate - Вычисление в замкнутой форме. Экспоненциальное и распределение Вейбулла используют свои аналитические формулы, тогда как логнормальное распределение повторно использует функцию распределения нормального закона и обратную к ней; недопустимые параметры возвращают
#NUM!
Версия 2.88.244
Исправлено
- Обратная функция нормального распределения теперь точна на хвостах.
NORMSINV,NORM.S.INVиNORM.INVиспользовали десятичный логарифм в хвостовых ветвях (вероятности ниже примерно 0.024 или выше примерно 0.976), тогда как алгоритм требует натурального логарифма; теперь результаты верны во всем диапазоне вероятностей
Версия 2.88.243
Добавлено
- Функции нормального распределения с современными именами через точку теперь вычисляются в формульном движке.
NORM.DIST,NORM.INV,NORM.S.DISTиNORM.S.INVвычисляют функцию распределения, плотность вероятности и обратные к ним значения в реальном времени черезCalculate - Статистические псевдонимы через точку.
STDEV.S,STDEV.P,VAR.SиVAR.Pраспознаются как имена Excel 2010+ для выборочного и генерального стандартного отклонения и дисперсии - Имена функций через точку разбираются корректно. Анализатор формул теперь воспринимает имя вроде
NORM.S.DISTкак единую функцию, поэтому эти функции работают вCalculateи проходят полный цикл через префикс OOXML_xlfn.
Версия 2.88.242
Добавлено
- Инженерные функции комплексных чисел теперь вычисляются в формульном движке.
COMPLEXстроит комплексное число в виде текста, а семействоIM*считывает его и выполняет над ним операции, причем все вычисляется в реальном времени черезCalculate - Компоненты и арифметика.
IMREAL,IMAGINARY,IMABS,IMARGUMENTиIMCONJUGATEпредоставляют отдельные компоненты, тогда какIMSUM,IMSUB,IMPRODUCTиIMDIVвыполняют комплексную арифметику - Трансцендентные функции.
IMPOWER,IMSQRT,IMEXPиIMLNвычисляются через полярную форму, а мнимым суффиксом может бытьiилиj
Версия 2.88.241
Добавлено
- Функции динамических массивов
XLOOKUPиFILTERтеперь вычисляются в формульном движке. Обе вычисляются в реальном времени черезCalculate, привнося современный поиск и фильтрацию в формулы листа и в произвольные вычисления XLOOKUPс режимами сопоставления и поиска. Поддерживаются точное (по умолчанию), подстановочное, а также приближенное сопоставление со следующим меньшим / следующим большим значением, наряду с поиском от первого к последнему или от последнего к первому и необязательным результатомif_not_foundFILTERс разлитыми результатами. Строки, для которых вектор включения равен TRUE, сохраняются и разливаются в целевой диапазон черезSetArrayFormula, с необязательным значениемif_empty, когда совпадений нет
Версия 2.88.240
Добавлено
- Математические функции
GCD,LCM,MROUND,QUOTIENTиMULTINOMIALтеперь вычисляются в формульном движке. Они вычисляются в реальном времени черезCalculate, охватывая наибольший общий делитель, наименьшее общее кратное, округление до кратного, целочисленное деление и мультиномиальный коэффициент - Преобразование систем счисления и римские цифры.
BASEкодирует число в любой системе счисления с основанием от 2 до 36 с необязательным дополнением нулями,DECIMALразбирает такую строку обратно в число, аARABICпреобразует римскую цифру в ее значение
Версия 2.88.239
Добавлено
- Агрегатные функции
PRODUCTиSUMSQтеперь вычисляются в формульном движке.PRODUCTперемножает свои числовые аргументы, аSUMSQсуммирует их квадраты, причем обе вычисляются в реальном времени черезCalculate - Дисперсия и стандартное отклонение в варианте A.
VARA,VARPA,STDEVAиSTDEVPAвычисляют выборочный и генеральный разброс, считая текст за 0, а TRUE за 1, в отличие от обычных форм, которые игнорируют нечисловые значения
Версия 2.88.238
Добавлено
- Статистические агрегатные функции теперь вычисляются в формульном движке.
VAR,VARP,STDEV,STDEVP,MODE,COUNTBLANKиAVERAGEAвычисляются в реальном времени черезCalculate - Дисперсия и стандартное отклонение.
VARиSTDEVиспользуют выборочную формулу, аVARPиSTDEVPиспользуют формулу для генеральной совокупности, как по диапазонам, так и по встроенным аргументам - Наиболее частое значение.
MODEвозвращает наиболее часто встречающееся число и сообщает#N/A, когда ни одно значение не повторяется - Подсчет пустых ячеек.
COUNTBLANKсчитает пустые ячейки в диапазоне, включая ячейки, содержащие пустой текстовый результат - Среднее с учетом текста.
AVERAGEAусредняет значения, считая текст за ноль, а логическое TRUE за единицу, поэтому отличается отAVERAGE, которая игнорирует текст
Версия 2.88.237
Добавлено
- Побитовые функции теперь вычисляются в формульном движке.
BITAND,BITOR,BITXOR,BITLSHIFTиBITRSHIFTвычисляются в реальном времени черезCalculate - Побитовые И, ИЛИ и исключающее ИЛИ.
BITAND,BITORиBITXORобъединяют два неотрицательных целых числа бит за битом - Сдвиг битов в обоих направлениях.
BITLSHIFTсдвигает биты числа влево, аBITRSHIFTсдвигает их вправо; отрицательная величина сдвига меняет направление на противоположное - Ограничения, совместимые с Excel. Операнды должны быть целыми числами от 0 до 2^48-1, а величина сдвига ограничена 53 разрядами; значения за пределами этих ограничений возвращают
#NUM! - Сохранение и восстановление с префиксом OOXML. При сохранении в XLSX эти функции Excel 2013 записываются с префиксом
_xlfn.и открываются без ошибок, поэтому они продолжают корректно отображаться и пересчитываться
Версия 2.88.236
Добавлено
- Инженерные функции преобразования систем счисления теперь вычисляются в формульном движке.
DEC2BIN,DEC2OCT,DEC2HEX,BIN2DEC,OCT2DEC,HEX2DEC,HEX2BIN,BIN2HEX,HEX2OCT,OCT2HEX,BIN2OCTиOCT2BINвычисляются в реальном времени черезCalculate - Преобразования между двоичной, восьмеричной, десятичной и шестнадцатеричной системами. Числа преобразуются в любом направлении между всеми четырьмя системами, включая такие межсистемные пары, как из шестнадцатеричной в двоичную
- Числа со знаком через дополнительный код. Отрицательные числа представляются в стандартной 10-значной форме дополнительного кода, поэтому значения корректно проходят туда и обратно при преобразованиях
- Необязательная фиксированная ширина вывода. Преобразования в текстовую систему счисления принимают необязательный аргумент разрядности, который дополняет результат ведущими нулями до фиксированной ширины
- Проверка диапазона и ввода. Значения за пределами представимого диапазона или текст, содержащий цифры, недопустимые для исходной системы счисления, возвращают
#NUM!
Версия 2.88.235
Добавлено
- Функции рабочих дней теперь вычисляются в формульном движке.
WORKDAYиNETWORKDAYSвычисляются в реальном времени черезCalculate - Сдвиг даты с учетом выходных.
WORKDAYвозвращает дату, отстоящую на заданное число рабочих дней до или после начальной даты, пропуская субботы и воскресенья; отрицательное число шагает назад, а ноль возвращает начальную дату - Подсчет рабочих дней.
NETWORKDAYSсчитает целые рабочие дни между двумя датами, включая обе граничные даты, и возвращает отрицательное значение, когда начальная дата позже конечной - Необязательные списки праздников. Обе функции принимают необязательный аргумент с праздниками, заданный одной датой или диапазоном ячеек, и исключают эти даты из расчета рабочих дней
Версия 2.88.234
Добавлено
- Функции даты и времени теперь вычисляются в формульном движке.
EDATE,EOMONTH,DATEDIF,YEARFRAC,DAYS,WEEKNUMиISOWEEKNUMвычисляются в реальном времени черезCalculate - Арифметика месяцев с привязкой к концу месяца.
EDATEсдвигает дату на целое число месяцев, аEOMONTHвозвращает последний день месяца после сдвига; обе функции привязываются к более короткому месяцу, например 31-е число, сдвинутое в февраль - Единицы интервала
DATEDIF. Поддерживаются единицы полного счета"Y","M"и"D", а также единицы остатка"YM","YD"и"MD" - Базисы подсчета дней
YEARFRAC. Реализованы все пять базисов: US 30/360, actual/actual, actual/360, actual/365 и European 30/360 - Нумерация недель.
WEEKNUMподдерживает соглашения с началом недели в воскресенье, с началом в понедельник и ISO (тип возврата 21), аISOWEEKNUMвозвращает номер недели по ISO 8601
Версия 2.88.233
Добавлено
- Функции баз данных теперь вычисляются в формульном движке.
DSUM,DCOUNT,DCOUNTA,DAVERAGE,DMIN,DMAX,DPRODUCT,DGET,DVAR,DVARP,DSTDEVиDSTDEVPвычисляются в реальном времени черезCalculateи пересчитываются при повторном открытии книги - Сопоставление по стандартной таблице условий. Условия, размещенные под заголовками полей, объединяются по AND в пределах одной строки и по OR между строками, поддерживают операторы сравнения, такие как
>,<и>=, и допускают сопоставление текста по подстановочным знакам*/?; пустые ячейки условий не добавляют ограничений - Гибкий выбор поля. Агрегируемое поле можно задать текстом заголовка столбца, индексом столбца с отсчетом от 1 или ссылкой на ячейку заголовка
- Поиск одной записи функцией
DGET.DGETвозвращает значение поля совпавшей записи, включая текст, и сообщает#NUM!, когда совпадает несколько записей, или#VALUE!, когда совпадений нет
Версия 2.88.232
Добавлено
OpenODSтеперь импортирует защиту листов ODS. Таблицы ODS сtable:protected="true"теперь открываются как защищенные листы с существующим состоянием защиты без пароля; ключи защиты ODS не рассматриваются как устаревшие хэши паролей XLSX
Версия 2.88.231
Добавлено
OpenODSтеперь импортирует именованные диапазоны ODS. Элементыtable:named-rangeсtable:cell-range-addressтеперь заполняют коллекцию книгиDefinedNamesи преобразуют ссылки ODS на лист/ячейку, например$Sheet.$A$1:$Sheet.$B$2, в формулы определенных имен XLSX
Версия 2.88.230
Добавлено
OpenODSтеперь импортирует стили защиты ячеек ODS. Стили table-cell, использующиеstyle:cell-protect, теперь сопоставляютnone,formula-hidden,protectedиhidden-and-protectedс импортированным состоянием ячейкиLockedиFormulaHidden, включая значения, унаследованные черезstyle:parent-style-name
Версия 2.88.229
Добавлено
OpenODSтеперь импортирует базовые формулы ODS. Ячейки с формулами, использующиеof:=илиoooc:=, теперь сохраняют кэшированные скалярные значения и импортируют нормализованную формулу XLSX, преобразуя локальные ссылки в квадратных скобках, например[.A1:.B1], и разделители аргументов с точкой с запятой в синтаксис Excel
Версия 2.88.228
Добавлено
OpenODSтеперь разрешает унаследованные стили строк и столбцов ODS. Стили table-row и table-column, использующиеstyle:parent-style-name, теперь наследуют высоту строки, ширину столбца и скрытую видимость родительского стиля, когда пакеты ODS ссылаются на дочерние стили изcontent.xml
Версия 2.88.227
Добавлено
OpenODSтеперь разрешает унаследованные стили ODS table-cell. Стили table-cell, использующиеstyle:parent-style-name, теперь наследуют сопоставления data-style родительского стиля при импорте ODS, поэтому дочерние стили сохраняют импортированные значения XLSXNumberFormat, даже когда data style объявлен в родительском стиле
Версия 2.88.226
Добавлено
OpenODSтеперь предварительно загружает стили строк и столбцов ODS, сохраненные вstyles.xml. Свойства стилей table-row и table-column изstyles.xmlтеперь участвуют в импорте скрытых строк/столбцов, высоты строк и ширины столбцов, когдаcontent.xmlссылается на эти имена стилей
Версия 2.88.225
Добавлено
OpenODSтеперь использует data styles ODS, сохраненные вstyles.xml. Именованные стили table-cell и data styles для чисел, дат и времени изstyles.xmlтеперь участвуют в разрешении импортируемого XLSXNumberFormat, при этом automatic styles изcontent.xmlпо-прежнему могут их переопределять
Версия 2.88.224
Добавлено
OpenODSтеперь импортирует дробные числовые форматы ODS. Компоненты ODSnumber:fractionтеперь сопоставляются с дробными форматами XLSX, такими как0 ?/??, сохраняя параметры отображения дробей при импорте
Версия 2.88.223
Добавлено
OpenODSтеперь импортирует научные числовые форматы ODS. Компоненты ODSnumber:scientific-numberтеперь сопоставляются с числовыми форматами XLSX, такими как0.000E+00, сохраняя параметры отображения научной нотации при импорте
Версия 2.88.222
Добавлено
OpenODSтеперь сохраняет литералыnumber:textв числовых стилях данных ODS. Числовые, процентные и валютные стили, которые размещаютnumber:textдо или послеnumber:number, теперь импортируют эти литералы в числовой формат XLSX, сохраняя метки и суффиксы единиц, напримерkg
Версия 2.88.221
Исправлено
OpenODSтеперь импортирует отрицательные длительности времени ODS. Значенияoffice:time-value, такие как-PT02H03M04S, теперь импортируются как отрицательные серийные значения времени, а не пропускаются
Версия 2.88.220
Исправлено
OpenODSтеперь определяет стили ячеек по умолчанию отдельно для каждого повторяющегося столбца. Повторяющаяся ячейка ODS, пересекающая границы стандартных стилей столбцов, теперь применяет для каждого целевого столбца его стандартный числовой формат столбца или таблицы, а не повторно использует формат первого повторяющегося столбца
Версия 2.88.219
Добавлено
OpenODSтеперь сохраняет дробные секунды в значениях даты ODS. Метки времениoffice:date-value, такие как2026-06-04T12:30:00.250, теперь сохраняют компонент миллисекунд вместо усечения до целых секунд
Версия 2.88.218
Добавлено
OpenODSтеперь импортирует видимость листов ODS. Таблицы ODS со скрытыми значениямиtable:visibility, такими какcollapse, теперь импортируются как скрытые листы XLSX, а не всегда как видимые вкладки
Версия 2.88.217
Добавлено
OpenODSтеперь применяет стили ячеек ODS по умолчанию.table:default-cell-style-nameв таблицах, столбцах и строках теперь участвует в разрешении числового формата для ячеек без прямогоtable:style-name, с приоритетом ячейка, строка, столбец, таблица
Версия 2.88.216
Добавлено
OpenODSтеперь импортирует компоненты стилей даты и времени ODS. Data styles для даты и времени теперь считывают распространенные узлыnumber:year,number:month,number:day,number:hours,number:minutes,number:seconds,number:am-pmиnumber:text, поэтому импортированные ячейки сохраняют порядок компонентов и разделители, такие какdd/mm/yyyyилиhh:mm
Версия 2.88.215
Добавлено
OpenODSтеперь импортирует числовые форматы ODS с минимальным числом разрядов. Data styles для чисел, процентов и валюты сnumber:min-integer-digitsиnumber:min-decimal-placesтеперь сопоставляются со строками XLSXNumberFormatс ведущими нулями и необязательными конечными десятичными заполнителями
Версия 2.88.214
Добавлено
OpenODSтеперь импортирует сгруппированные числовые форматы ODS. Data styles для чисел, процентов и валюты сnumber:grouping="true"теперь сопоставляются со строками XLSXNumberFormatс разделителями групп в стиле#,##0
Версия 2.88.213
Добавлено
OpenODSтеперь сохраняет символы валют ODS в импортированных числовых форматах. Data styles для валюты сnumber:currency-symbolтеперь используют этот символ как префикс XLSXNumberFormat, поэтому форматы вродеEUR#,##0.00больше не сводятся к$#,##0.00
Версия 2.88.212
Добавлено
OpenODSтеперь учитывает настройки десятичных знаков ODS в базовых числовых форматах. Data styles для чисел, процентов и валюты сnumber:decimal-placesтеперь сопоставляются с соответствующими строками XLSXNumberFormat, например0,0.0%или$#,##0
Версия 2.88.211
Добавлено
OpenODSтеперь импортирует нетипизированные кэшированные скалярные значения ODS. Ячейки безoffice:value-typeтеперь используют доступные атрибутыoffice:value,office:boolean-value,office:date-value,office:time-valueиoffice:string-valueперед возвратом к текстовому содержимому
Версия 2.88.210
Добавлено
OpenODSтеперь сохраняет границы текстовых абзацев ODS. Несколько абзацевtext:pимпортируются с переносами строк, а управляющие элементы пробеловtext:s,text:tabиtext:line-breakостаются в тексте ячейки вместо объединения в одну строку
Версия 2.88.209
Добавлено
OpenODSтеперь импортирует высоту строк и ширину столбцов ODS. Стили ODS table-column и table-row сstyle:column-width/style:row-heightтеперь сопоставляются сColWidth/RowHeight, включая повторяющиеся строки и столбцы
Версия 2.88.208
Добавлено
- Элементы управления chrome и геометрией окна книги XLSX.
TXLSXWorkbookтеперь предоставляет для фасада XLSXMinimized,WindowHidden,ShowHorizontalScroll,ShowVerticalScroll,XWindow,YWindow,WindowWidthиWindowHeight.SaveAsзаписывает соответствующие атрибуты<workbookView>,Openсохраняет их при round-trip, а значения геометрии ограничиваются OOXML-совместимым диапазоном 0..65535
Версия 2.88.207
Добавлено
- Элементы управления представлением книги XLSX.
TXLSXWorkbookтеперь предоставляетShowSheetTabs,TabRatio,FirstSheetиAutoFilterDateGrouping, чтобы вызывающий код мог управлять панелью вкладок книги и группировкой дат AutoFilter через фасад XLSX.SaveAsзаписывает соответствующие атрибуты<workbookView>,Openсохраняет их при round-trip,TabRatioограничивается диапазоном 0..1000, аFirstSheetограничивается существующим 0-based индексом листа
Версия 2.88.206
Добавлено
- Helper-методы XLSX AutoFit с ограничениями.
TXLSXWorksheet.AutoFitColumn,AutoFitColumns,AutoFitRow,AutoFitRowsи wrapper-методыTXLSXRangeAutoFitColumns/AutoFitRowsтеперь принимают необязательные минимальные и максимальные ограничения ширины/высоты, чтобы подгонять содержимое и сохранять макеты отчетов в проектных границах
Исправлено
- Имена шрифтов rich text в XLSX HTML. HTML-экспорт теперь выводит CSS
font-familyдля rich text с именами в двойных кавычках до HTML-экранирования, что соответствует документированному виду"..."для стилизованных run
Версия 2.88.205
Добавлено
- Фигуры прямоугольника, овала и линии (XLS). API рисования .xls получает
Shapes.AddRectangle,Shapes.AddOvalиShapes.AddLine(а также общийAddAutoShape), что позволяет создавать типизированные автофигуры и привязывать их к диапазону ячеек, не выстраивая вручную записи OfficeArt. Каждый метод возвращает фигуру, для которой можно задать форматированиеFillиLine; ранее можно было добавлять только изображения, надписи и примечания
Версия 2.88.204
Добавлено
- Точечные, пузырьковые и лепестковые диаграммы (XLSX).
AddChartтеперь принимает, помимо существующих типов гистограмма / линейчатая / график / круговая / с областями / кольцевая, такжеxlsxChartScatter(точечная XY),xlsxChartBubble(с диапазоном размера пузырька для каждого ряда) иxlsxChartRadar. Точечные и пузырьковые ряды строят диапазон категорий как X и диапазон значений как Y; пузырьки добавляютBubbleSizeRange
Версия 2.88.203
Добавлено
- Типизированные правила проверки данных с подсказками и предупреждениями (XLS). Классический движок .xls получает
AddWholeNumberValidation,AddDecimalValidation,AddDateValidation,AddTimeValidation,AddTextLengthValidationиAddCustomValidation(раньше была доступна только проверка по списку). Каждый метод возвращает правило, которое черезSetPrompt/SetError/AllowBlankможет содержать подсказку ввода, предупреждение об ошибке со значком останов / предупреждение / сообщение и переключатель «разрешить пустые»
Версия 2.88.202
Добавлено
- Подсказки ввода и предупреждения об ошибках для проверки данных (XLSX). Правило проверки данных теперь может содержать поле подсказки ввода (заголовок и текст, показываемые при выборе ячейки) и поле предупреждения об ошибке (заголовок, текст и значок останов / предупреждение / сообщение при недопустимом вводе), а также управлять стрелкой раскрывающегося списка. Задаётся через
SetPrompt,SetErrorи новые свойстваPromptTitle/Prompt/ErrorTitle/ErrorMessage/ErrorStyle/ShowDropDown; раньше были только переключатели отображения. Они сохраняются при загрузке
Версия 2.88.201
Добавлено
- Больше типов правил условного форматирования (XLSX). Движок XLSX получает текстовые правила (содержит, не содержит, начинается с, заканчивается на), первые/последние N (с необязательным процентом), выше и ниже среднего, повторяющиеся и уникальные значения, а также правила пустых / непустых / с ошибкой / без ошибки — каждое через отдельный метод
AddCondFormat*и с выделением через свойStyle. Эти правила также сохраняются при загрузке
Версия 2.88.200
Добавлено
- Условное форматирование на основе формулы (XLSX). Новое правило условного форматирования выделяет ячейки по произвольной формуле через
AddCondFormatExpression: формула вычисляется для каждой ячейки, и ячейки, где она истинна, получают выделение правила
Изменено
- Условное форматирование теперь действительно выделяет ячейки в .xlsx. Правила по значению ячейки и по формуле теперь несут разностный стиль — цвет заливки, цвет шрифта, полужирный / курсив / подчёркнутый —, записываемый в таблицу стилей книги, поэтому Excel закрашивает подходящие ячейки. Ранее условное форматирование XLSX сохранялось без какого-либо выделения
Версия 2.88.199
Добавлено
- Функции формул TEXTJOIN и CONCAT. Встроенный вычислитель формул теперь вычисляет
TEXTJOIN(объединяет текстовые значения с разделителем, при необходимости пропуская пустые ячейки) иCONCAT(объединяет текстовые значения без разделителя), которые, в отличие от старойCONCATENATE, разворачивают аргументы-диапазоны по ячейкам. При сохранении в.xlsxэти функции Excel 2016 записываются с префиксом_xlfn., чтобы Excel открывал их как настоящие функции; при повторном открытии отображается обычное имя
Версия 2.88.198
Добавлено
- Функции формул SUMIFS, COUNTIFS, AVERAGEIFS, MAXIFS и MINIFS. Встроенный вычислитель формул теперь вычисляет эти агрегаты с несколькими условиями, которые суммируют, подсчитывают, усредняют либо находят наибольшее или наименьшее значение ячеек, удовлетворяющих всем критериям в одном или нескольких параллельных диапазонах; критерии принимают операторы сравнения, например
">=30", и текстовые подстановочные знаки. При отсутствии подходящих ячеек AVERAGEIFS возвращает #DIV/0!, а MAXIFS/MINIFS возвращают 0, как в Excel; более новые MAXIFS и MINIFS записываются в.xlsxс префиксом_xlfn., используемым Excel
Версия 2.88.197
Добавлено
- Функции формул IFS, SWITCH и IFNA. Встроенный вычислитель формул теперь вычисляет современные логические функции
IFS(значение первого истинного условия),SWITCH(сопоставление выражения со списком случаев с необязательным значением по умолчанию) иIFNA(подстановка значения только при ошибке #N/A). Поскольку эти функции появились после исходного набора функций .xls, при сохранении в.xlsxони теперь записываются с префиксом_xlfn., используемым Excel, чтобы Excel открывал их как настоящие функции; при повторном открытии такого файла снова отображается обычное имя функции
Версия 2.88.196
Добавлено
- Функции формул INDEX и OFFSET. Встроенный вычислитель формул теперь вычисляет
INDEX(читает значение по его положению строки и столбца внутри диапазона) иOFFSET(читает значение, смещённое на заданное число строк и столбцов от опорной ячейки), обе черезCalculate. Двусторонние подстановкиINDEX/MATCHи ссылки, привязанные черезOFFSET, теперь вычисляются правильно, а позиция за пределами диапазона возвращает ошибку #REF!, как в Excel
Версия 2.88.195
Исправлено
- Экспортируемый HTML сохраняет границы и заливку строки заголовка. Когда ячейка использовала именованный шрифт, экспорт из XLSX в HTML записывал имя шрифта в двойных кавычках внутри атрибута style, заключённого в двойные кавычки, что преждевременно обрывало стиль, из-за чего ячейка теряла границы, заливку и размер. Имена шрифтов теперь заключаются в одинарные кавычки, поэтому стилизованная строка заголовка экспортируется с неповреждёнными линиями сетки — включая линию, замыкающую верх таблицы, — вместе с цветом фона
- Экспорт в RTF теперь соответствует разметке HTML и Excel. Экспорт из XLSX в RTF получил границы ячеек, объединение ячеек и сплошную заливку, а также теперь масштабирует ширину столбцов под печатаемую страницу, поэтому широкий столбец с автоподбором больше не выталкивает таблицу за пределы страницы. Ранее таблица RTF не имела границ, теряла объединённые заголовки и могла оказаться намного шире страницы
Версия 2.88.194
Исправлено
- Повторное сохранение книги .xls, содержащей текстовое поле, больше её не повреждает. Открытие файла XLS с текстовым полем и его повторное сохранение ранее дублировало внутреннюю запись рисунка, в результате чего создавалась книга, аварийно завершавшая работу Excel при повторном открытии файла. Данные рисунка текстового поля теперь корректно сохраняются при записи и чтении, поэтому повторно сохранённая книга открывается нормально
Версия 2.88.193
Исправлено
- Файлы .xlsx, защищённые паролем, теперь открываются в Excel. При сохранении книги с паролем через
SaveAsEncryptedранее создавался пакет стандартного шифрования ECMA-376, в котором шифртекст AES формировался неправильно, поэтому Excel отклонял файл даже с верным паролем. Шифрование AES-128 теперь выдаёт результат, соответствующий стандарту, и зашифрованная книга открывается в Excel 2007 и более поздних версиях с паролем, использованным при сохранении
Изменено
- Аппаратно ускоренный AES для шифрования XLSX. Шифр AES-128, лежащий в основе стандартного шифрования XLSX, теперь использует инструкции ЦП AES-NI как в 32-разрядной, так и в 64-разрядной Windows, если процессор их поддерживает, что ускоряет сохранение с защитой паролем. Процессоры без AES-NI автоматически возвращаются к переносимой программной реализации, поэтому результат идентичен на любой машине
Версия 2.88.192
Добавлено
- Формулы массива сохраняются при записи в XLSX и повторном открытии. Многоячеечная формула массива (CSE), заданная с помощью
SetArrayFormula, теперь сохраняется в файлы.xlsxи загружается из них как настоящая формула массива, поэтому при сохранении книги и её повторном открытии закреплённый диапазон распространения остаётся неизменным, а каждая ячейка по-прежнему вычисляется в собственный элемент матричного результата. Раньше сохранённая формула массива теряла свой диапазон распространения при повторном открытии файла
Версия 2.88.191
Добавлено
- Формулы массива распространяются на диапазон ячеек (XLSX). Диапазон в движке XLSX получает тот же метод
SetArrayFormula, что и в движке XLS: многоячеечная формула массива (CSE), такая как{=MMULT(A1:B2;D1:E2)}, заданная для блока ячеек, распространяет свою результирующую матрицу так, что каждая ячейка вычисляется в собственный элемент. Это завершает поддержку многоячеечных формул массива в обоих движках — XLS и XLSX
Версия 2.88.190
Добавлено
- Формулы массива распространяются на диапазон ячеек (XLS). Новый метод
SetArrayFormulaдля диапазона задаёт многоячеечную формулу массива (CSE), такую как{=MMULT(A1:B2;D1:E2)}, для блока ячеек, и калькулятор формул теперь распространяет результирующую матрицу на этот блок, так что каждая ячейка читает собственный элемент. Раньше ячейка с формулой массива вычислялась как неподдерживаемая. Матрица вычисляется один раз при каждом пересчёте и используется совместно всем диапазоном
Версия 2.88.189
Добавлено
- Функции формул MINVERSE и MMULT. Встроенный калькулятор формул теперь вычисляет
MINVERSE(обращение матрицы) иMMULT(произведение матриц). При вызове черезCalculateкаждая возвращает результирующую матрицу в виде двумерного массива, который можно читать поэлементно.MINVERSEтребует квадратного диапазона и возвращает ошибку #NUM! для вырожденной матрицы;MMULTтребует согласования внутренних размерностей (число столбцов первого диапазона равно числу строк второго), а иначе возвращает ошибку #VALUE!
Версия 2.88.188
Добавлено
- Функция формулы MDETERM. Встроенный калькулятор формул теперь вычисляет
MDETERM, возвращая определитель матрицы для квадратного диапазона черезCalculate. Неквадратный диапазон или диапазон, содержащий пустую либо нечисловую ячейку, возвращает ошибку #VALUE! в соответствии с Excel
Версия 2.88.187
Добавлено
- Статистические функции формул. Встроенный калькулятор формул теперь вычисляет
MEDIAN,LARGE,SMALLиRANK, поэтому формулы, которые обобщают диапазон чисел, пересчитываются корректно черезCalculate.MEDIANпринимает сочетание встроенных чисел и диапазонов;LARGEиSMALLвозвращают k-е наибольшее и k-е наименьшее значение;RANKсообщает позицию числа, ранжируя по умолчанию в порядке убывания или по возрастанию, если задан ненулевой аргумент порядка
Версия 2.88.186
Добавлено
- Функции формул поиска. Встроенный калькулятор формул теперь вычисляет
CHOOSEиMATCH, поэтому формулы, которые выбирают аргумент по индексу или находят позицию значения в строке либо столбце, пересчитываются корректно черезCalculate.MATCHподдерживает все три типа сопоставления — точное (0), наибольшее значение, не превышающее искомое, в возрастающем диапазоне (1, по умолчанию) и наименьшее значение, не меньшее искомого, в убывающем диапазоне (-1) — и сравнивает текст без учёта регистра
Версия 2.88.185
Добавлено
- Финансовые функции формул. Встроенный калькулятор формул теперь вычисляет
PV,FV,PMT,NPERиRATE, поэтому формулы приведённой стоимости, будущей стоимости, платежа, числа периодов и процентной ставки пересчитываются корректно черезCalculate. Необязательные аргументы будущей/приведённой стоимости и времени платежа (type) учитываются, аRATEрешается итеративно
Исправлено
- Десятичные разделители в строках формул. Исправлена ошибка, из-за которой строка формулы, передаваемая в
Calculateи содержащая десятичный разделитель (например,=PV(0.05;10;100)), могла не разбираться; числовые литералы с дробной частью теперь вычисляются корректно
Версия 2.88.184
Добавлено
- Информационные функции формул. Встроенный калькулятор формул теперь вычисляет
ISERROR,ISERR,ISNA,ISNUMBER,ISLOGICAL,ISNONTEXTиISREF, поэтому формулы проверки ошибок и проверки типов пересчитываются корректно черезCalculate.ISERRисключает #N/A, тогда какISNAсоответствует только #N/A
Версия 2.88.183
Добавлено
- Текстовые функции формул. Встроенный калькулятор формул теперь вычисляет
FIND,SEARCH,SUBSTITUTE,REPLACE,TRIM,PROPER,CLEAN,CHAR,CODE,T,EXACTиREPT, поэтому листы, использующие эти текстовые функции, пересчитываются корректно черезCalculate, а не возвращают результат неподдерживаемой функции.FINDучитывает регистр, аSEARCH— нет
Исправлено
- Функция CHAR распознаётся. Исправлена ошибка поиска имени, из-за которой функция
CHARбыла зарегистрирована в неправильном регистре и не могла быть разрешена в формулах
Версия 2.88.182
Изменено
- Функция формул IFERROR. Движок формул теперь распознаёт и вычисляет
IFERROR(value, value_if_error), возвращая запасное значение, когда первый аргумент вычисляется в любую ошибку Excel (#NULL!, #DIV/0!, #VALUE!, #REF!, #NAME?, #NUM!, #N/A), и само значение в противном случае. Функция полностью сохраняется в обоих движках — кодируется как токен функции в .xls (BIFF8) и как строка формулы<f>в .xlsx (OOXML), — поэтому книги открываются и пересчитываются в Excel корректно
Исправлено
- NA() теперь возвращает #N/A. Функция
NA()вычисляется в значение ошибки #N/A вместо того, чтобы сообщаться как неподдерживаемая, поэтому построенные вокруг неё формулы обработки ошибок (например,IFERROR(NA(), 0)) работают как ожидается
Версия 2.88.181
Добавлено
- Текстовые поля (XLSX). Новый метод
TXLSXWorksheet.AddTextBoxдобавляет отдельное текстовое поле, привязанное к прямоугольной области ячейки, и выводит его в рисунок рабочего листа как фигуру с текстовым телом. Это приводит движок XLSX в соответствие с уже имеющейся поддержкой текстовых полей в движке XLS
Версия 2.88.180
Добавлено
- Именованные константы размера бумаги (XLSX). Движок XLSX добавляет константы
xlsxPaperLetter,xlsxPaperA4,xlsxPaperA3и другие константыxlsxPaper*для свойстваTXLSXWorksheet.PaperSize, повторяя константыxlPaper*движка XLS, так что размер бумаги можно задать по имени вместо необработанного кода бумаги Excel
Версия 2.88.179
Добавлено
- Свойства документа XLS. Движок XLS получает свойства
IXLSWorkBook:Title,Subject,Author,Keywords,Comments,CompanyиManager, которые при сохранении записываются (в кодировке Unicode) в потоки OLE SummaryInformation / DocumentSummaryInformation файла .xls, поэтому панель «Файл > Сведения» в Excel отображает их. Это приводит движок XLS в соответствие с уже имеющимся набором свойств документа движка XLSX
Версия 2.88.178
Добавлено
- Диаграммы с областями и кольцевые диаграммы (XLSX).
TXLSXChartTypeдобавляетxlsxChartAreaиxlsxChartDoughnutк существующим типам гистограммы, линейчатой, графика и круговой диаграммы, поэтомуTXLSXWorksheet.AddChartможет создавать диаграммы с областями и кольцевые диаграммы. Движок диаграмм XLS (BIFF8) сохраняет свой набор: гистограмма / линейчатая / график / круговая
Версия 2.88.177
Добавлено
- Паритет API операций с диапазонами между движками. Движок XLSX получает методы диапазона в стиле Excel
TXLSXRange.CopyTo,MoveTo,InsertRows,DeleteRows,InsertColsиDeleteCols; движок XLS получает координатные методы рабочего листаIXLSWorksheet.CopyRange,MoveRange,InsertRows,DeleteRows,InsertColsиDeleteCols. Теперь оба движка предоставляют копирование/перемещение диапазонов и вставку/удаление целых строк и столбцов под совпадающими именами
Версия 2.88.176
Добавлено
- Встроенные стили ячеек. Новые методы
TXLSXRange.ApplyBuiltinStyle(XLSX) иIXLSRange.ApplyBuiltinStyle(XLS) одним вызовом воспроизводят вид стандартных именованных стилей ячеек Excel — «Хороший», «Плохой», «Нейтральный», «Вычисление», «Контрольная ячейка», «Пояснительный текст», «Ввод», «Связанная ячейка», «Примечание», «Вывод», «Текст предупреждения», «Заголовок 1-4», «Название», «Итог» и «Акцент 1-6» — применяя соответствующую заливку и шрифт
Версия 2.88.175
Добавлено
- Сортировка диапазона. Новые методы
TXLSXRange.Sort/TXLSXWorksheet.SortRange(XLSX) иIXLSWorksheet.SortRange(XLS) переупорядочивают строки прямоугольной области по одному или нескольким ключевым столбцам, по возрастанию или убыванию. Строки перемещаются целиком вместе со значениями и форматированием ячеек; строки с одинаковыми ключами сохраняют исходный порядок (устойчивая сортировка), а пустые ячейки всегда оказываются в конце
Версия 2.88.174
Добавлено
OpenCSVимпортирует файлы CSV и TSV в рабочий лист. Новые перегрузкиTXLSWorkbook.OpenCSVиTXLSXWorkbook.OpenCSVчитают текст с разделителями и поддерживают автоматическое определение разделителя (запятая, точка с запятой, табуляция или вертикальная черта), определение кодировки на основе BOM (UTF-8 и UTF-16) и обработку кавычек по RFC 4180.Openтеперь автоматически направляет файлы.csvи.tsvв импортер
Изменено
- Необязательное определение типа значений. По умолчанию числовые поля, поля с датами ISO-8601 и логические поля повышаются до типизированных значений ячеек; определение можно отключить, чтобы сохранить каждое поле как текст, сохраняя ведущие нули, длинные строки цифр и текст, начинающийся с
=
Версия 2.88.173
Изменено
OpenODSтеперь импортирует скрытую видимость строк и столбцов. Стили ODStable-rowиtable-columnсо значениямиtable:visibility, такими какcollapseилиfilter, теперь сопоставляются сRowHidden/ColHidden, включая повторяющиеся строки и столбцы
Версия 2.88.172
Изменено
- Экспорт XLSX в HTML теперь сохраняет вертикальное выравнивание.
TXLSXWorkbook.SaveAsHTMLиTXLSXRange.SaveAsHTMLвыводят CSS-правилаvertical-alignдля верхнего, центрального, выровненного и распределенного выравнивания ячеек, когда включенIncludeStyles
Версия 2.88.171
Изменено
- Экспорт XLSX в HTML теперь пропускает скрытые строки и столбцы.
TXLSXWorkbook.SaveAsHTMLиTXLSXRange.SaveAsHTMLисключают строки сRowHidden, столбцы сColHiddenи явно заданные столбцы нулевой ширины из создаваемой таблицы и<colgroup>
Версия 2.88.170
Изменено
- Экспорт XLSX в HTML теперь сохраняет границы ячеек. При включенных стилях
TXLSXWorkbook.SaveAsHTMLиTXLSXRange.SaveAsHTMLвыводят стороны границ ячейки как CSS-стилиborder-left,border-right,border-topиborder-bottom
Версия 2.88.169
Изменено
- Экспорт XLSX в HTML теперь сохраняет фрагменты форматированного текста. При включенных стилях
TXLSXWorkbook.SaveAsHTMLиTXLSXRange.SaveAsHTMLвыводят фрагментыTXLSXRichTextкак экранированные элементы<span>с inline-стилями шрифта, цвета, выделения и подчеркивания
Версия 2.88.168
Изменено
- HTML-экспорт XLSX теперь сохраняет явные размеры строк и столбцов. Когда стили включены,
TXLSXWorkbook.SaveAsHTMLиTXLSXRange.SaveAsHTMLзаписывают явные значенияColWidthчерез<colgroup>, а явные значенияRowHeightкак стили высоты на<tr>
Версия 2.88.167
Изменено
- HTML-экспорт XLSX теперь переносит комментарии ячеек как подсказки.
TXLSXWorkbook.SaveAsHTMLиTXLSXRange.SaveAsHTMLзаписывают комментарии XLSX в экранированные атрибутыtitleэлемента<td>, а экспорт на уровне книги расширяет границы таблицы, чтобы включать якоря только с комментариями
Версия 2.88.166
Изменено
- HTML-экспорт XLSX теперь сохраняет гиперссылки и привязанные изображения.
TXLSXWorkbook.SaveAsHTMLиTXLSXRange.SaveAsHTMLоборачивают связанные ячейки в экранированные якоря<a>и выводят привязанные изображения как встроенные URI изображенийdata:. Экспорт на уровне книги также расширяет границы таблицы, чтобы включать якоря гиперссылок и изображений за пределами заполненных ячеек
Версия 2.88.165
Добавлено
TXLSXTableтеперь сохраняет видимость строки итогов. Новое свойствоTotalsRowShownзаписывает и читает флаг OOXMLtotalsRowShown, поэтому таблицы XLSX могут сохранять включенную строку итогов в циклах SaveAs/Open
Версия 2.88.164
Добавлено
TXLSXWorksheetтеперь предоставляет типизированные помощники проверки данных.AddWholeNumberValidation,AddDecimalValidation,AddDateValidation,AddTimeValidation,AddTextLengthValidationиAddCustomValidationдобавляют типовые правила XLSX без ручной передачи значенийTXLSXDataValidationType
Версия 2.88.163
Изменено
OpenODSтеперь импортирует текстовые гиперссылки ODS. Ссылки ODStext:aсxlink:hrefтеперь создают записиTXLSXHyperlinks, сохраняют текст ссылки в импортированном значении ячейки и сопоставляют фрагментные цели вроде#Sheet.A1с внутренними ссылками книги
Версия 2.88.162
Изменено
OpenODSтеперь импортирует базовые комментарии ячеек. Ячейки ODS сoffice:annotationтеперь создают записиTXLSXCommentsс текстом комментария иdc:creatorв качестве автора, не добавляя текст аннотации к значению ячейки
Версия 2.88.161
Изменено
- Демо
ApiTourтеперь охватывают текущие helpers рабочего процесса XLSX. Примеры Delphi и C++BuilderApiTourтеперь показываютWriteRows,ForEachRow,PreviewAutoFilterRows,AutoFilterRowVisible,TXLSXHtmlExportOptionsиOnUserFunctionExвместе с созданием книги, экспортом и проверкой после повторного открытия
Версия 2.88.160
Добавлено
OnUserFunctionExдобавляет контекстные callback-и для пользовательских формул.TXLSWorkbook,IXLSWorkbookиTXLSXWorkbookтеперь могут получатьTXLSUserFunctionContextс индексом листа, строкой и столбцом, когдаCalculateделегирует пользовательскую или неподдерживаемую функцию листа коду приложения
Версия 2.88.159
Добавлено
TXLSXHtmlExportOptionsдобавляет настраиваемый экспорт XLSX HTML. ПерегрузкиSaveAsHTMLдля книги и диапазона могут переопределять заголовок документа, задавать CSS-класс таблицы, отключать встроенные и стандартные стили, подавлять UTF-8 BOM или выводить фрагмент таблицы без внешнего HTML-документа
Версия 2.88.158
Добавлено
TXLSXWorksheet.AutoFilterRowVisibleиPreviewAutoFilterRowsдобавляют предварительную оценку AutoFilter. Приложения могут проверить, соответствует ли строка сохраненным в листе критериям XLSX AutoFilter, или пройти по отфильтрованным строкам данных с callback видимости, не изменяя флаги скрытия строк
Версия 2.88.157
Добавлено
TXLSXWorksheet.WriteRowsдобавляет пакетный вывод XLSX по строкам. Вызывающий код может заполнять числовой или A1-style диапазон построчно, возвращая массивVariant, с пропуском целых строк, отменой и подсчетом записанных строк
Версия 2.88.156
Добавлено
TXLSXWorksheet.ForEachRowдобавляет построчный обход XLSX. Callback вызывается один раз для каждой загруженной строки, сообщает строку и первую/последнюю загруженную колонку, возвращает число посещенных строк и поддерживает отмену
Версия 2.88.155
Изменено
OpenODSтеперь импортирует кэшированные скалярные результаты из ячеек формул ODS. Если ячейка с формулой хранит числовые, Boolean-, date- или time-кэшированные значения безoffice:value-type, импортер сохраняет кэшированное значение ячейки и не конвертирует синтаксис формул ODS
Версия 2.88.154
Изменено
OpenODSтеперь сохраняет базовые форматы чисел и дат ODS. Стили ячеек ODS, связанные со стилями данных date, time, number, percentage или currency, теперь сопоставляются со строками XLSXNumberFormat, такими какyyyy-mm-ddи0.00, поэтому импортированные значения сохраняют базовое отображение
Версия 2.88.153
Изменено
- Объединенные ячейки ODS теперь импортируются как объединенные диапазоны XLSX.
OpenODSсопоставляетtable:number-columns-spannedиtable:number-rows-spannedв ячейках ODS сTXLSXMergedCells, оставляет значение в верхней левой ячейке и сохраняет covered cells пустыми
Версия 2.88.152
Изменено
- Имена листов ODS теперь можно читать без загрузки листов.
TXLSXWorkbook.GetODSSheetNames(FileName, AList)иGetODSSheetNames(Stream, AList)считывают имена таблиц изcontent.xmlв пакетах.ods, декодируют XML-escape-последовательности, создают имена по умолчанию для безымянных таблиц и не изменяют экземпляр workbook
Версия 2.88.151
Изменено
- Классические записи XLS
DIMENSIONтеперь задают пустые используемые диапазоны. Если лист .xls, созданный Excel, объявляет используемый диапазон вDIMENSION, но не содержит записей ячеек, HotXLS теперь показывает этот диапазон черезUsedRangeи сохраняет его при открытии/сохранении вместо отката кA1
Версия 2.88.150
Исправлено
- Внешние ссылки формул эпохи BIFF5 теперь загружаются корректно. Классический XLS parser теперь разрешает положительные внешние индексы листов Excel5 в tokens
tRef3d/tArea3dиtNameX, поэтому старые формулы .xls сохраняют 3D-диапазоны с указанием листа и ссылки на external name при открытии/сохранении
Версия 2.88.149
Удалено
- Записи BIFF8 для вычислений и расширений стилей теперь сохраняются при round-trip. HotXLS сохраняет записанные Excel записи
MTRSettings,ForceFullCalculation,CrErr, листовойUncalced,XFCRC, отдельныйDXF,StyleExtи семействоTableStylesво время классических циклов открытия/сохранения XLS, поэтому метаданные пересчета и расширений стиля больше не теряются
Версия 2.88.148
Добавлено
- Демонстрационные проекты C++Builder теперь покрывают тот же набор примеров, что и Delphi. Добавлены проекты C++Builder для
XlsTables,XlsCondFormat12иXlsCreateChart, с соответствующими страницами README и проверкой сборки Win32/Win64
Версия 2.88.147
Удалено
- Пользовательские представления BIFF8 теперь сохраняются при классических XLS round-trip. HotXLS сохраняет записанные Excel блоки
USERSVIEWBEGIN/USERSVIEWENDв workbook globals и worksheet substreams, включая немоделируемые records внутри блока, поэтому сохраненные пользовательские представления не теряются при open/save
Версия 2.88.146
Удалено
- Глобальные записи BIFF8 для представления и расширений книги теперь сохраняются при round-trip. HotXLS сохраняет при open/save записанные Excel записи
HIDEOBJ,TEMPLATEнулевой длины,TABIDиBOOKEXT, поэтому политика отображения скрытых объектов, маркеры шаблона, идентификаторы вкладок листов и метаданные расширений книги больше не теряются
Версия 2.88.145
Изменено
- TXLSXWorkbook теперь может импортировать базовые файлы OpenDocument Spreadsheet.
OpenODS(FileName)иOpenODS(Stream)читают таблицыcontent.xmlиз пакетов.odsв листы, сохраняя имена листов, скалярные значения, повторяющиеся строки и повторяющиеся столбцы. Стили, формулы, рисунки, диаграммы и расширенные возможности ODS не преобразуются
Версия 2.88.144
Изменено
- Изменения строк и столбцов XLSX теперь обновляют критерии столбцов AutoFilter.
TXLSXWorksheet.InsertRows,DeleteRows,InsertColsиDeleteColsтеперь переназначают смещенияColIdвAutoFilterColumnsпри перемещении диапазона фильтра и удаляют критерии, попавшие в удаленные столбцы
Версия 2.88.143
Изменено
- Изменения строк и столбцов XLSX теперь обновляют ручные разрывы страниц.
TXLSXWorksheet.InsertRows,DeleteRows,InsertColsиDeleteColsтеперь перемещают разрывы страниц строк и столбцов вместе с измененной сеткой и удаляют разрывы, попавшие в удаленные строки или столбцы
Версия 2.88.142
Изменено
- Изменения строк и столбцов XLSX теперь обновляют ссылки параметров печати.
TXLSXWorksheet.InsertRows,DeleteRows,InsertColsиDeleteColsтеперь корректируютPrintArea,PrintTitleRowsиPrintTitleCols, чтобы печатные диапазоны и повторяющиеся заголовки следовали за измененной сеткой
Версия 2.88.141
Изменено
- Правки строк и столбцов XLSX теперь обновляют цели внутренних гиперссылок.
TXLSXWorksheet.InsertRows,DeleteRows,InsertColsиDeleteColsтеперь корректируют внутренние якоряTXLSXHyperlink.Locationна изменяемом листе и внутренние цели с указанием листа в других местах книги
Версия 2.88.140
Изменено
- Правки строк и столбцов XLSX теперь обновляют формулы правил.
TXLSXWorksheet.InsertRows,DeleteRows,InsertColsиDeleteColsтеперь корректируют ссылки A1 внутриTXLSXConditionalFormat.Formula1/Formula2иTXLSXDataValidation.Formula1/Formula2, при этом числовые пороги и литеральные списки остаются без изменений
Версия 2.88.139
Изменено
- Правки строк и столбцов XLSX теперь обновляют диапазоны рядов диаграмм.
TXLSXWorksheet.InsertRows,DeleteRows,InsertColsиDeleteColsтеперь корректируютTXLSXChartSeries.CategoriesRangeиValuesRangeдля диаграмм на изменяемом листе и диаграмм в других местах, использующих ссылки с указанием листа, сохраняя привязки данных диаграммы после сохранения и повторного открытия
Версия 2.88.138
Изменено
- Правки строк и столбцов XLSX теперь обновляют формулы ячеек.
TXLSXWorksheet.InsertRows,DeleteRows,InsertColsиDeleteColsтеперь корректируют ссылки A1 в сохранившихся формулах ячеек на изменяемом листе, а также формулы с указанием листа в других местах книги, не меняя строки и несвязанные листы
Версия 2.88.137
Изменено
- Правки строк и столбцов XLSX теперь перемещают привязки рисунков.
TXLSXWorksheet.InsertRows,DeleteRows,InsertColsиDeleteColsтеперь перемещают привязки изображений к одной ячейке и изменяют размер или перемещают привязки диаграмм к двум ячейкам вместе с измененной сеткой, включая циклы сохранения и повторного открытия
Версия 2.88.136
Изменено
- Изменение строк и столбцов XLSX теперь обновляет определенные имена.
TXLSXWorksheet.InsertRows,DeleteRows,InsertColsиDeleteColsтеперь корректируют формулыTXLSXDefinedNameуровня книги и листа, которые указывают на редактируемый лист, сохраняя абсолютные маркеры A1 после сохранения и повторного открытия
Версия 2.88.135
Добавлено
- Классические текстовые поля XLS теперь поддерживают внутриклеточные смещения якоря.
TXLSTextBoxпредоставляетRow1Offs,Col1Offs,Row2OffsиCol2Offs, а перегрузкаSetAreaс параметрами смещения сохраняет смещения BIFF client-anchor при сохранении и повторном открытии
Версия 2.88.134
Изменено
- Проверка payload макросов XLSX теперь имеет псевдоним свойства только для чтения.
TXLSXWorkbook.VbaProjectDefinedотражаетHasVbaProjectи дает коду, ориентированному на свойства, прямой способ проверить наличие payloadvbaProject.bin
Версия 2.88.133
Изменено
- Рабочие листы XLSX теперь напрямую поддерживают очистку значений диапазона.
TXLSXWorksheet.ClearRangeValuesпринимает ссылки A1 или границы строк/столбцов и очищает значения/формулы, сохраняя стили, поэтому вызывающему коду не нужно сначала создавать оберткуTXLSXRange
Версия 2.88.132
Удалено
- Диапазоны XLSX теперь могут очищать содержимое ячеек с помощью явного помощника для значений.
TXLSXRange.ClearValuesудаляет значения и формулы во всем диапазоне, сохраняя индексы стилей; он соответствуетClear, но делает очистку только содержимого заметнее
Версия 2.88.131
Изменено
- Литералы проверки данных списка XLSX теперь экранируют встроенные двойные кавычки.
TXLSXDataValidations.AddListиTXLSXWorksheet.AddListValidationудваивают кавычки внутри текста элементов, разделенных запятыми, перед упаковкой в строку формулы Excel, поэтому значения раскрывающихся списков с кавычками корректно проходят round-trip
Версия 2.88.130
Удалено
- Критерии XLSX AutoFilter теперь можно очищать напрямую из коллекции критериев.
TXLSXAutoFilterColumns.ClearCriteriaудаляет все сохраненные поколоночные критерии фильтрации, сохраняяAutoFilterRangeлиста
Версия 2.88.129
Добавлено
- Объединенные диапазоны XLSX теперь нормализуют обратные координаты при добавлении.
TXLSXMergedCells.Addсохраняет диапазоны в порядке верхний левый / нижний правый, даже если вызывающий код сначала передает конечную ячейку, создавая стабильные ссылки вродеA2:E6
Версия 2.88.128
Добавлено
- Коллекции листов XLSX теперь поддерживают прямое удаление по имени.
TXLSXSheetsдобавляетDeleteByName, позволяя приложениям удалять лист по имени без учета регистра и сохранять согласованным выбор активного листа
Версия 2.88.127
Добавлено
- Коллекции диаграмм XLSX теперь поддерживают прямой поиск и удаление по заголовку.
TXLSXChartsдобавляетIndexOfName,FindByName,DeleteByNameиDelete, чтобы приложения могли находить или удалять диаграммы по заголовку без ручного сканирования коллекции
Версия 2.88.126
Добавлено
- Коллекции XLSX внешних ссылок теперь поддерживают прямой поиск и удаление по цели.
TXLSXExternalLinksдобавляетIndexOfTarget,FindByTarget,DeleteByTargetиDelete, чтобы приложения могли проверять или удалять метаданные связанных книг без ручного сканирования коллекции
Версия 2.88.125
Добавлено
- Коллекции XLSX объединенных ячеек теперь поддерживают прямой поиск и удаление по диапазону.
TXLSXMergedCellsдобавляетIndexOfCell,FindAt,DeleteAtиDeleteInRange, чтобы приложения могли проверять или удалять объединенные диапазоны без ручного сканирования коллекции
Версия 2.88.124
Добавлено
- Коллекции XLSX для условного форматирования и проверки данных теперь поддерживают поиск и удаление с учетом диапазонов.
TXLSXConditionalFormatsиTXLSXDataValidationsдобавляютIndexOfCell,FindAt,DeleteAtиDeleteInRange, чтобы приложения могли находить или удалять правила, покрывающие ячейку или пересекающие диапазон, без ручного сканированияsqref
Версия 2.88.123
Добавлено
- Коллекции изображений XLSX теперь поддерживают прямой поиск и удаление по якорю.
TXLSXImagesдобавляетIndexOfCell,FindAt,DeleteAt,DeleteInRangeиDelete, поэтому приложения могут проверять или удалять встроенные изображения без ручного обхода коллекции
Версия 2.88.122
Добавлено
- Коллекции столбцов XLSX AutoFilter теперь поддерживают прямой поиск и удаление.
TXLSXAutoFilterColumnsдобавляетFindByColIdиDeleteByColId, поэтому приложения могут проверять или удалять критерии по столбцам без ручного обхода коллекции
Версия 2.88.121
Добавлено
- Коллекции таблиц XLSX теперь поддерживают прямой поиск и удаление таблиц.
TXLSXTablesдобавляетIndexOfName,FindByNameиDeleteByName, поэтому приложения могут находить или удалять именованные таблицы листа без ручного перебора коллекции
Версия 2.88.120
Добавлено
- Коллекции XLSX defined names теперь поддерживают прямой поиск объектов и удаление.
TXLSXDefinedNamesдобавляет overloadsIndexOfName(Name, SheetIndex),FindByNameиDeleteByName, чтобы приложения могли работать с workbook-scoped и sheet-scoped names без ручного обхода коллекции
Версия 2.88.119
Добавлено
- Коллекции XLSX comments и hyperlinks теперь поддерживают поиск и удаление по ячейке.
TXLSXCommentsиTXLSXHyperlinksпредоставляютIndexOfCell,FindAt,DeleteAtиDeleteInRange, поэтому код приложения может находить или удалять worksheet comments и links без ручного обхода коллекции
Версия 2.88.118
Изменено
- Демо ApiTour теперь проверяют повторно открытые XLSX workbook objects. Примеры ApiTour для Delphi и C++Builder повторно открывают созданный XLSX workbook и записывают строки
reopen-inspectдля defined names, comments, hyperlinks, autofilter ranges и autofilter criteria вApiTour-XLSX-Modified.xlsx
Версия 2.88.117
Удалено
- Записи книги BIFF8 для общего доступа к файлу и защиты исправлений теперь сохраняются при round-trip. HotXLS сохраняет при open/save записанные Excel тела записей
FILESHARING,FILESHARING2,PROT4REVиPROT4REVPASS, поэтому метаданные рекомендации только для чтения, общего доступа и защиты исправлений больше не теряются
Версия 2.88.116
Изменено
- Демо ApiTour теперь охватывают XLSX workbook object helpers. Примеры ApiTour для Delphi и C++Builder создают defined name, worksheet comment, hyperlink, autofilter range и autofilter criteria, сохраняя существующие workflow для callback, text replacement и export
Версия 2.88.115
Изменено
- Демо InteractiveFeatures теперь могут повторно открывать classic XLS pivot workbooks. Вкладки Pivot в Delphi и C++Builder могут открыть существующий classic XLS pivot workbook, перечислить сохраненные PivotTables на каждом worksheet и записать для каждой таблицы field count, data field count и cache source range
Версия 2.88.114
Изменено
- Demo InteractiveFeatures теперь могут повторно открывать classic XLS workbooks для workflow TextBox. Формы Delphi и C++Builder могут открыть существующий classic XLS workbook, найти сохраненные независимые drawing TextBox, вывести их список и продолжить edit, delete, range-delete и save операции с открытым файлом
Версия 2.88.113
Изменено
- В C++Builder demo теперь есть пример InteractiveFeatures для расширенных workbook workflow. VCL form предоставляет тот же интерактивный путь Pivot / TextBox / Macro: создание typed classic XLS PivotTables, редактирование независимых drawing TextBox и обработка XLSM payload
vbaProject.binдля load, export, clear и просмотра parsed modules
Версия 2.88.112
Изменено
- В Delphi demo теперь есть пример InteractiveFeatures для расширенных workbook workflow. VCL form создает typed classic XLS PivotTables, редактирует независимые drawing TextBox и обрабатывает XLSM payload
vbaProject.bin: load, export, clear и просмотр parsed modules
Версия 2.88.111
Добавлено
- Листы Classic XLS теперь поддерживают самостоятельные рисованные TextBox. Используйте
TXLSShapes.AddTextBox, чтобы создатьTXLSTextBoxс собственным якорем строк/столбцов, текстом, text runs, форматированием линии/заливки и обычным удалением shape без создания комментария ячейки
Версия 2.88.110
Изменено
- Демонстрации ApiTour теперь показывают больше сценариев автоматизации workbook. Примеры ApiTour для Delphi и C++Builder демонстрируют запись диапазонов через callbacks с
WriteCells, обход загруженных ячеек сForEachCell, обновление шаблонов сFindTextиReplaceText, HTML-экспорт выбранного диапазона вApiTour-Range.htmlи пользовательские callbacks формул в Delphi черезOnUserFunction
Версия 2.88.109
Изменено
- Демонстрации QuickStart теперь показывают более полный первый workbook. Примеры QuickStart для Delphi и C++Builder создают оформленную таблицу умножения с формулами итогов по строкам и столбцам, закрепленными областями и согласованными действиями XLS/XLSX; дерево demo теперь также содержит аккуратные HTML readme-страницы для каждого примера
Версия 2.88.108
Изменено
- Диапазоны XLSX теперь имеют прямые вспомогательные методы экспорта HTML.
TXLSXRange.SaveAsHTML(FileName)иTXLSXRange.SaveAsHTML(Stream)экспортируют только выбранный диапазон XLSX как таблицу HTML в UTF-8, используя общее экранирование, базовый вывод стилей и обработку span объединенных ячеек renderer HTML workbook
Версия 2.88.107
Добавлено
- Листы XLSX теперь включают вспомогательные методы поиска и замены текста.
TXLSXWorksheet.FindTextиTXLSXWorksheet.ReplaceTextпросматривают загруженные текстовые ячейки в порядке row-major, пропускают формулы и нетекстовые значения и поддерживают необязательное сопоставление с учетом регистра для шаблонных рабочих процессов
Версия 2.88.106
Изменено
- Флаги представления BIFF8 Window2 теперь сохраняют пользовательский цвет сетки и состояние закрепленных областей. HotXLS теперь очищает
fDefaultHdr, когдаWindow2.icvHdrхранит пользовательский цвет сетки, сохраняет записанный ExcelfFrozenNoSplitво время open/save и записываетfFrozenNoSplitдля выводаFreezePanes
Версия 2.88.105
Изменено
- Пороговые значения формул CF12 теперь проходят round-trip в правилах BIFF8 Data Bar, Color Scale и Icon Set. Пороговые значения на основе формул при сохранении компилируются в CF12 formula token bytes и восстанавливаются в
TXLSCfValue.Valueпри повторном открытии workbook
Версия 2.88.104
Изменено
- Формулы Classic XLS и пороги наборов значков теперь записывают более компактные записи BIFF8. Целочисленные константы в формулах используют компактный token
tInt, когда попадают в диапазон BIFF unsigned-integer, аTXLSIconSetSpec.ThresholdEqualsInclude[Index]теперь управляет CF12 icon-set threshold equals byte, чтобы вызывающий код мог выбрать семантику сравнения include или exclude
Версия 2.88.103
Изменено
- В листах Classic XLS появился помощник поиска текста.
IXLSWorksheet.FindText(SearchText, Row, Col[, MatchCase])находит первую подходящую загруженную текстовую ячейку, пропускает формулы и нетекстовые ячейки и очищает возвращаемые координаты, если совпадение не найдено
Версия 2.88.102
Изменено
- В листах Classic XLS появился помощник замены текста.
IXLSWorksheet.ReplaceText(SearchText, ReplacementText[, MatchCase])заменяет совпадения в загруженных текстовых ячейках, пропускает формулы и нетекстовые ячейки и возвращает количество измененных ячеек для сценариев заполнения шаблонов
Версия 2.88.101
Изменено
- Для диапазонов добавлены прямые помощники экспорта HTML.
IXLSRange.SaveAsHTML(FileName)иIXLSRange.SaveAsHTML(Stream)экспортируют выбранный диапазон через существующий HTML-рендерер, поэтому для обычных фрагментов диапазона больше не нужно создавать экземплярTXLSHTMLExportили явно передаватьxlHTML
Версия 2.88.100
Изменено
TXLSWorkbook.GetSheetNames(Stream, AList)теперь читает потоки пакетов XLSX наряду с потоками Classic XLS. Приложения могут передавать в классический фасад потоки памяти, потоки BLOB из базы данных или загруженные потоки XLSX и получать упорядоченные имена листов без предварительного сохранения в файл
Версия 2.88.99
Добавлено
- API поиска листов, создания гиперссылок и выбора нескольких областей стали удобнее. Коллекции листов Classic XLS и XLSX добавляют
TryGetSheetByName, листы Classic XLS добавляют удобные перегрузкиAddHyperlink, аIXLSWorksheet.SelectAreasможет записывать активные выделения из нескольких диапазонов
Версия 2.88.98
Изменено
- Книги Classic XLS теперь предоставляют псевдоним
UserNameдля поля пользователя, сохранившего файл.IXLSWorkbook.UserNameсопоставляется с тем же значением WRITEACCESS, что иLastSavedBy, поэтому код с соглашением именованияUserNameможет напрямую читать и обновлять аудиторское имя книги
Версия 2.88.97
Изменено
- Листы XLSX теперь используют те же callback helpers для сканирования ячеек и записи диапазонов.
TXLSXWorksheet.ForEachCellперечисляет загруженные ячейки по строкам со значением и текстом формулы, аTXLSXWorksheet.WriteCellsзаполняет числовые или A1-style диапазоны из callback с пропуском ячеек и отменой
Версия 2.88.96
Добавлено
- Листы Classic XLS теперь поддерживают запись диапазонов через callback.
IXLSWorksheet.WriteCellsзаполняет 1-based числовой диапазон или диапазон A1-style по строкам, позволяет callback передавать значение каждой ячейки, поддерживает пропуск отдельных ячеек и может досрочно отменить длинные циклы записи
Версия 2.88.95
Изменено
- Листы Classic XLS теперь могут перечислять загруженные ячейки через callback.
IXLSWorksheet.ForEachCellпроходит существующие ячейки листа по строкам, передает 1-based координаты листа, строки и столбца вместе со значением и текстом формулы, а callback может досрочно отменить долгий просмотр
Версия 2.88.94
Изменено
- Вычисление формул теперь может вызывать функции, определенные приложением.
TXLSWorkbook.OnUserFunctionиTXLSXWorkbook.OnUserFunctionпозволяютCalculateпередавать пользовательские или пока не поддерживаемые функции листа в код приложения, передавая вычисленные аргументы и используя возвращенный результатVariant, если вызов обработан
Версия 2.88.93
Добавлено
- Защита листов Classic XLS теперь предоставляет флаги разрешений для отдельных действий.
IXLSWorksheetдобавляетAllowDeleteRows,AllowInsertRows,AllowFormatCells,AllowSort,AllowAutoFilterи остальные свойства разрешений SheetProtect; параметры BIFF8 записываются и считываются через существующие записи защиты
Версия 2.88.92
Изменено
- Для payload VBA в Classic XLS теперь есть явные helper-методы загрузки, сохранения и очистки.
IXLSWorkbook.LoadVBAProjectFromFile,SaveVBAProjectToFile,HasVBAProjectиClearVBAProjectоткрывают сохраненный payload хранилища OLE VBA, аVBAProjectостается разобранным представлением модулей только для чтения
Версия 2.88.91
Изменено
- Критерии Classic XLS AutoFilter теперь можно проверять через коллекцию полей.
IXLSWorksheet.AutoFilterColumnsпредоставляет текущий счетчик полей BIFF8 AutoFilter и 1-based элементы полей, включая active state, operator и сохраненные DOPER-значенияCriteria1/Criteria2
Версия 2.88.90
Изменено
- Classic XLS worksheets теперь могут настраивать критерии AutoFilter одним вызовом.
IXLSWorksheet.ApplyAutoFilterзадает диапазон worksheet AutoFilter и записывает критерий поля в том же вызове, поддерживая перегрузки диапазона A1-style и числового 1-based диапазона, а также необязательные операторы для двух критериев
Версия 2.88.89
Удалено
- Classic XLS shapes теперь можно удалять по диапазону ячеек.
TXLSShapes.DeleteInRangeудаляет закрепленные изображения или shapes, чьи OfficeArt client anchors пересекают 1-based диапазон листа, и возвращает количество удаленных shapes
Версия 2.88.88
Изменено
- Table layout attributes в Classic HTML export теперь настраиваются.
TXLSHTMLExport.TableBorderWidth,CellPaddingиCellSpacingуправляют создаваемыми атрибутами<table>для styled и simple HTML output, сохраняя прежние нулевые значения по умолчанию
Версия 2.88.87
Добавлено
- Classic HTML export теперь поддерживает minimal table output.
TXLSHTMLExport.SimpleExportзаписывает plain HTML table без созданных CSS classes, hyperlink anchors или comment title attributes, сохраняя экранированный display text и merged-cell spans
Версия 2.88.86
Изменено
- Classic HTML export теперь может записывать document title.
TXLSHTMLExport.Titleзаписывает экранированный HTML-элемент<title>перед созданным style block, а пустое значение по умолчанию оставляет существующий вывод без изменений
Версия 2.88.85
Изменено
- Classic HTML export теперь переносит cell comments как tooltips.
TXLSHTMLExport.Optionsтеперь по умолчанию включаетxhCommentsи записывает cell comment text как экранированные атрибутыtitle, при этом вызывающий код может удалить эту option для plain cell output
Версия 2.88.84
Изменено
- Hyperlink output в Classic HTML export теперь настраивается.
TXLSHTMLExport.Optionsпо умолчанию использует[xhHyperlinks]для существующего поведения, а вызывающий код может удалитьxhHyperlinks, чтобы экспортировать linked cells как plain escaped text
Версия 2.88.83
Изменено
- Classic HTML export теперь сохраняет cell hyperlinks.
SaveAsHTMLоборачивает linked cells в HTML anchor tags, выводит hyperlink addresses как экранированные значенияhref, переносит ScreenTip text как экранированные атрибутыtitleи сохраняет отображаемый cell text экранированным внутри link
Версия 2.88.82
Изменено
- Книги Classic XLS теперь могут управлять именем пользователя saved-by.
IXLSWorkbook.LastSavedByоткрывает поле WRITEACCESS saved-by, чтобы созданные или измененные книги могли сохранять явное имя для аудита, а неизмененные исходные книги продолжали сохранять исходные metadata
Версия 2.88.81
Изменено
- Листы Classic XLS теперь могут управлять индексом цвета отображаемых линий сетки.
IXLSWorksheet.GridlineColorIndexоткрывает поле Window2icvHdr, чтобы сохраненные листы повторно открывались с выбранным цветом сетки без изменения видимости сетки или параметров печати сетки
Версия 2.88.80
Изменено
- Classic XLS workbooks теперь могут задавать active sheet по индексу.
IXLSWorkbook.ActiveSheetIndexпредоставляет 1-based свойство active-tab на основе поля active sheet в WINDOW1, позволяя сохраненным workbooks открываться на выбранном worksheet без изменения first visible tab
Версия 2.88.79
Изменено
- Classic XLS worksheet outlines теперь могут управлять автоматическими стилями структуры.
TXLSOutline.ApplyStylesпредоставляет флаг outline style из WSBool, позволяя сохраненным worksheets сохранять или явно включать применение стилей структуры Excel без изменения outline levels или размещения summary
Версия 2.88.78
Изменено
- Classic XLS page setup теперь может управлять автоматическими разрывами страниц.
IXLSPageSetup.AutoPageBreaksпредоставляет флаг automatic page-break из worksheet WSBool, позволяя сохраненным worksheets оставлять автоматические разрывы страниц включенными или явно отключать их, сохраняя ручные разрывы страниц
Версия 2.88.77
Изменено
- Classic XLS workbooks теперь могут управлять группировкой дат AutoFilter.
IXLSWorkbook.AutoFilterDateGroupingпредоставляет флаг группировки дат Window1 через положительный Boolean API, позволяя сохраненным workbooks оставлять группировку фильтров дат Excel включенной или явно отключать ее
Версия 2.88.76
Изменено
- Classic XLS workbooks теперь могут напрямую задавать положение и размер workbook window.
IXLSWorkbook.XWindow,YWindow,WindowWidthиWindowHeightоткрывают поля Window1 geometry, чтобы сохраненные workbooks могли повторно открываться с выбранным window rectangle
Версия 2.88.75
Изменено
- Classic XLS workbooks теперь могут напрямую сохранять состояние hidden для workbook window.
IXLSWorkbook.WindowHiddenсопоставляется с флагом hidden в Window1, позволяя сохраненным workbooks повторно открываться с hidden workbook window без изменения видимости worksheet
Версия 2.88.74
Изменено
- Classic XLS workbooks теперь могут напрямую сохранять состояние minimized для workbook window.
IXLSWorkbook.Minimizedсопоставляется с флагом minimized в Window1, позволяя сохраненным workbooks повторно открываться с минимизированным workbook window
Версия 2.88.73
Изменено
- Classic XLS workbooks теперь могут напрямую скрывать или показывать вертикальную полосу прокрутки.
IXLSWorkbook.ShowVerticalScrollсопоставляется с флагом Window1fDspVScroll, позволяя сохраненным workbooks открываться со скрытой или видимой вертикальной полосой прокрутки
Версия 2.88.72
Изменено
- Classic XLS workbooks теперь могут напрямую скрывать или показывать горизонтальную полосу прокрутки.
IXLSWorkbook.ShowHorizontalScrollсопоставляется с флагом Window1fDspHScroll, позволяя сохраненным workbooks открываться со скрытой или видимой горизонтальной полосой прокрутки
Версия 2.88.71
Изменено
- Classic XLS workbooks теперь могут напрямую скрывать или показывать sheet tab bar.
IXLSWorkbook.ShowSheetTabsсопоставляется с флагом Window1fDspTabs, позволяя сохраненным workbooks открываться со скрытыми или видимыми sheet tabs без изменения видимости worksheet
Версия 2.88.70
Изменено
- Classic XLS workbooks теперь могут напрямую задавать соотношение workbook tab bar.
IXLSWorkbook.TabRatioоткрывает значение Window1wTabRatio, чтобы вызывающий код мог настроить место для sheet tabs относительно горизонтальной полосы прокрутки
Версия 2.88.69
Изменено
- Classic XLS workbooks теперь могут напрямую задавать первую видимую sheet tab.
IXLSWorkbook.FirstSheetоткрывает значение Window1itabFirstкак свойство 1-based, чтобы вызывающий код мог выбрать, какая sheet tab появится у левого края при открытии workbook в Excel
Версия 2.88.68
Изменено
- Classic XLS worksheets теперь могут сохранять и задавать видимость outline symbols.
IXLSWorksheet.DisplayOutlineSymbolsсопоставляется с флагом BIFF WINDOW2fDspGuts, позволяя сохраненным sheets скрывать символы outline и grouping в оконном представлении
Версия 2.88.67
Изменено
- Classic XLS worksheets теперь могут сохранять и задавать видимость заголовков строк и столбцов.
IXLSWorksheet.DisplayHeadingsсопоставляется с флагом BIFF WINDOW2fDspRwCol, позволяя сохраненным sheets скрывать номера строк и буквы столбцов в оконном представлении
Версия 2.88.66
Изменено
- Classic XLS worksheets теперь могут сохранять и задавать режим показа формул.
IXLSWorksheet.DisplayFormulasсопоставляется с флагом BIFF WINDOW2fDspFmla, чтобы Excel мог открывать sheet с текстом формул вместо вычисленных результатов
Версия 2.88.65
Изменено
- Classic XLS worksheets теперь могут независимо задавать масштаб Normal view.
IXLSWorksheet.NormalViewZoomоткрывает кэшированный WINDOW2 Normal zoom, чтобы вызывающий код мог сохранять отдельные уровни масштаба, пока sheet находится в Page Break Preview
Версия 2.88.64
Изменено
- Classic XLS worksheets теперь могут напрямую задавать масштаб Page Break Preview.
IXLSWorksheet.PageBreakPreviewZoomоткрывает кэшированный WINDOW2 preview zoom, чтобы вызывающий код мог сохранять разные уровни масштаба для Normal и Page Break Preview
Версия 2.88.63
Изменено
- Classic XLS worksheets теперь предоставляют помощники для разделенных областей.
IXLSWorksheet.SplitPanes(Width, Height)создает перемещаемое разделение с помощью существующего BIFF pane writer, аUnsplitPanesочищает pane record перед сохранением
Версия 2.88.62
Удалено
- Classic XLS worksheets теперь имеют более простые помощники для закрепленных областей.
IXLSWorksheet.FreezePanes(Cols, Rows)закрепляет нужные левые столбцы и верхние строки, аUnfreezePanesудаляет pane record перед сохранением
Версия 2.88.61
Изменено
- Определение имен листов classic XLS теперь принимает потоки.
TXLSWorkbook.GetSheetNames(Stream, List)читает имена листов BIFF из XLS stream, переданного вызывающим кодом, без загрузки содержимого worksheet, повторяя файловый помощник для данных workbook в памяти
Версия 2.88.60
Исправлено
- Коллекции worksheet теперь предоставляют прямые помощники поиска по имени.
IXLSWorkSheets.SheetByName(Name)иTXLSXSheets.SheetByName(Name)возвращают соответствующий объект worksheet илиnil, поэтому вызывающему коду больше не нужно сначала получать индекс для доступа к листу
Версия 2.88.59
Изменено
- Фасад XLSX теперь читает имена листов напрямую из потоков.
TXLSXWorkbook.GetSheetNames(Stream, List)читает упорядоченные имена изxl/workbook.xmlбез загрузки worksheet XML, как и перегрузка с именем файла для книг в памяти или в BLOB-хранилище
Версия 2.88.58
Изменено
- Фасад XLSX теперь предоставляет быстрое чтение имен листов.
TXLSXWorkbook.GetSheetNames(FileName, List)читает упорядоченные имена изxl/workbook.xmlбез загрузки worksheet XML
Версия 2.88.57
Добавлено
TXLSWorkbook.GetSheetNamesтеперь поддерживает пакеты XLSX. Метод читаетxl/workbook.xmlиз файлов.xlsx,.xlsm,.xltxи.xltmи возвращает упорядоченные имена листов без загрузки worksheet XML
Версия 2.88.56
Изменено
- Классические книги XLS теперь могут читать имена листов без загрузки листов.
TXLSWorkbook.GetSheetNames(FileName, List)сканирует workbook globals stream и возвращает упорядоченные имена листов из файлов Excel 97-2003.xls
Версия 2.88.55
Изменено
- Критерии AutoFilter для диапазонов классического XLS теперь записывают фильтрующие записи BIFF8.
TXLSRange.Autofilter(Field, Criteria)при необходимости создает диапазон фильтра и выводит условияAUTOFILTERдля простых строковых, числовых, Boolean, пустых, непустых и снабженных префиксом сравнения критериев
Версия 2.88.54
Изменено
- Классические листы XLS теперь имеют помощники AutoFilter на уровне листа.
IXLSWorksheet.SetAutoFilter,ClearAutoFilterиAutoFilterRangeнапрямую управляют диапазонами раскрывающихся фильтров BIFF8, повторно используя существующую записьAUTOFILTERINFOи имени базы данных фильтра
Версия 2.88.53
Добавлено
- Классические листы XLS теперь позволяют создавать проверку данных со списком.
IXLSWorksheet.AddListValidation(Range, Items)записывает записи BIFF8DVALиDV, по умолчанию оставляет раскрывающийся список видимым, поддерживает встроенные списки с разделением запятыми и сохраняет правила после цикловOpen/SaveAs
Версия 2.88.52
Добавлено
- Расчет формул теперь работает согласованно для точек входа XLS и XLSX.
TXLSWorkbook.Calculateтеперь принимает формулы в стиле Excel, начинающиеся со знака равенства, например=SUM(A1:B1)+C1. Фасад XLSX добавляетTXLSXWorkbook.CalculateиTXLSXWorksheet.Calculate. Путь XLSX совместно использует парсер и вычислитель токенов формул HotXLS для ссылок на ячейки и диапазоны, ячеек, на которые ссылаются формулы, ссылок между листами и именованных диапазонов с областью действия книги или листа
Версия 2.88.51
Добавлено
- Диапазоны XLSX теперь поддерживают merge across в стиле Excel.
TXLSXRange.Merge(True)записывает одну запись<mergeCell>на каждую строку, повторяя поведение классического XLSRange.Merge(True), аMergeбез аргументов иMerge(False)по-прежнему создают один объединенный прямоугольник для всего диапазона
Версия 2.88.50
Изменено
- Размещение BIFF8 HeaderFooter и HFPicture теперь соответствует текущим правилам MS-XLS. HotXLS сохраняет записанные Excel записи
HeaderFooter($089C) для колонтитулов четных / первых страниц и повторно записываетHFPicture($0866) после размеров листа и объектов рисования согласно worksheet ABNF, поэтому детали макета страницы сохраняются при циклах открытия/сохранения .xls
Версия 2.88.49
Изменено
- Для rich-text run в комментариях теперь есть типизированный API.
TXLSComment.TextRunsоткрывает записи BIFF8TXOFormatRun, чтобы код мог читать или задавать границы шрифта по символам в комментариях .xls, а HotXLS по-прежнему сохраняет исходные байты run для безопасных round-trip
Версия 2.88.48
Изменено
- Дополнительные SX-записи сводных таблиц теперь доступны через типизированный API. HotXLS теперь привязывает загруженные BIFF8 pivot records, такие как
SXIVD,SXLI,SXFormat,SXEx,SXVDEx,SXRule,SXFiltиSXAddl, кTXLSPivotTable.SupplementalRecordsдля проверки, при этом сохраняя исходные raw bytes для безопасных циклов сохранения
Версия 2.88.47
Удалено
- Кэшированные значения внешних книг теперь сохраняются при циклах открытия/сохранения .xls. HotXLS теперь сохраняет записи BIFF8
XCTиCRN, привязанные к загруженным записямSUPBOOK, поэтому cached cell values для ссылок на внешние книги больше не теряются при сохранении
Версия 2.88.46
Изменено
- Уровни структуры встроенных стилей теперь сохраняются при циклах открытия/сохранения .xls. HotXLS теперь читает и сохраняет байт
iLevelзаписи BIFF8STYLEдля встроенных стилей, поэтому метаданные Excel RowLevel_1..7 и ColLevel_1..7 больше не сбрасываются к значению по умолчанию при сохранении
Версия 2.88.45
Изменено
- Метаданные определенных имен теперь сохраняются при циклах открытия/сохранения .xls. HotXLS теперь сохраняет option bits и shortcut bytes загруженных записей BIFF8
NAME, пока определенное имя не редактируется, поэтому записанные Excel метаданные function, object, procedure, calculated-expression и binary-name больше не очищаются при сохранении
Версия 2.88.44
Удалено
- Маркеры книги ObProj теперь сохраняются при цикле открытия и сохранения .xls. HotXLS теперь сохраняет загруженные записи BIFF8
ObProj, даже когда VBA storage не представлен в объектной модели, поэтому маркеры VBA project уровня книги и сторонние метаданные больше не удаляются при сохранении
Версия 2.88.43
Изменено
- Флаги параметров листа теперь сохраняются при цикле открытия и сохранения .xls. HotXLS теперь сохраняет немоделированные биты BIFF8
WSBOOL, такие как лист диалога, автоматические разрывы страниц, применение стилей и отображение gutter структуры, при этом существующие параметры подгонки к странице и сводки структуры по-прежнему обновляются через публичный API
Версия 2.88.42
Изменено
- Дополнительные записи метаданных книги теперь сохраняются при цикле открытия и сохранения .xls. HotXLS теперь сохраняет загруженные тела записей BIFF8
COUNTRY,BOOKBOOL,BACKUP,FNGROUPCOUNT,USESELFSиRECALCIDвместо перезаписи значениями по умолчанию, сохраняя стабильными совместимость и вычислительные метаданные уровня книги
Версия 2.88.41
Изменено
- Многообластные выделения и фокус активной панели теперь сохраняются при цикле открытия и сохранения .xls. HotXLS теперь сохраняет загруженные записи BIFF8
SELECTIONи значение активной панелиPANES, если выбор листа или панели не изменялись через API, поэтому фокус разделенных/закрепленных панелей Excel и многообластные выделения больше не сворачиваются при сохранении
Версия 2.88.40
Удалено
- Имена внешних книг теперь сохраняются при цикле открытия и сохранения .xls. HotXLS теперь сохраняет загруженные записи BIFF8
EXTERNALNAME, связанные с внешними записямиSUPBOOK, включая метаданные DDE/OLE/ссылок и хвосты формул, поэтому внешние имена и определения ссылок больше не удаляются при сохранении
Версия 2.88.39
Изменено
- Защищенные паролем файлы BIFF8 .xls теперь записывают и читают записи FILEPASS RC4 CryptoAPI. HotXLS теперь записывает метаданные
FILEPASSvMajor=2 в стиле Excel 2007/2010 для зашифрованных книг .xls и читает как устаревший RC4 vMajor=1, так и RC4 CryptoAPI vMajor=2/3/4, поэтому защищенные паролем книги больше не падают на этом заголовке шифрования и не откатываются к старому заголовку
Версия 2.88.38
Изменено
- Метаданные гиперссылок .xls, записанные Excel, теперь сохраняются при циклах открытия/сохранения. HotXLS теперь сохраняет BIFF8
HLinkrecord body для загруженных гиперссылок, пока гиперссылка не редактируется, сохраняя стабильнымиstreamVersion,hlstmfoption bits, такие какfIcon, данные moniker и связанные метаданные назначения при сохранении
Версия 2.88.37
Изменено
- Состояние окна книги теперь сохраняется при циклах открытия/сохранения .xls. HotXLS теперь читает и сохраняет позицию, размер, flags видимости/iconic, первую отображаемую вкладку листа, количество выбранных вкладок и соотношение вкладок к полосе прокрутки из записи BIFF8
WINDOW1, вместо перезаписи этих значений значениями по умолчанию при каждом сохранении
Версия 2.88.36
Изменено
- Пользователи saved-by из BIFF8 WriteAccess теперь сохраняются при циклах открытия/сохранения .xls. HotXLS теперь читает и сохраняет
$005C WRITEACCESSrecord body вместо замены пользователя saved-by, записанного Excel, наHotXLS, поэтому метаданные аудита книги остаются стабильными после сохранения
Версия 2.88.35
Исправлено
- Авторы комментариев Excel теперь сохраняются при .xls open/save round-trip. Поле
stAuthorзаписи BIFF8Noteтеперь разбирается и передается в drawing note model, а не заменяется пустой строкой, поэтому автор comment "Created by", записанный Excel, сохраняется при повторном сохранении workbook в HotXLS
Версия 2.88.34
Изменено
- OfficeArt FOPT options для shapes теперь доступны через низкоуровневый option bag.
TXLSShape.OfficeArtOptionsпозволяет опытным вызывающим сторонам проверять, задавать и удалять любой сохраненный FOPT PID какLongWordилиWideString, при этом существующие high-level APILine,Fill, цвета и видимости остаются без изменений
Версия 2.88.33
Изменено
- Дополнительные записи правил в OfficeArt solver-container теперь сохраняются при round-trip. Помимо типизированного
msofbtConnectorRule($F012), HotXLS теперь сохраняет solver children, которые не являются folders, напримерOfficeArtFArcRule($F014) иOfficeArtFCalloutRule($F017), как исходные записи OfficeArt внутриmsofbtSolverContainer($F005), поэтому сложные рисунки Excel больше не теряют не-connector solver relationships при сохранении
Версия 2.88.32
Изменено
- Маркеры OfficeArt ClientData больше не дублируются после сохранения неизвестных записей. MS-XLS определяет
OfficeArtClientData($F011) как маркер нулевой длины; следующийObjостается отдельной BIFF-записью. v2.88.32 распознает этот маркер вместо захвата его как неизвестного leaf в SpContainer, поэтому разобранные shape при сохранении выводят ровно один маркер $F011. Неспецификационные container-style предположения не попадают в XLS-путь
Версия 2.88.31
Изменено
- Правила соединителей OfficeArt теперь проходят round-trip. Рисунки .xls, созданные Excel, хранят привязки соединителей в
msofbtSolverContainer($F005) с дочерними записямиmsofbtConnectorRule($F012). v2.88.31 разбирает и записывает эту пару $F005/$F012 черезTMsoConnectorRules, сохраняя начальную shape, конечную shape, shape-соединитель и точки подключения при save/reload. Предыдущая audit note указывала $F121, но MS-ODRAW определяетOfficeArtFConnectorRuleкак $F012
Версия 2.88.30
Изменено
- Нераспознанные leaf-записи OfficeArt SpContainer теперь проходят round-trip. Файлы .xls, созданные Excel, часто содержат в SpContainer каждой shape leaf Fbt, такие как
msofbtClientTextbox($F00D),OfficeArtFPSPL($F11D), andOfficeArtUDefProp($F122). v2.88.30 сохраняет неизвестные shape-level leaf какTMsoFbtUnknownи повторно выводит их в порядке parse междуClientAnchorи завершающим zero-body markermsofbtClientData - Область и продолжение. Другие drawing-level unknown leaf остаются отложенными; случай solver-container для connector rules обработан в v2.88.31. Container-form unknowns, например
msofbtClientData($F011), используемый как container вместо sibling marker, остаются для audit-round Slice 3
Версия 2.88.29
Добавлено
- Поведение "проглотить все" FtLbsData ограничивает область. Существующий case
$0013перезаписываетRecLen := Len - offs, чтобы поглотить все байты после заголовка FtLbsData в blobFObjRec_LBSData, поэтому подзаписи, появляющиеся ПОСЛЕ FtLbsData (обычно только FtEnd), по-прежнему делают round-trip через этот механизм без изменений. Новая интеграция FObjTailRaw специально нацелена на пробел перед FtLbsData, где обычно живут FtMacro и ObjLinkFmla. Недавно созданные comb / list box через Drawing API имеют пустойFObjTailRaw→ побайтно идентичный вывод по сравнению с v2.88.28
Удалено
- Неизвестные подзаписи OBJ ComboBox и ListBox теперь делают round-trip. TMSOShapeComboBox.ParseObj и TMSOShapeListBox.ParseObj уже typed-парсили FtSbs ($000C), FtSbsFmla ($000E) и FtLbsData ($0013) в выделенные поля, но любая другая подзапись из исходного файла (FtMacro $0004, ObjLinkFmla, FtNts $000D и т.д.), появляющаяся между CMO и FtLbsData, молча отбрасывалась в case fall-through. v2.88.29 добавляет ту же else-ветвь, что и v2.88.28 Picture, захватывая 4-байтный заголовок + тело неизвестной подзаписи в
FObjTailRaw. Оба метода AddObj выдают захваченные байты между телом CMO и подзаписью FtSbs, чтобы соответствовать порядку подзаписей спецификации BIFF8
Версия 2.88.28
Добавлено
- Шаблон сосуществования typed + raw. В отличие от PictureFrame (v2.88.27), который использовал обмен if/else между типизированной и сырой эмиссией, Picture объединяет оба: типизированные поля сохраняют поверхность API (вызывающие по-прежнему могут регулировать
ftCfValueи т.д.), а сырой хвост сохраняет только неизвестные байты. Недавно созданные изображения через Drawing API имеют пустойFObjTailRaw, поэтому вывод побайтно идентичен v2.88.27
Удалено
- Неизвестные подзаписи OBJ формы Picture теперь делают round-trip. TMSOShapePicture.ParseObj уже typed-парсил FtCf ($0007), FtPioGrbit ($0008) и FtPictFmla ($0009) в выделенные поля, но любая другая подзапись из исходного файла (FtMacro $0004, FtNts $000D и т.д.) молча отбрасывалась в case fall-through. v2.88.28 добавляет else-ветвь, которая добавляет полный 4-байтный заголовок + тело нераспознанных подзаписей в
FObjTailRaw; TMSOShapePicture.AddObj затем выдает эти байты дословно после своего вывода типизированных подзаписей и перед маркером FtEnd. Объекты picture из исходного файла с хуками макросов переживают пересохранение
Версия 2.88.27
Добавлено
- Round-trip завершающих подзаписей OBJ расширен на формы PictureFrame. TMSOShapePictureFrame.AddObj ранее выдавал только унаследованные жестко закодированные подзаписи FtCf ($0007, тело $FFFF) и FtPioGrbit ($0008, тело $0000) между CMO и FtEnd. Для недавно созданных рамок изображения новый код по-прежнему выдает эти значения по умолчанию; для рамок изображения, проанализированных из исходного .xls, захваченные байты
FObjTailRawвыдаются дословно вместо этого, сохраняя любой FtPictFmla исходного файла / нестандартный FtCf / нестандартный FtPioGrbit содержимое через цикл сохранения
Исправлено
- Заметка по расследованию — Flush автоматически корректирует sz.
TMsoShapeContainer.Flushперезаписывает заголовок размера записи Obj во время коммита черезData.SetWord(Data.DataLength - 4, 2), что означает, что жестко закодированные значенияsz := $1A, которые годами жили в реализациях AddObj HotXLS, в конце концов не были багами спецификации — Flush автоматически их корректирует. v2.88.27 по-прежнему точно вычисляет sz для ясности исходного кода, но поведение во время выполнения с этой точки зрения не изменено
Версия 2.88.26
Добавлено
- Round-trip завершающих подзаписей OBJ расширен на формы Chart и CheckBox. v2.88.25 ввела сохранение сырых байтов между CMO ($0015) записи Obj и её маркером FtEnd ($0000), но только TMSOShapeTextBox.AddObj выдавал захваченный хвост. В этом релизе тот же паттерн применен к TMSOShapeChart.AddObj и TMSOShapeCheckBox.AddObj — оба разделяют простую структуру эмиссии "CMO + FtEnd" TextBox, поэтому изменение представляет собой однострочную замену переменной (
sz := $1A + Word(Length(FObjTailRaw))) плюс цикл побайтной эмиссии перед маркером FtEnd
Изменено
- Завершающие подзаписи Chart (например FtMacro для макросов встроенных объектов chart) и подзаписи состояния checkbox (FtCbls + FtCblsData + ObjLinkFmla, MS-XLS §2.5.140-141 / §2.5.149) теперь переживают цикл сохранение/перезагрузка HotXLS. Свеже-созданные charts и checkboxes через Drawing API продолжают выдавать стандартные 26-байтные CMO+FtEnd (побайтно идентичные v2.88.25), поэтому существующие вызывающие не видят изменений поведения. Формы Picture / ComboBox / ListBox / PictureFrame имеют собственную динамическую эмиссию типизированных подзаписей, конфликтующую с FObjTailRaw — их интеграция отложена до будущих коммитов
Версия 2.88.25
Добавлено
- Захват в общей базе, эмиссия только в TextBox (R5-3 первый этап). TMsoShapeContainer.ParseObj теперь захватывает диапазон байтов между концом тела CMO и маркером FtEnd в новое внутреннее поле
FObjTailRaw: TBytes; TMSOShapeTextBox.AddObj вставляет эти байты между своей эмиссией CMO и маркером FtEnd, с соответствующим изменением размера заголовка записи Obj. Вновь созданные примечания (без исходных байтов) сохраняют побайтно идентичный вывод по сравнению с v2.88.24. Другие классы форм (Picture / CheckBox / ComboBox / ListBox / Chart) наследуют захват, но их типизированные переопределения AddObj сохраняют унаследованное поведение "синтезировать с нуля" — эмиссия сырых байтов для этих типов форм отложена до будущих коммитов
Изменено
- Завершающие подзаписи записи OBJ теперь сохраняются через цикл сохранения для примечаний. Запись BIFF8 Obj ($005D) объединяет последовательность типизированных подзаписей после обязательной CMO ($0015), завершаемую маркером FtEnd ($0000) согласно MS-XLS §2.4.181. Для форм Note (примечание) завершающий блок обычно представляет собой 26-байтный FtNts (§2.5.149), несущий GUID и флаг fSharedNote — оба необходимы, когда Excel впоследствии объединяет примечания между пользователями в общих книгах. HotXLS ранее отбрасывал каждый байт после CMO при чтении и выдавал только пустой FtEnd при записи, поэтому любой FtNts из исходного файла терялся при каждом пересохранении HotXLS
Версия 2.88.24
Добавлено
- Побайтное сохранение в TMSOShapeTextBox. ParseTXO захватывает байты Continue после текста дословно в новое внутреннее поле
FFormatRunsRaw: TBytes; Store выдает их обратно как Continue прогонов форматирования и корректирует заголовокcbRunsбазовой записи для соответствия. Вновь созданные примечания (черезAddComment) сохраняют наследуемый вывод единственного прогона по умолчанию без изменений, так что побайтно идентичный вывод сохраняется для книг по умолчанию. Типизированный доступ Excel API к отдельным прогонам форматирования по-прежнему отложен — существующий API единого WideString примечания не изменен
Изменено
- Многошрифтовые и многоцветные примечания к ячейкам теперь сохраняются через цикл сохранения. Блок прогонов форматирования записи BIFF8 TXO (
rgTxoRuns+TxOLastRunсогласно MS-XLS §2.5.272) несет переопределения шрифта и цвета по прогону, которые придают примечанию стиль форматированного текста. HotXLS ранее отбрасывал весь блок при чтении и выдавал единственный пустой прогон по умолчанию + LastRun при записи — сжимая любой выделенный красным "Важно!" или жирное слово внутри текста примечания до единообразного форматирования по умолчанию после каждого пересохранения HotXLS
Версия 2.88.23
Добавлено
- Три новых свойства TXLSPageSetup.
PrintResolution: LongWord,PrintVResolution: LongWordиCopies: LongWord— все значения по умолчанию соответствуют значениям, ранее жестко закодированным в писателе (600 / 600 / 1), так что книги, не трогающие их, дают побайтно идентичный вывод по сравнению с v2.88.22. Сеттеры ограничиваютсяHigh(Word), так что слишком большое значение от вызывающего не вызывает переполнение при выводе
Удалено
- Разрешение печати и количество копий теперь сохраняются через цикл сохранения — запись Setup полностью покрыта. Три поля Word в записи Setup (
iResпо смещению 12,iVResпо смещению 14,iCopiesпо смещению 32, согласно MS-XLS §2.4.257) несут выбор Excel "Параметры страницы → Страница → Качество печати" и "Число копий". HotXLS ранее отбрасывал все три при чтении и выдавал жестко закодированные значения (600 DPI / 600 DPI / 1 копия), поэтому любое настроенное пользователем разрешение или число копий молча возвращалось после каждого пересохранения HotXLS
Исправлено
- Работа round-trip записи Setup завершена. С этим исправлением каждое видимое пользователю поле записи BIFF8 Setup ($00A1) переживает round-trip от начала до конца — размер бумаги / масштаб / номер первой страницы / по ширине и высоте / ориентация / порядок печати / черно-белая / черновик / печать примечаний / ошибки ячеек / разрешение / копии. Остаются не открытыми только два бита подсказок спецификации (
fNoPls,fNoOrient) — HotXLS пишет оба как ноль, что соответствует поведению Excel по умолчанию
Версия 2.88.22
Добавлено
- Два новых свойства TXLSPageSetup.
UseFirstPageNumber: Booleanотражает бит (False = "Авто", по умолчанию);FirstPageNumber: Integerнесет значение iPageStart (по умолчанию 1, ограниченное сеттером диапазоном signed-Word спецификации -32768..32767). HotXLS выполняет round-tripiPageStartдословно, даже когдаUseFirstPageNumber= False, поэтому переключение между Авто и пользовательским в Excel сохраняет последнее введенное пользователем значение
Удалено
- Пользовательский "Номер первой страницы" в Параметрах страницы теперь сохраняется через цикл сохранения. Запись BIFF8 Setup несет выбор книги Параметры страницы → Страница → "Номер первой страницы" как два связанных поля: бит 7 grbit (
fUsePage) выбирает между значением по умолчанию Excel "Авто" и явным начальным номером страницы, а знаковое Word по смещению 4 (iPageStart) содержит это пользовательское значение согласно MS-XLS §2.4.257. HotXLS ранее отбрасывал оба при чтении и выдавалiPageStart = 1с очищенным битом, поэтому введенный пользователем "Номер первой страницы: 100" молча возвращался к "Авто" после каждого пересохранения HotXLS
Версия 2.88.21
Добавлено
- Новое логическое свойство TXLSPageSetup.PrintNotesAtEnd. По умолчанию
Falseсоответствует значению по умолчанию интерфейса Excel. Читатель и писатель выполняют round-trip бита дословно (даже когдаPrintNotes = False), поэтому книга с временно отключенными примечаниями сохраняет предпочтение "в конце листа" на случай, когда пользователь снова включит их — отражая собственное поведение Excel
Удалено
- Выбор "Печатать примечания в конце листа" теперь сохраняется через цикл сохранения. Бит 9 (
fEndNotesсогласно MS-XLS §2.4.257) поля grbit записи BIFF8 Setup несет различие в выпадающем списке Параметры страницы → Лист → Примечания между "Как на листе" (по умолчанию) и "В конце листа". HotXLS уже выполнял round-trip PrintNotes (бит 5) для управления тем, печатаются ли примечания, но бит 9 отбрасывался при чтении и выдавался как ноль при записи — поэтому выбранное пользователем "В конце листа" молча возвращалось к "Как на листе" после каждого пересохранения HotXLS
Версия 2.88.20
Изменено
- Выбор книги "Задать точность как на экране" теперь сохраняется через цикл сохранения. Запись BIFF8 CalcPrecision ($000E) несет флажок на уровне книги Файл → Параметры → Дополнительно → "Задать точность как на экране" согласно MS-XLS §2.4.35. У HotXLS ранее не было case в диспетчере для $000E, и TXLSWorkbook.StorePrecision выдавал жестко закодированную
1(= полная точность сохранена). Отмеченное пользователем "Задать точность как на экране" молча возвращалось к "полной точности" после каждого пересохранения HotXLS — скрывая намеренное намерение пользователя, чтобы любой последующий пересчет навсегда обрезал значения ячеек до их форматированных десятичных разрядов
Исправлено
- Новое логическое свойство TXLSWorkbook.UseFullPrecision. По умолчанию
True(соответствует значению по умолчанию BIFF8 и значению по умолчанию интерфейса Excel не отмечено). Установка вFalseравносильна выбору разрушающей опции "точность как на экране" — сам HotXLS не обрезает значения ячеек во время цикла сохранения, но флаг теперь верно записывается обратно, так что следующий пересчет Excel будет его учитывать. С этим исправлением каждая запись BIFF8 для вычислений (CalcCount / CalcMode / CalcPrecision / CalcDelta / CalcIter / CalcSaveRecalc) переживает цикл сохранения от начала до конца
Версия 2.88.19
Добавлено
- Новое логическое свойство TXLSWorkbook.RecalcOnSave. По умолчанию
True(соответствует значению по умолчанию интерфейса Excel и наследуемому жестко закодированному значению), поэтому книги, не трогающие свойство, сохраняют побайтно идентичный вывод по сравнению с v2.88.18. Сеттер принимает любое логическое значение; читатель нормализует произвольные ненулевые исходные байты вTrue
Изменено
- Флажок "Пересчитать книгу перед сохранением" теперь сохраняется через цикл сохранения. Запись BIFF8 CalcSaveRecalc ($005F) несет логическое значение книги Файл → Параметры → Сохранение → "Пересчитать книгу перед сохранением" согласно MS-XLS §2.4.37. У HotXLS ранее не было case в диспетчере для $005F, и StoreCalculationSettings выдавал жестко закодированную
1— поэтому отключенный пользователем "пересчет при сохранении" молча включался снова при каждом пересохранении HotXLS, что особенно важно для книг в режиме ручного вычисления, где пользователь намеренно зафиксировал значения ячеек на диске
Версия 2.88.18
Добавлено
- Три новых свойства TXLSWorkbook.
EnableIteration: Booleanотражает флажок;MaxIterations: LongWord— предел итераций (сеттер ограничивает его допустимым диапазоном спецификации 1..32767);MaxIterationChange: Double— дельта сходимости (отрицательный ввод привязывается к значению по умолчанию спецификации 0.001). Значения по умолчанию соответствуют тем, что писатель раньше жестко кодировал, поэтому книги, не трогающие новые свойства, дают побайтно идентичный вывод по сравнению с v2.88.17
Изменено
- Настройки итеративного вычисления (включить + максимум итераций + максимальное изменение) теперь сохраняются через цикл сохранения. Записи BIFF8 CalcIter ($0011), CalcCount ($000C) и CalcDelta ($0010) вместе несут трио параметров "Включить итеративные вычисления" Excel (Файл → Параметры → Формулы) согласно MS-XLS §2.4.33 / §2.4.31 / §2.4.32. Ни у одного из трех не было case в диспетчере раньше, и StoreCalculationSettings выдавал их с жестко закодированными значениями (выкл / 100 / 0.001). Настроенный пользователем цикл из 1000 итераций с дельтой сходимости 0.0001 молча сбрасывался к "итерация выкл, 100, 0.001" после каждого пересохранения HotXLS — ломая формулы с циклическими ссылками и финансовые модели, чувствительные к сходимости
Версия 2.88.17
Добавлено
- Режим вычислений книги (Вручную / Автоматически / Авто кроме таблиц) теперь сохраняется через цикл сохранения. Запись BIFF8 CalcMode ($000D) несет выбор уровня книги "Формулы → Параметры вычислений" согласно MS-XLS §2.4.36. У HotXLS ранее вообще не было case в диспетчере для $000D, поэтому значение исходного файла отбрасывалось при загрузке, и писатель всегда выдавал жестко закодированное
$0001(Автоматически). Выбранный пользователем режим Вручную молча возвращался к Автоматически после каждого пересохранения HotXLS — плохо для больших книг, где Вручную установлено намеренно ради производительности. Новый обработчик ParseCalcMode сохраняет значение источника в книге, и StoreCalculationSettings теперь выдает сохраненное значение вместо константы - Новое свойство TXLSWorkbook.CalculationMode. Свойство
LongWordчтения-записи, принимающееxlCalcManual(0),xlCalcAutomatic(1, по умолчанию) илиxlCalcAutomaticExceptTables(0xFFFF) — три новых константы, экспортированные изlxTNC.inc. Сеттер ограничивает неизвестные значения значением по умолчанию из спецификации, так что поврежденный исходный файл не может оставить книгу в неопределенном состоянии. Существующий код, не трогающий это свойство, сохраняет наследуемое значение по умолчанию ("Автоматически"), прежний вывод побайтно идентичен для книг по умолчанию
Версия 2.88.16
Добавлено
- Новое свойство TXLSPageSetup.PrintCellErrors. Свойство
LongWordчтения-записи, принимающееxlPrintErrorsDisplayed(0, по умолчанию),xlPrintErrorsBlank(1),xlPrintErrorsDash(2) илиxlPrintErrorsNA(3) — четыре новых константы, экспортированные изlxTNC.inc. Существующие вызывающие PageSetup, которые не трогают свойство, сохраняют значение по умолчанию ("показанные"), прежний вывод печати остается без изменений
Удалено
- Выбор "Ошибки ячеек как" в Параметрах страницы теперь сохраняется через цикл сохранения. Запись BIFF8 Setup ($00A1) упаковывает выпадающий список Параметры страницы → Лист "Ошибки ячеек как: показанные / <пусто> / <тире> / <N/A>" в биты 10-11 ее слова grbit как
iErrors, согласно MS-XLS §2.4.257. HotXLS ранее отбрасывал эти биты при чтении и выводил их как ноль при записи, поэтому книга, которую пользователь настроил так, чтобы печатать#DIV/0!как#N/A, молча возвращалась к "показанным" после каждого пересохранения HotXLS. Читатель теперь декодируетiErrorsв новое свойствоTXLSPageSetup.PrintCellErrors, а писатель воссоздает поле на его основе
Версия 2.88.15
Добавлено
- Шесть новых свойств TMSOShapeTextBox для явной стилизации примечаний.
HAlignment,VAlignment,Rotation,LockText,JustLastLineиSecretEditпредоставляются как свойства чтения-записи на каждой фигуре примечания;AddCommentпо умолчанию инициализирует слева+сверху+по горизонтали+разблокировано, поэтому вызывающие, которые их не трогают, сохраняют прежний внешний вид
Удалено
- Выравнивание и ориентация примечаний к ячейкам теперь сохраняются при сохранении. Базовая запись BIFF8 TXO ($01B6) содержит пять типизированных флагов в своем слове
grbit(hAlignment, vAlignment, fLockText, fJustLast, fSecretEdit) и отдельное словоrotдля ориентации текста, согласно MS-XLS §2.4.329. Ранее читатель отбрасывал их все, а писатель фиксировалgrbitна жестко закодированном значении0x0012(слева + сверху) с поворотом всегда 0, поэтому каждое сохранение возвращало центрированное или повернутое примечание к слева+сверху+по горизонтали независимо от источника. Читатель теперь декодирует типизированные поля при загрузке, а писатель составляетgrbitиз них, так что расположение переживает цикл сохранить/перезагрузить
Исправлено
- Писатель TXO теперь располагает reserved4 / reserved5 по границам полей спецификации. Прежний код выдавал смещения 2-9 базовой записи как две записи Long (rot + reserved4, затем reserved5); писатель теперь делит их на
Wordrot,Wordreserved4,Longreserved5 — содержимое байтов не изменилось (для фигур Note по-прежнему все ноль), но структура кода теперь соответствует смещениям полей MS-XLS §2.4.329, что усложняет перепутывание выравнивания будущих исправлений TXO
Версия 2.88.14
Исправлено
- Смещение cchText в TXO исправлено — исправление длины комментариев из v2.88.13 теперь действительно срабатывает. Предыдущий выпуск добавил проверку целостности базовой записи TXO, читая
cchTextпо смещению 8, но MS-XLS §2.4.329 размещаетcchTextпо смещению 10 (после grbit, rot и 6 байт reserved / controlInfo). Смещение 8 попадает внутрь long-поля reserved5, которое для объектов формы Note всегда равно нулю, поэтому каждый комментарий молча соскальзывал в защитный fallback, фактически возвращая поведение до v2.88.13. Исправление возвращает смещение на 10, длинные комментарии теперь действительно сшиваются через записи Continue, а короткие больше не подбирают завершающее заполнение. Других изменений поведения помимо того, что v2.88.13 должен был принести, нет
Версия 2.88.13
Изменено
- Длинные комментарии к ячейкам теперь считываются на полную длину. Запись TXO в BIFF8 ($01B6) делит тело текста между базовой записью и одной или несколькими записями Continue, а количество символов публикуется в базовой записи по смещению 8 как
cchText. Предыдущий читатель комментариев полностью пропускал базовую запись, рассматривал DataList[1] как весь текст и останавливался — комментарий длиннее примерно 4100 широких символов молча обрезался, а более короткий комментарий, у которого запись Continue тянула за собой завершающее заполнение, подбирал этот мусор как текст. Читатель теперь используетcchTextкак авторитетное число символов, обходит каждый сегмент Continue согласно MS-XLS §2.4.329 (разрез rgb сидит на границе символа, поэтому учёт частичных символов не нужен) и останавливается, как только бюджет исчерпан, чтобы блок runs форматирования, идущий после текста, никогда не утекал в строку. Комментарии с повреждёнными или отсутствующими базовыми записями по-прежнему используют легаси-путь "потребить все оставшиеся байты"
Версия 2.88.12
Изменено
- Кэшированные строки длиннее примерно 4100 символов из формул, возвращающих строку, теперь сохраняются при round-trip через записи Continue. v2.88.11 подключил сторону чтения записи String BIFF8 ($0207), но потреблял только тело первой записи. Кэшированная строка, чьи байты UCS-2 превышали лимит BIFF в 8224 байта и переливались в одну или несколько записей Continue ($003C), молча обрезалась. Обработчик теперь обходит весь DataList уровня диспетчеризации: читает cch и fHighByte из базовой записи, копирует тело, которое туда умещается, а затем конкатенирует каждый последующий сегмент Continue как сырые байты согласно гарантии границы символа MS-XLS §2.5.293 — XLUnicodeString никогда не повторно выдаёт fHighByte в середине строки. Каждый сегмент ограничен оставшимся бюджетом символов, поэтому случайно увеличенный Continue не может сделать результат длиннее cch. Строки в одной записи (обычный случай) идут точно по тому же быстрому пути, что и раньше
Версия 2.88.11
Исправлено
- Формулы, возвращающие строку, теперь сохраняют при round-trip кэшированный текст, вычисленный Excel. Предыдущий выпуск охватывал варианты число, булево, ошибка и пусто кэша BIFF8 FormulaValue (MS-XLS §2.5.133), но оставил строковый вариант в списке дел, потому что его кэшированное значение лежит в отдельной записи String ($0207), которая идёт сразу после записи Formula. ParseFormula теперь запоминает координаты ячейки, когда видит Formula строкового варианта, а новый обработчик ParseString декодирует следующую запись $0207 согласно MS-XLS §2.4.268 и направляет WideString в
FCachedFormulaValue.GetCellValueтеперь может откатываться к тексту, вычисленному Excel, когда evaluator HotXLS не может его воспроизвести. Защитный сброс в начале ParseFormula отбрасывает любой устаревший ожидающий якорь, чтобы повреждённый исходный файл с отсутствующей записью String не мог направить последующую неправильно. Записи длиннее 8224 байт, переполняющиеся в блоки Continue, продолжают откатываться к выводу evaluator как известное ограничение
Версия 2.88.10
Добавлено
- Записи Formula в BIFF8 теперь сохраняют при round-trip кэшированное значение, вычисленное Excel. Раньше ParseFormula полностью пропускал 8-байтовую полезную нагрузку FormulaValue по смещению 6, поэтому кэшированный результат каждой формулы в загружаемом .xls (числа, булевы, ошибки, пусто) отбрасывался и HotXLS приходилось пересчитывать каждую ячейку собственным движком формул. Когда этот движок не мог совпасть с Excel (неподдерживаемые XLM-функции, сломанные внешние ссылки, ещё не реализованные формулы), ячейка молча становилась пустой или показывала 0. Читатель теперь декодирует четыре варианта число / булево / ошибка / пусто согласно MS-XLS §2.5.133 и сохраняет их в новом поле
TXLSCellRef.FCachedFormulaValue;GetCellValueоткатывается к этому кэшу только когда вычисление не удалось, поэтому только что созданные формулы по-прежнему проходят через вычисление. Строковый вариант продолжает зависеть от вычислителя, потому что парсер следующей записи String ($0207) ещё не подключён
Версия 2.88.9
Исправлено
- Записи Formula в BIFF8 с неразрешимыми значениями теперь устанавливают fAlwaysCalc вместо бита reserved1. Когда evaluator HotXLS не мог вычислить формулу при сохранении, писатель ранее ставил
grbit = 0x0002— бит 1, который MS-XLS §2.4.127 резервирует и требует от читателей игнорировать. Excel должным образом игнорировал его, считал значение 0 в кэше авторитетным и молча показывал 0 вместо пересчёта. Писатель теперь ставитgrbit = 0x0001(fAlwaysCalc, бит 0), поэтому Excel перезапускает формулу при следующем пересчёте и ячейка показывает правильный результат
Версия 2.88.8
Исправлено
- PageSetup.PrintTitleColumns и PrintTitleRows теперь выбрасывают исключение при некорректном вводе. Присвоение этим свойствам некорректной строки диапазона (любого, что
ColDiapasonToValuesилиRowDiapasonToValuesне могли разобрать) раньше молча отбрасывало присваивание — книга сохраняла прежний диапазон Print_Titles или оставалась без диапазона, и вызывающий код не мог узнать, что что-то пошло не так. Сеттеры теперь вызываютException.Createс описательным сообщением, указывающим ошибочное значение, в соответствии с существующим стилем raise на путях недопустимого индексаTXLSRange
Версия 2.88.7
Добавлено
- Добавлена заметка об опечатке для раунда 2 аудита спецификации BIFF8. Повторная проверка границ полей [MS-XLS] прояснила, что две находки, помеченные как P2 в исходном отчёте (
dev-notes/XLS-BIFF8-Spec-Audit-Round2.md), не являются настоящими ошибками: установленный бит 15 во флаге истории BOF $000080C9 принадлежит полю verXLHigh (биты 14-17, значение 2 = "Excel 2002"), а не хвосту reserved1 (биты 19-31); а использование ParseFormula ведущего токена PtgExp для обнаружения общих или массивных формул соответствует тому, что подразумевает спецификация, и корректно устраняет неоднозначность через следующую запись ShrFmla или Array. Оба пункта теперь помечены как отозванные
Удалено
- Поле miyRw записи Row теперь остаётся в пределах диапазона спецификации MS-XLS. Версии Excel до BIFF8 кодировали "использовать высоту строки по умолчанию для книги", выполняя OR бита 15 в miyRw, и HotXLS перенёс этот идиом в BIFF8-писатель, хотя MS-XLS §2.4.221 ограничивает miyRw 8192 твипами. Современный Excel в том же случае выводит обычное 255 (12,75 пт по умолчанию) и сигнализирует ручные переопределения через бит fUnsynced в grbit, поэтому хак с битом 15 заставлял вывод HotXLS отличаться от авторитетных файлов .xls (значение 32 959 = 0x80FF для "по умолчанию" технически выходило за рамки спецификации). Писатель теперь не делает OR и записывает 255 напрямую; читатель по-прежнему снимает бит 15 при вводе для обратной совместимости с HotXLS v2.88.6 и более ранними файлами, а также с редкими сторонними генераторами, скопировавшими идиом BIFF5
Версия 2.88.6
Исправлено
- Листы макросов и модули VBA теперь сохраняют свой порядковый слот BoundSheet8. Читатель раньше отбрасывал записи BoundSheet8 с полем
dt, равным 1 (лист макроса) или 6 (модуль VBA), поэтому коллекция Sheets в HotXLS лишалась этих записей. Любая перекрёстная ссылка XTI в ExternSheet, указывавшая в порядке файла на позицию листа за листом макроса, после SaveAs разрешалась в неправильный лист HotXLS. Читатель теперь добавляет лист-заглушку для каждой записи BoundSheet8 и сохраняет сырой байтdtв новом свойствеSheet.SheetTypeRaw; писатель снова выдаёт исходный байт. Записи BOF подпотока макроса ($0040) при разборе тоже трактуются как подпоток рабочего листа, поэтому ячейки внутри листов макросов сохраняются, а не молча поглощаются предыдущим листом
Версия 2.88.5
Удалено
- Запись Row BIFF8 теперь сохраняет fCollapsed, fExAsc, fExDes и fPhonetic при round-trip. Раньше читатель отбрасывал fCollapsed (бит 4 grbit), а писатель выводил его из переходов уровня структуры на соседних строках, неверно классифицируя строки, явно свёрнутые или помеченные как границы исходным файлом. Три верхних бита (fExAsc на 28, fExDes на 29, fPhonetic на 30) также не читались и всегда выводились как ноль, потому что писатель усекал 4-байтовый grbit до единственного 16-битного слота ixfe. Читатель теперь потребляет все четыре бита согласно MS-XLS §2.4.221 и фиксирует fCollapsed как explicit. Писатель упаковывает ExAsc, ExDes и Phonetic в биты 12-14 слова ixfe и маскирует ixfe до разрешённого спецификацией 12-битного диапазона. Подсказки толстой верхней или средней нижней границы, управляемые ExAsc и ExDes, теперь переживают HotXLS SaveAs, а видимость фонетической информации на японских листах перестаёт сбрасываться при каждом сохранении
Версия 2.88.4
Исправлено
- Бит fPaged в BIFF8 Window2 теперь помечает только активный лист. В предыдущих выпусках
fPaged(MS-XLS §2.4.346 бит 10) устанавливался на каждом видимом листе, из-за чего вывод HotXLS отличался от того, что пишет сам Excel (согласно спецификации бит означает "этот лист в данный момент отображается в окне книги", поэтому его должен нести только подпоток активного листа). Excel в любом случае откатывался кWindow1.itabCur, чтобы определить настоящий активный лист, так что злоупотребление допускалось; Apache POI в строгом режиме и другие инструменты, доверяющиеfPagedкак основному сигналу, теперь видят правильно помеченный лист
Версия 2.88.3
Удалено
- Масштаб и цвет линий сетки BIFF8 Window2 теперь сохраняются при round-trip. В предыдущих выпусках при чтении отбрасывались все поля WINDOW2 после смещения 6, а при записи выдавались жёстко заданные нули, поэтому любой сохранённый в Excel масштаб листа (75 процентов, 125 процентов и т. д.) и пользовательский цвет линий сетки возвращались к значениям по умолчанию после HotXLS SaveAs. Читатель теперь потребляет
icvHdr,wScaleSLVиwScaleNormalсогласно MS-XLS §2.4.346: масштаб активного вида попадает вSheet.Zoom, а значение противоположного вида ложится в кэш-слот, так что переключение между Normal и Page Break Preview в Excel восстанавливает прежний масштаб. Писатель выдаёт активныйSheet.Zoomв соответствующий слот вида и кэшированное значение в другой, плюс сохранённый индекс цвета линий сетки
Версия 2.88.2
Исправлено
- Исправлен опкод записи HFPicture в BIFF8. Сохраняемые файлы .xls теперь записывают записи фонового изображения колонтитулов с корректным
rt = 0x0866согласно MS-XLS §2.4.138. В предыдущих выпусках использовалось0x086C(опкод CellWatch), из-за чего Excel пытался разобрать встроенный OfficeArt BLIP как ссылку на отслеживаемую ячейку и молча отбрасывал изображение. Книги с изображениями колонтитулов теперь сохраняют изображение при round-trip через HotXLS
Версия 2.88.1
Исправлено
- Исправлен опкод записи Theme в BIFF8. Сохраняемые файлы .xls теперь записывают запись Theme с корректным
frtHeader.rt = 0x0896согласно MS-XLS §2.4.326. В предыдущих выпусках использовалось0x0892(опкод StyleExt), из-за чего Excel интерпретировал встроенную полезную нагрузку OOXML-темы как расширение стиля ячейки и молча возвращался к встроенной теме Office. Книги с настроенными цветами темы теперь сохраняют пользовательскую палитру при round-trip через HotXLS
Версия 2.88.0
Добавлено
- Сохранённые пакеты .xlsx теперь включают часть xl/theme/theme1.xml. styles.xml has always emitted
<color theme="N"/>references for any font / fill / border / tab color set through the theme-index path (and for theme colors carried through from a parsed input .xlsx), but no theme part was written, so the references dangled. Excel tolerated the omission by falling back to its built-in “Office” theme silently, but Office File Validation flagged every reference as “theme part missing” and Apache POI strict mode rejected the workbook on first lookup.SaveAsnow emits the canonical Office (2007+) theme: 12-slot color scheme (systemwindowText/window, four Excel default colors, six accents, two hyperlink colors), Calibri Light / Calibri font scheme, minimum-valid format scheme (three fill / line / effect / background-fill entries each perCT_StyleMatrix).[Content_Types].xmlgains a matchingOverride;xl/_rels/workbook.xml.relsgains atheme/theme1.xmlrelationship that lands at the tail of the rid range, so existingXlsxFirstExternalLinkRidoffsets for sheets / sst / styles / vba / externalLinks are unchanged - Прямое присваивание Sheet.Name := '...' теперь тоже очищает имя и устраняет дубликаты. Round 3 (v2.54.1) added Excel naming-rule enforcement in
TXLSXSheets.Add(AName), but theTXLSXWorksheet.Nameproperty setter was a rawwrite FName, so the most common mutation path that round didn’t cover —lxXlsxExport.pas:122 Target.Name := Source.Namein the XLS → XLSX round-trip — let through any name the BIFF8 source happened to carry (forbidden chars: \ / ? * [ ], length > 31, surrounding single quotes, reservedHistory, case-insensitive duplicates of an existing sheet). The property setter now routes through a newSetNamemethod that replays the sameXlsxSanitizeSheetName+' (N)'-suffix dedup logic (case-insensitive, exclude-self) against the parent workbook’s sheet collection. Detached worksheets (noFWorkbookback-pointer yet) skip the dedup step and just sanitise —TXLSXSheets.Addwill enforce uniqueness when the sheet attaches. Idempotent on already-valid names so reader-sideFSheets.Add(names[i])stays a pure round-trip
Исправлено
- [MS-XLSX] кросс-аудит, раунд 4 — часть темы и метод установки имени листа. Two follow-up fixes targeting issues left after rounds 1–3 (v2.51.0 / v2.52.0 / v2.54.1). Neither breaks an existing call site; one extends behavior at a setter, the other adds a new always-emitted part
Версия 2.87.4
Изменено
- Общие формулы XLS теперь записывают корректное тело
ShrFmla. Вывод BIFF8 добавляет обязательный байтcUseперед общей формулой, поэтому приUseSharedFormulasпоток токенов больше не смещается на один байт - Метаданные стиля и фильтра таблиц XLS теперь соответствуют текущей структуре MS-XLS.
AddTableзаписываетLIST12какList12TableStyleClientInfo, задает флаги AutoFilter вFeature11и выводит пустые блокиFeat11FdaAutoFilterдля столбцов - Правила BIFF8 CF12 Data Bar / Color Scale / Icon Set больше не записывают запрещенный DXF payload. HotXLS оставляет блок DXF пустым, как требует MS-XLS, а настройки сохраняет в хвосте CF12 для соответствующего типа
Версия 2.87.3
Удалено
- Метаданные таблицы листа XLS теперь следуют макету таблицы Feature11 из MS-XLS.
AddTableoutput for .xls files now writes aFeatHdr11table header plusFeature11TableFeatureType/Feat11FieldDataItempayloads, removes the legacy$0867 FeatHdrtable marker, and stores table and column names asXLUnicodeStringvalues
Исправлено
- Чтение таблицы XLS теперь понимает корректный по спецификации макет полей. HotXLS parses
TableFeatureTypetable names, ranges, totals-row state, and field captions, while keeping a fallback for older HotXLS-generated table records
Версия 2.87.2
Исправлено
- Записи продолжения BIFF8 в XLS теперь содержат корректные базовые длины. Oversize XLS records split by the writer now update the first record length to 8224 bytes instead of leaving the original oversized length in the BIFF header
- Большие таблицы листа XLS теперь используют корректные по спецификации фрагменты ContinueFrt11. Wide
AddTableoutputs with largeFeature11payloads now save with$0875 ContinueFrt11continuation records and reopen with table metadata preserved, matching the [MS-XLS]Feature11/ContinueFrt11layout
Версия 2.87.1
Изменено
- Ограничение сетки листа XLSX теперь включает последнюю строку и последний столбец Excel.
TXLSXRange,RCRange,EntireRow, andEntireColumnnow allow row 1048576 and column 16384 (XFD), matching [MS-XLSX] row-number and column-number bounds. Earlier the internal clamp used zero-based maxima, soXFD1048576and ranges touching the last row or last column were silently clipped to the previous row/column
Исправлено
- Документация и тесты по шифрованию XLSX теперь совпадают с реализованным путём записи. Help pages and the regression suite now state that
SaveAsEncryptedwrites ECMA-376 Standard Encryption output for non-empty passwords, whileOpenEncryptedstill raises for encrypted packages and falls back for plain .xlsx files
Версия 2.87.0
Исправлено
- Сохранение XLSX с паролем теперь работает (волна J, фаза 2, бэклог #29).
TXLSXWorkbook.SaveAsEncrypted(FileName, Password)now writes a real ECMA-376 Standard Encryption-protected .xlsx file (Office 2007+ format). The complete [MS-OFFCRYPTO] §2.3.4 pipeline is in place: phase 1's SHA-1 50000-iteration password derivation + AES-128 verifier blocks + AES-CBC package body encryption + binaryEncryptionInfoserializer is now joined by phase 2's four\005DataSpacesmetadata streams (Version / DataSpaceMap / DataSpaceInfo / TransformInfo) and the OLE Compound File Binary writer that drops everything into a CFB container Excel opens with the user password. Workflow: caller invokesSaveAsEncryptedwith a non-empty password → HotXLS serialises the workbook into an in-memory plaintext .xlsx zip → encrypts via AES-128 CBC with a fresh random 16-byte salt and verifier → writes the CFB output viaStgCreateDocfile. Open in Excel 2007+: enters password → content opens. Wrong password: rejected.OpenEncrypted(decrypt side) is still a separate backlog item and continues to raiseEXlsxEncryptionNotImplementedwhen handed an encrypted file
Версия 2.86.1
Добавлено
- XLSX Standard Encryption — криптографическая основа (волна J, фаза 1, бэклог #29). Two new internal units land the cipher and key-derivation half of the ECMA-376 Standard Encryption write path.
lxAES.paswraps Brian Gladman's AES (linked fromthirdparty/Win32/aes*.obj+thirdparty/Win64/aes*.obj) and exposes AES-128 ECB single-block and AES-128 CBC encryption entry points.lxXlsxStdEncrypt.pasimplements pure-Pascal SHA-1 (FIPS-180-4), the [MS-OFFCRYPTO] §2.3.4.10 50000-iteration password derivation, the §2.3.4.7 verifier blocks (EncryptedVerifier+EncryptedVerifierHash), AES-CBC package body encryption (8-byte LE size prefix + zero-pad to 16-byte boundary + IV-of-zeros), and the §2.3.4.6 binaryEncryptionInfoserializer.TXLSXWorkbook.SaveAsEncryptedstill raisesEXlsxEncryptionNotImplemented— wave J phase 2 will add the OLE Compound File Binary writer (\005DataSpacescontainer streams) and wire the pipeline toSaveAsEncrypted. Until then, the new units are library-internal scaffolding callers should not depend on
Версия 2.86.0
Удалено
- QueryTable и внешнее подключение данных теперь проходят сохранение и открытие (волна I, бэклог #28). Excel-created QueryTables and external data connections (Data → Get External Data from Web / SQL / OLEDB) now survive a HotXLS save/open cycle. Earlier the BIFF8 reader silently skipped
QsiSXTag($0802),QsiSXTagExt($0810), andDConn($0876), so the metadata that describes the upstream query was dropped on save and the table degraded to plain cell values. The reader now captures these records as opaque bytes and the writer emits them back into the worksheet substream (alongside the PIVOTVIEW block per [MS-XLS] §2.1.7.20.5) and the workbook globals (alongside the late globals block before EOF per §2.1.7.20.3). HotXLS still does not model the typed QSI / DConn structure programmatically — creating new QueryTables from caller code is deferred to a later wave — but workbooks that already contain them no longer lose refresh metadata. BIFF8 (.xls) only; BIFF5 unaffected
Версия 2.85.1
Изменено
- Восстановлена сборка библиотеки Win32 / Win64. Two pivot-line-item helper variables in the wave H5.3 multi-data-field SXLI emitter were declared as separate
array of array of Wordanonymous types, which the Delphi compiler treats as distinct unnamed types and rejects on direct assignment withE2008 Incompatible types. The HotXLS library has not built since v2.84.1 on RAD Studio 12.0 through 37.0. The two variables are now declared together so they share a single anonymous type, fixing the assignment and restoring the .dcu / .bpl output for both Win32 and Win64 targets. No runtime behaviour change — the emitted SXLI bytes are identical to v2.85.0
Версия 2.85.0
Изменено
- Типизированный API подытогов сводной таблицы (волна H5.4). The typed
TXLSPivotFieldnow exposes aSubtotals: TXLSPivotSubtotalsset property alongside the existing rawSubtotalMask: Word. Callers can assign e.g.Field.Subtotals := [xlpsSum, xlpsAverage];instead of bit-packing the SXVDgrbitSubfield by hand. Twelve subtotal types are exposed (xlpsDefault, xlpsSum, xlpsCount/CountA, xlpsAverage, xlpsMax, xlpsMin, xlpsProduct, xlpsCountNums, xlpsStdDev, xlpsStdDevP, xlpsVar, xlpsVarP), each mapping to a single bit per [MS-XLS] §2.4.279. The rawSubtotalMaskstays the round-trip source of truth — reserved bits 12-15 are preserved on read/write. Closes the wave H4.3 known limit “row field subtotal SXVD.grbitSub configuration unavailable from API” and finishes the wave H5 pivot follow-ups
Версия 2.84.1
Добавлено
- Расширение SXLI для нескольких полей данных (волна H5.3). When a pivot table has more than one data field AND the data-field axis matches a given SXLI axis (
DataFieldAxisIsRow = True&& row axis, orDataFieldAxisIsRow = False&& column axis), the writer now replicates each cartesian-product combinationDataFieldCounttimes withiData = 0 .. DataFieldCount - 1, plusDataFieldCountgrand-total lines so each data field gets its own total. The non-hosting axis is unchanged. Excel and other readers now render multi-data-field pivots in the layout the caller intended instead of falling back on the previous “singleiData = 0per combination” approximation. Single-data-field pivots emit bit-identical output to v2.84.0. Delta compression (H5.1) folds the repeated combinations down to ~8 bytes per replica, so the expansion adds minimal byte overhead. Closes the wave H4.3 known limit “multi-data-field SXLI not correctly expanded”
Версия 2.84.0
Изменено
- API предварительного выбора оси страниц сводной таблицы (волна H5.2). The typed
TXLSPivotFieldnow carries aPageItemIndexproperty that programmatically-built pivots can set to pre-select a specific cache item on the page-axis filter. DefaultxlPageItemAll(= $7FFD) leaves the filter at “(All)” so callers that never assignPageItemIndexbehave bit-identically to v2.83.2. The SXPI ($00B6) writer readsField.PageItemIndexinstead of hardcoding $7FFD, and the typed reader now populatesPageItemIndexfrom SXPI on Open so callers can inspect the saved page selection. Closes the wave H4.3 known limit “page filter caller-pre-selection unavailable from API”
Версия 2.83.2
Изменено
- Меньшие записи SXLI сводной таблицы за счёт дельта-сжатия (волна H5.1). The pivot writer now delta-compresses SXLI line items using the spec's cSic field — each line's leading cache-item indices that match the previous line in the same SXLI record are folded into a shared-prefix count, and only the trailing indices are emitted. Typical row-axis SXLI records (a few row fields × dozens of items) shrink by 30–60% with no change in semantics. Output is still chunked to stay under the 8224-byte BIFF record limit. The first line of every SXLI record always emits cSic = 0 (record-local, no cross-record back-reference), and the grand-total line is never delta-compressed
Версия 2.83.1
Исправлено
- Цвета заливки, шрифта и границ ячеек, заданные через RGB, теперь проходят сохранение и открытие через .xls. The BIFF8 XFExt ($087D) writer was emitting each record's ixfe field using the in-memory XF array position, but the matching cell records on disk write ixfe using the post-pruning SaveIndex order. Whenever any XF earlier in the table was pruned during save (typical when one cell migrates from a transient XF to a final XF), every XFExt's ixfe ended up off by the number of pruned slots, and the rich color associated with each cell shifted to a neighbouring cell on reload. The writer now resolves SaveIndex for each rich-slot XF and emits the matching on-disk ixfe, so RGB cell colors saved by HotXLS — interior fill, font color, border colors — survive a save / reload round-trip cleanly. XFExt records for XFs that got pruned entirely are now skipped rather than emitted with a dangling ixfe
Версия 2.83.0
Изменено
- Элементы строк сводной таблицы и состояние элемента страницы (волна H4.3). Programmatically-built pivot tables now emit SXLI ([MS-XLS] §2.4.275, $00B5) for both row and column axes, plus SXPI ($00B6) for the page axis. This gives the pivot view layout-fidelity: non-Excel readers see the exact display order the writer intended, large pivots open faster (Excel doesn't have to recompute line layout from scratch), and page filters persist with a default "(All)" selection per page field
- Перечисление SXLI по строкам и столбцам. The writer enumerates the cartesian product of axis fields' cache items (innermost field varies fastest, matching Excel's nested-row layout) and emits one line per combination plus a trailing grand-total line marked with the SXLI nTypes fGrandTotal bit. Each line uses cSic = 0 (no delta-compression — simpler at the cost of a few extra bytes per line). Output is chunked into multiple SXLI records when the line count overflows the 8224-byte BIFF limit; a 16384-line safety cap prevents runaway expansion on pathological inputs
- Состояние оси страницы SXPI. Emitted only when at least one field has Axis = xlpfaPageField. Each entry is 10 bytes (isxvd + iCache + ipos + objId) with iCache = $7FFD signalling "(All)" — the API surface for pre-selecting specific page items is deferred to wave H5. Pivots without page fields emit no SXPI (the worksheet ABNF lists it as optional)
- Закрывает известное ограничение волны H3 «SXLI / SXPI не выводятся». Combined with H4.1 (DataField number formats) and H4.2 (SXDBB per-record stream), wave H4 closes all three known limits in the H3 pivot-table writer. Pivot tables built via
IXLSWorksheet.AddPivotTablenow ship self-contained caches with full layout metadata
Версия 2.82.0
Добавлено
- Упаковка битов по спецификации. Each field uses
ceil(log2(itemCount + 1))bits per record (sentinel space included). Records are byte-aligned — every new record starts on a fresh byte boundary. The writer chunks the stream into multiple SXDBB records to stay under the 8224-byte BIFF size limit, so caches with tens of thousands of source rows still serialise cleanly - Путь сохранения и открытия без изменений. Pivot caches read from disk (FromRawBlobs = True) continue to round-trip via the wave H1 raw-byte path — the new SXDBB writer only fires for typed caches built by
IXLSWorksheet.AddPivotTable. Mixed workbooks (one round-tripped cache + one new cache) emit both paths cleanly
Изменено
- Самодостаточный поток кэша сводной таблицы по записям (волна H4.2). Programmatically-built pivot caches now emit SXDBB records ([MS-XLS] §2.4.272, $00C5 in cache context) carrying the per-record field-value indices in the spec's bit-packed encoding. Without SXDBB, Excel had to refresh the cache from the source range on Open — which worked when the source data was present and unchanged, but broke when the source was renamed / deleted or had drifted since the pivot was built. The cache is now self-contained
Версия 2.81.0
Добавлено
- Числовые форматы полей данных сводной таблицы (волна H4.1). Pivot data fields can now carry an Excel number format string so currency / percentage / date data renders with the right glyphs on Open instead of showing raw General-format values. New
IXLSWorksheet.PivotSetDataFieldFormat(DataField, FormatStr): Wordregisters the format in the workbook's NumFormats table (auto-add or reuse) and writes the resulting ifmt index toTXLSPivotDataField.NumberFormat. The typed writer already emits SXDI.ifmt, so this closes the loop - Публичный helper NumFormats для TXLSWorkbook.
Workbook.RegisterNumFormat(FormatStr): Wordexposes the same auto-add behavior at workbook level for callers who need ifmt indices in non-pivot contexts. Empty FormatStr short-circuits to index 0 ('General')
Изменено
- Использование со стороны вызывающего кода
df := pivot.AddDataFieldByName('Revenue', xlpaSum); Sheet.PivotSetDataFieldFormat(df, '$#,##0.00'); df := pivot.AddDataFieldByName('GrowthPct', xlpaAverage); Sheet.PivotSetDataFieldFormat(df, '0.00%');
Версия 2.80.1
Исправлено
- Условные форматы Icon Set корректно проходят сохранение и открытие HotXLS. The v2.49.0 audit changed the CF12 writer to emit
ct=$06for Icon Set rules per [MS-XLS] §2.4.43 (the spec-correct value;$05is reserved for Filter rules), but the matching reader path still only recognised the legacy$05value. As a result, .xls files written by HotXLS v2.49.0..v2.80.0 lost their Icon Set rules on reload — the rule kind degraded to a plain cell-is rule and the icon-set type / Reverse / ShowOnly flags reset to defaults. The reader now accepts both$05(legacy HotXLS pre-v2.49.0) and$06(spec / v2.49.0+) so workbooks from either generation re-open cleanly
Версия 2.80.0
Добавлено
- Programmatic pivot table creation API (wave H3, MAJOR). New
IXLSWorksheet.AddPivotTable(SourceRangeA1, DestRow, DestCol, Name): TXLSPivotTablemethod walks the supplied source range, infers each column's data type from the cell values, auto-builds aTXLSPivotCache(or reuses an existing one bound to the same range), and creates a typed pivot table on the destination sheet with one TXLSPivotField per cache field (axes initially unset) - Путь сохранения и открытия без потери round-trip. Pivot tables and caches read from disk keep their wave H1
FromRawBlobs = Trueflag and continue to round-trip via the raw-byte path. Only the new programmatically created pivots flow through the typed writer. Mixed workbooks (one round-tripped pivot + one new pivot via AddPivotTable) emit both paths cleanly - Ограничения волны H3. Source range types other than rectangular A1 (named ranges, external workbook refs) are out of scope. SXLI / SXPI (line items / page items) are not emitted for typed pivots — Excel computes them on Open. Formatting customisation (data field number format beyond per-field NumberFormat) is exposed as a field but the writer treats it as 0 (general). Multiple pivots sharing a cache are supported but caller must wire the same source range string each time
Изменено
- Вызывающая сторона подключает оси и данные через вспомогательные методы.
pivot.AddRowField('Region'),pivot.AddColumnField('Quarter'),pivot.AddPageField('Year'),pivot.AddDataFieldByName('Revenue', xlpaSum).SetFieldAxis+AddDataFieldare exposed for finer control. Field axis enum: xlpfaRowField / xlpfaColumnField / xlpfaPageField / xlpfaDataField / xlpfaNone. Eleven aggregation functions: Sum, Count, Average, Max, Min, Product, CountNums, StdDev, StdDevP, Var, VarP - Типизированный writer выводит записи SX* и подстрим кэша. When
pivot.FromRawBlobs = False(the default for programmatically created tables), the writer serialises the typed model into SXView ($00B0) + SXVD ($00B1) per field + SXVI ($00B2) per item + SXIVD ($00B4) row/col index arrays + SXDI ($00C5) per data field + SXEx ($00C6) into the worksheet footer. The matching pivot cache (cache.FromRawBlobs = False) emits a fresh BOF (dt=$0006) + SXDB ($00C6) header + SXFDB ($00C8) + SXFDBType ($00FB) + per-item SXSTRING / SXNUM / SXBOOLEAN / SXERR / SXDATETIME / SXEMPTY + EOF substream appended after the worksheet bodies
Версия 2.70.0
Добавлено
- Типизированная модель чтения сводной таблицы (волна H2). Building on the wave H1 raw-byte preservation, the reader now also populates a typed object model so callers can introspect pivot table structure without bytecode parsing. New types —
TXLSPivotTable,TXLSPivotField,TXLSPivotItem,TXLSPivotDataField,TXLSPivotCache,TXLSPivotCacheField,TXLSPivotCacheItem,TXLSPivotCaches,TXLSPivotTables— surface via the newIXLSWorksheet.PivotTablesandTXLSWorkbook.PivotCachesproperties - Новый модуль lxPivot.pas. All pivot types live in their own unit alongside lxChart / lxFormula / lxNames. lxHandle re-exports the public types so existing imports keep working
Изменено
- Что охватывает модель. Per pivot table: position (FirstRow / Col / LastRow / Col / FirstDataRow / FirstDataCol), Name, DataCaption, CacheId, and an ordered list of
Поля(each with Name, Axis ∈ {xlpfaRowField,xlpfaColumnField,xlpfaPageField,xlpfaDataField,xlpfaNone}, Items[], SubtotalMask, CacheFieldIndex). Data axis emits a parallelDataFieldslist, each carrying anAggregationfrom the 11-valueTXLSPivotAggregationenum (xlpaSum / Count / Average / Max / Min / Product / CountNums / StdDev / StdDevP / Var / VarP) - Модель кэша. Each
TXLSPivotCacheholds CacheId, SourceRange (Sheet + 0-based row/col bounds), RecordCount, and a list ofПоля. Each cache field carries its data type (xlpcftNumber / String / Boolean / Error / Empty / DateTime / Mixed), Name, NumberFormat index, and the unique-value Items[]. Per-record indices into each field's Items[] are exposed viaCache.RecordIndices[Record, Field]for programmatically-built caches; round-tripped caches read from disk leave per-record indices unpopulated and rely on the raw-byte path for fidelity - Безопасность round-trip. Pivot tables that came from raw bytes have
FromRawBlobs = True— the writer continues to replay the wave H1 raw blobs verbatim. The typed model is populated as a best-effort projection for caller introspection. The typed-model writer that produces wire bytes from the model is scoped to wave H3 (programmatic AddPivotTable API)
Версия 2.69.0
Изменено
- Блок PIVOTVIEW листа. SX* view records ($00B0–$00B2, $00B4–$00B6, $00C5–$00C8, $00D0–$00D2, $00D5, $00E3, $00F0, $00FB, $0100, $0864) are captured in stream order and emitted in the writer's per-sheet footer (between the Tables block and the trailing EOF), matching the [MS-XLS] §2.1.7.20.1 worksheet ABNF position for PIVOTVIEW. Oversize SXAddl payloads ride through the existing Continue ($003C) splitter the same way HFPicture does
- Подстримы Pivot Cache. BOF (dt=$0006) followed by SXDB / SXFDB / SXFDBType / SXSTRING / SXNUM / SXBOOLEAN / SXERR records up to the matching EOF is captured as one cache bucket; multiple caches in the same workbook each get their own bucket. On save the writer rebuilds the full BOF / records / EOF substream for each captured cache and appends them to the Workbook OLE stream after the per-sheet bodies, where [MS-XLS] §2.1.7.20 expects them
- Область: только сохранение сырых байтов (H1). Wave H1 deliberately does not parse pivot data into a typed model — TXLSPivotTable / TXLSPivotField / TXLSPivotCache and a programmatic AddPivotTable API are scoped to future waves H2 / H3. Until then HotXLS callers can't introspect or modify pivot table structure, but the existing Excel-built pivot tables round-trip through HotXLS without loss
Удалено
- Сохранение round-trip сводной таблицы (волна H1). HotXLS now keeps every record that makes up a pivot table when an Excel-created .xls travels through Open → Save. Before this release, the reader silently dropped unrecognised SX* records (SXView, SXVD, SXVI, SXIVD, SXLI, SXPI, SXDI, SXAddl, etc.) and skipped the entire Pivot Cache substream, so re-saving an Excel pivot file left Excel with broken pivot tables on next Open. The reader now captures all of these as opaque bytes and the writer replays them verbatim, so the pivot table on the cover sheet still renders correctly in Excel after a save / reload cycle
Версия 2.68.0
Добавлено
- Волна F backlog по диаграммам, подфункция 3: полосы ошибок рядов.
TXLSChartSeriesInfogrew anErrorBars: array of TXLSChartErrorBarsInfofield. Each entry produces a SerErrBar record ([MS-XLS] §2.4.105, $105B) inside the parent Series block, after Trendlines and before the Series End, in caller order. A typical column chart with Y error bars uses two entries (Sertm=1 Y+ and Sertm=2 Y-); scatter / bubble charts add X+/X- pairs (Sertm=3 / 4)
Изменено
- Переключатель отрисовки T-cap.
FTeeTopcontrols whether Excel renders T-shaped caps on the bar ends (Excel's visual default = on). Useful when caller wants the more minimal "tick-only" style
Исправлено
- Пять источников значений.
Ebsrcselects 1=percent, 2=fixed value, 3=stddev, 4=stderr, 5=custom.NumValuecarries the magnitude (10.0 = 10% when Ebsrc=1, raw scalar for fixed value, multiplier for stddev). For custom (Ebsrc=5) theCnumfield carries the count of custom data points; spec says MUST=0 for the other sources, so the builder forces non-custom entries to Cnum=0 regardless of caller input - Оговорка о пользовательском ряде значений (Ebsrc=5). The minimal builder emits the SerErrBar record with the chosen Cnum but does not yet emit the supporting BRAI cluster that points at the custom value array. Custom error bars therefore render with default magnitude until a future phase wires up the BRAI follower. Percent / fixed / stddev / stderr (Ebsrc 1..4) are fully functional in this release
Версия 2.67.0
Изменено
- Волна F backlog по диаграммам, подфункция 2: трендлинии рядов.
TXLSChartSeriesInfogrew aTrendlines: array of TXLSChartTrendlineInfofield. Each entry produces a Trendline record ([MS-XLS] §2.4.328, $2050) inside the parent Series block, after SerToCrt and before the Series End, in caller order. Multiple trendlines on a single series are legal and Excel renders them all - Отображение уравнения и R² плюс прогнозирование.
FDispEq/FDispRSqrtoggle the on-chart equation and R² labels.NumForecast/NumBackcastset the forward / backward extrapolation periods (Double, ≥ 0).NumInterceptsets the y-intercept; pass NaN ($7FF8000000000000) for "automatic" - Подпись трендлинии как встроенный LPWideString. The
Namefield is written into the Trendline record's sName slot ([MS-XLS] XLUnicodeString: cch:2 + grbit:1 + UTF-16 body). Empty Name leaves Excel to auto-generate a legend entry like "Linear (Series1)" - Внутренний рефакторинг AddSeries. The internal
AddSerieshelper now takes a singleTPreparedSeriesInforather than the previous (Name, CatArea, ValArea) triple, so future Series-attached records (next phase: error bars) can flow through one parameter without further signature churn
Исправлено
- Шесть типов регрессии.
Regtselects 0=polynomial, 1=exponential, 2=logarithmic, 3=power, 4=moving-average, 5=linear. For polynomial theNOrderfield sets the degree (2..6); for moving-average it sets the period (2..N). For the other typesNOrderis ignored but spec requires 1..6, so the builder defaults zero/out-of-range values to 1 / 6 respectively
Версия 2.66.0
Изменено
- Волна F backlog по диаграммам, подфункция 1: типы 3D-диаграмм. Programmatically built chart sheets can now request
xlsChartType3DColumn,xlsChartType3DBar,xlsChartType3DLine, orxlsChartType3DPieviaAddChartSheet(Name, ChartType, ...). The 3D variants reuse the same on-the-wire BARCHART / LINECHART / PIECHART chart-type record as the 2D variants but the surrounding CHARTFORMAT block now also emits a Chart3d record per [MS-XLS] §2.4.46 to switch Excel into its 3D rendering pipeline - Геометрия 3D по умолчанию повторяет Excel «Insert > 3D Column». 20° rotation, 15° elevation, perspective off, cluster on, autoscale on, height and depth both 100% of width, gap 150%. Walls and right-angle axes match Excel's default. The geometry is hard-coded for now (no caller knob); the next phase can promote it to a record-style override
- 3D Pie пропускает обе оси. The axes-used count and axis emission paths now treat
xlsChartType3DPiethe same asxlsChartTypePie— axes-used = 0, no category / value axis emitted. Without this gate Excel rendered a 3D pie with stray axis lines bleeding through the chart
Удалено
- Chart3DBarShape ($105F) условно восстановлена. v2.55.0 removed the unconditional Chart3DBarShape emission because [MS-XLS] §2.4.47 mandates "MUST be ignored if the current substream does not contain a Chart3d record" and 2D charts don't have one. Wave F restores it for 3D Bar / 3D Column only (riser=rectangle, taper=none), emitted adjacent to Chart3d inside CHARTFORMAT so the spec relationship is visible from the wire layout. 3D Line and 3D Pie still skip it (no riser/taper concept)
Версия 2.65.0
Изменено
- Константы массивов формул проходят round-trip вместе с данными.
PtgArraytokens ($20 / $40 / $60 — V / R / A class) in formula streams now carry theirPtgExtraArraypayload through both read and write paths.SUM({1,2,3}),=MMULT(...),{=COUNTIF(...)}and other array-literal formulas preserve the literal values in.xlsfiles written by HotXLS instead of round-tripping with empty rgcb sections - Данные массива хранятся в дереве синтаксиса.
TXLSSyntaxItemgrewArrayCols/ArrayRows/ArrayValuesproperties (with the matchingTXLSArraySerValrecord describing num / str / bool / err / empty cells per [MS-XLS] §2.5.198.122 SerAr). Tools that walk the syntax tree can introspect array constants directly without needing the separate external-data container - Программное создание литерала массива. Code that builds
TXLSSyntaxItemtrees via the API can populateSA_ARRAYitems withSetArrayDimensions+ArrayValues[i]and HotXLS emits the matching PtgExtraArray in the rgcb section automatically. The wire ordering matches the [MS-XLS] §2.5.198.59 rule that PtgExtraArray entries are sequenced by the position of their PtgArray token in the rgce stream
Исправлено
- Существующий путь чтения по-прежнему корректен для смешанного rgcb. The new code only consumes PtgExtraArray entries that correspond to PtgArray tokens it parsed; any other extra data (e.g. PtgExtraMem from PtgMemArea / PtgMemFunc, still unsupported) is left alone for downstream handling, and a malformed rgcb falls back to leaving array values empty rather than discarding the parsed tree
Версия 2.64.0
Добавлено
- Волна D backlog по диаграммам, фаза 7: получение и установка цвета темы рисунка проходят сохранение и открытие в пределах одного процесса. Phase 5 introduced
XlsApplyThemeColorToDrawingas a set-only helper because BIFF8 OfficeArt is a pre-Office-2007 binary format with no theme color slot on disk. The setter still down-casts to RGB for the on-disk OfficeArt opt blob, but the workbook now also keeps an in-memory side-table that remembers the original theme idx + tint per(TMsoShapeContainer, OfficeArt property id)pair. A newXlsGetDrawingThemeColorreader consults that side-table so the same process can pull back the theme intent it just wrote — useful for in-app render code that wants to highlight theme-driven colors or expose them in property panes. After Save / Open the side-table starts empty again and the getter returns False, falling through toColorFormat.RGB - Новый API вызывающей стороны.
XlsGetDrawingThemeColor(ColorFormat, Workbook, out ThemeIdx, out Tint): Booleanjoins the existingXlsApplyThemeColorToDrawing. The setter signature is unchanged; it now also records the entry intoTXLSWorkbook.FDrawingThemeColors(a dynamic array of records keyed by container pointer + property id). SubsequentXlsApplyThemeColorToDrawingcalls on the same slot overwrite the entry, so the table tracks the latest intent rather than accumulating history - Почему это только round-trip в одном процессе. The BIFF8 OfficeArt format only stores indexed / RGB / scheme / sysColor in its 4-byte ColorRef; there's no extension record analogous to XFExt $087D where the theme idx + tint could live. So the disk round-trip cap is structural, not a HotXLS gap. The Phase 7 side-table bridges the in-process gap so app-internal code can pretend the format supports theme colors as long as it lives within one workbook session
- Стабильная идентичность через новые внутренние свойства.
TXLSColorFormatgrew read-only_Containerand_Pidaccessors so the helpers can compose the side-table key without the caller fishing private fields out of the class. Underscore prefix marks them as the same internal-API tier as_StringTable/_XFList/_BiffTheme: stable enough for library glue code, not part of the public contract
Версия 2.63.0
Добавлено
- Волна D backlog по диаграммам, фаза 6: составные селекторы границ проходят сохранение и открытие RGB / theme через XFExt. The last theme-color known-limit is closed:
Border[xlAround],Border[xlInsideVertical],Border[xlInsideHorizontal], andBorder[xlInsideAll]now register the same RGB or theme color against every physical edge slot they target instead of falling back to the indexed-palette path. The newTXLSXfRichSlotSet(set ofTXLSXfRichSlotID) lifts the pending-rich stash from a single slot to a set, so one cell-loop pass onSetRangeXFBordersPropertyregisters up to four XFExt slots in one go - Отображение составных селекторов. Новый вспомогательный метод
BorderEdgeSlotSet(BorderIndex): TXLSXfRichSlotSetцентрализует перевод селектора в слот:xlEdgeLeft / Right / Top / Bottom→ одноэлементные множества (не изменилось с фазы 2)xlDiagonalDown / Up→[rsDiag](FullColorExt BIFF8 несёт только один цвет диагонали)xlAround→[rsTop, rsBottom, rsLeft, rsRight](внешняя рамка)xlInsideVertical→[rsLeft, rsRight](вертикальные разделители между ячейками)xlInsideHorizontal→[rsTop, rsBottom](горизонтальные разделители)xlInsideAll→[rsTop, rsBottom, rsLeft, rsRight]для всех внутренних границ
Border.SetColorиBorder.SetThemeColorиспользуют одно и то же отображение, поэтому пути RGB и темы ведут себя одинаково для всех селекторов
Изменено
- TXLSBorders.SetColor снова работает через единый диспетч. Phase 2 had to fan
Borders.Color := Vout to four per-edgeGetBorder(edge).Color := Vcalls because the pending-rich stash only carried one slot at a time. With the set form,Borders.SetColornow stashes the full{rsTop, rsBottom, rsLeft, rsRight}set and callsSetColorIndexonce —SetBordersColorIndextakes the optimal wire path (single cells loop with BorderMask=15), andConsumePendingRichSlotregisters all four XFExt slots on each touched XF in the same pass. ~4x fewer cell-loop iterations than the phase-2 fan-out, byte-identical XFExt result - ConsumePendingRichSlot итерирует множество. The slot-registration loop walks the eight enum members and dispatches each one present in
FPendingRichSlotthroughRegisterXFExtSlot. Boundary cells whose XF didn't actually change during a compound-selector update still fire the callback — that's harmless because the XFExt slot is only visually relevant when the cell genuinely has the matching border line, and the indexed wire is set by the per-cellBorderMaskExcel already understands
Версия 2.62.0
Добавлено
- Волна D backlog по диаграммам, фаза 5: round-trip пользовательского XML темы плюс вспомогатель для темы рисунка. Three pieces close the last theme-color gaps that phase 4 left open. Custom theme palettes set in Excel via Page Layout → Colors now survive the load cycle: the parser walks the OOXML
<a:clrScheme>embedded in the BIFF8$0892Theme record and updates the workbook's 12-slotFBiffThemein place. The matching writer emits the same record when the palette has drifted from the default Office scheme, so caller-customised themes round-trip through HotXLS without falling back to defaults. A newXlsApplyThemeColorToDrawinghelper lets chart / shape callers address drawing colors with the same theme idx + tint vocabulary that cells already use - Волна D полностью закрыта в пяти фазах. Phase 1 (v2.58.1) added the case-table acknowledgement, Phase 2 (v2.59.0) wrote XFExt for RGB cell colors, Phase 3 (v2.60.0) closed the RGB reader loop, Phase 4 (v2.61.0) shipped the theme color path on cells, and Phase 5 (this) completes the picture with custom theme XML round-trip plus the drawing-side helper. Cells now match Excel's rendering pixel-for-pixel when round-tripping any combination of palette / RGB / theme colors that the BIFF8 spec can express; drawings carry the visual intent forward through the helper but pay the OfficeArt format's RGB-only price on read-back
Изменено
- Writer: вывод записи Theme с пропуском при значении по умолчанию.
TXLSWorkbook.StoreThemeemits a$0892record only whenIsBiffThemeDefaultreports the palette has drifted from the Office default scheme. The OOXML body is built from a deterministic template: twelve<a:srgbClr>entries (chosen over the Excel-native sysClr form for dk1/lt1 because it round-trips through the same parser without needing a sysColor name resolver), plus the minimal legal<a:fontScheme>/<a:fmtScheme>stanzas the schema requires. Untouched workbooks emit no record and stay byte-compatible with pre-Phase-5 output
Исправлено
- Reader: разбор XML темы OOXML.
ParseThemestitches the record body (frtRefHeaderU + dwThemeVersion + variable-length XML payload, may span Continue records) into a single byte buffer and runs a targeted substring scan for the twelve<a:clrScheme>children (dk1, lt1, dk2, lt2, accent1..6, hlink, folHlink). For each slot it prefers<a:srgbClr val="RRGGBB"/>and falls back to<a:sysClr ... lastClr="RRGGBB"/>, then convertsRRGGBBto the HotXLS COLORREF layout and callsFBiffTheme.SetThemeRGBColor. Bodies that don't look like OOXML (missing<a:clrScheme>sentinel, ZIP-compressed variants, etc.) leave the palette at its default scheme so common renderings stay correct - Вспомогательная функция цвета темы для рисунка. The new free function
XlsApplyThemeColorToDrawing(ColorFormat, Workbook, ThemeIdx, Tint)resolves a theme idx + tint through the workbook palette and writes the resulting RGB onto aTXLSColorFormat(shape fill / line / chart color). BIFF8 OfficeArt is a pre-Office-2007 binary format with no native theme color encoding, so this is set-only: read-back returns the resolved RGB rather than the theme slot, and the round-trip theme reference is lost on disk. For full theme round-trip useIXLSInterior.SetThemeColor/IXLSFont.SetThemeColor/IXLSBorder.SetThemeColoron cells, which leverage XFExt $087D
Версия 2.61.0
Добавлено
- Новый API вызывающей стороны. Five new
SetThemeColorentry points join the existing RGB / index setters:IXLSInterior.SetThemeColor(ThemeIdx, Tint),IXLSInterior.SetPatternThemeColor(ThemeIdx, Tint),IXLSFont.SetThemeColor(ThemeIdx, Tint), andIXLSBorder.SetThemeColor(ThemeIdx, Tint)on each border edge.ThemeIdxis the 0-based theme slot (0=lt1, 1=dk1, 2=lt2, 3=dk2, 4..9=accent1..6, 10=hlink, 11=foHlink);Tintis the spec-style -1.0..+1.0 lighter/darker adjustment that gets encoded into FullColorExt.nTintShade as Q15 signed integer
Изменено
- Запись Theme ($0892) распознаётся при чтении.
lxRead.ParseThemetakes$0892out of the default-skip path so the workbook-globals case table treats it as a known record. The embedded OOXML theme XML body itself is left unparsed for now — the 12 default Office theme colors already match the most common source and Excel-set theme cells render correctly through them. Workbooks with a fully customised theme will surface theme cells through the default palette here (documented known limit; XML-based theme parsing is a follow-up wave) - Почему запись Theme не выводится при записи. HotXLS-saved .xls files don't emit a Theme record. Excel 2007+ falls back to the default Office theme when no $0892 is present, which exactly matches HotXLS's
FBiffThemedefault scheme, so cells usingSetThemeColorrender with the right color in Excel without us having to ship the embedded XML. Files therefore stay smaller and the writer side has no XML-emit dependency
Исправлено
- Волна D backlog по диаграммам, фаза 4: поддержка цвета темы BIFF8 (theme idx + tint через XFExt $087D). Office's 12-slot theme palette (lt1, dk1, lt2, dk2, accent1..6, hlink, foHlink) now round-trips on the .xls side: callers can address theme colors directly with the new
Interior.SetThemeColor(themeIdx, tint)/Interior.SetPatternThemeColor/Font.SetThemeColor/ per-edgeBorder.SetThemeColorAPIs, and the cell color getters resolve the same theme idx + tint back through the workbook's BIFF theme palette when reading. The XF record still receives a best-match indexed icv (so legacy readers like Excel 2003 keep rendering an approximate color), while Excel 2007+ recovers the exact theme intent through the XFExt FullColorExt (xclrType=3) future-extension record — same backward-compatibility trick Microsoft uses when "Save As" downgrades a theme-styled .xlsx to .xls - Палитра тем BIFF книги.
TXLSWorkbooknow carries anFBiffTheme: TXLSThemeColorsinitialised to the default Office theme scheme that the XLSX side has used for years throughTXLSColorManager.FTheme. Cell color getters resolve theme idx + tint through this palette viaGetThemeRGBColor(idx, tint)(which already applies HSL-based tint adjustment inlxRgb.GetRGBTInt). Internal_BiffThemeproperty exposes the palette for parser-side updates
Версия 2.60.0
Добавлено
- Reader: ParseXFExt проходит по ixfe + cexts + rgExt. The parser handles the eight color ExtProp extTypes ($0004 fillFg, $0005 fillBg, $000D font, $0007/$0008/$0009/$000A/$000B for top / bottom / left / right / diagonal borders) and decodes each one's FullColorExt body (xclrType, nTintShade as signed Q15, xclrValue). xclrType 2 (RGB) and 3 (theme) get registered on the workbook side-table against the record's
ixfe; other extTypes ($0006 FillGradient, $000E FontScheme, $000F TextIndent) skip cleanly so a future wave can add them without disturbing this code path. Defensive bounds checks oncbmean a malformed record terminates parsing of its tail without reading past the declared length
Изменено
- Волна D backlog по диаграммам, фаза 3: восстановление RGB / theme на стороне чтения XFExt ($087D) завершает сохранение и открытие. The Phase 1 acknowledgement and Phase 2 emitter are now joined by a parser that actually consumes each
$087Drecord into the workbook XF rich-color side-table. Files saved by Excel with RGB cell colors (fill, font, individual borders) now surface throughcell.Interior.Color/Interior.PatternColor/Font.Color/ per-edgeBorder.Colorat the exact RGB Excel wrote, instead of the indexed-palette approximation HotXLS used to return for the same cells. Wave D is now fully closed in both directions - Волна D закрыта. Save preserves caller-set RGB (Phase 2). Load preserves Excel-set RGB (Phase 3). Workbooks with no rich color information emit the same byte stream as before. The only remaining caveats stay documented as known limits: theme colors still down-grade through the BIFF palette because there is no theme color manager on this side of the codebase, and compound border selectors (
xlAround/xlInside*) tag a single ambiguous side-table slot rather than per-edge — both rare enough to leave for a future wave
Исправлено
- Геттеры цвета ячейки сначала обращаются к side-table. The eight color getters that previously routed straight through the indexed-palette path (
GetCustomColor(GetColorIndex)) now resolve their XF index, queryTlxFormatList.TryGetRichSlotfor the matching rich-color slot, and applynTintShadevia the existingGetRGBTInthelper when the slot carries an RGB value. xclrType=3 (theme) falls through to the indexed path: the BIFF workbook has no theme model on this call chain, so the palette approximation remains the best available answer for theme cells. Cells whose XF was never touched by a Phase 2 setter or a parsed XFExt produce the same byte-identical read result as before
Версия 2.59.0
Изменено
- Волна D backlog по диаграммам, фаза 2: вывод XFExt ($087D) для цветов ячеек BIFF8. When application code sets
cell.Interior.Color := $00FF6633(or any other RGB) on the BIFF8 path, the writer now emits a$087DXFExt record alongside the indexed-palette XF entry so Excel reopens the workbook with the exact RGB the caller passed in, rather than the closest 56-color palette approximation HotXLS used to fall back to. Covers all four cell color surfaces:Interior.Color/Interior.PatternColor/Font.Color/ per-edgeBorder.Color(top / bottom / left / right / diagonal) and the convenienceBorders.Colorwhich now distributes to the four primary edges so each gets its own XFExt slot
Исправлено
- Как сохранение и открытие остаются безопасными. The BIFF8 cell setter chain still produces the indexed-palette XF wire output it always did — readers (HotXLS or anything else) that ignore
$087Dsee the legacy approximation. The XFExt record sits next to the XF and carries the original RGB as a 16-byte FullColorExt (xclrType=2, xclrValue=$00BBGGRR, nTintShade=0) wrapped in an ExtProp with the spec-correct extType for each slot ($0004 fillFg, $0005 fillBg, $000D font, $0007/$0008/$0009/$000A/$000B for top/bottom/left/right/diagonal borders). Cells that never took the color-setter path still emit no XFExt — workbooks with no rich colors produce the same byte stream as before - Хранение и учёт. A new per-XF rich-color side-table in
TlxFormatListholds the original RGB / theme info the cell setter passed in, keyed by the workbook's hash-resolved XF index.TXLSRange.SetXFProperty/SetRangeXFBordersPropertygrew an optionalOnNewIndexcallback so the cell setter can register the rich color against every XF index the cell ends up on (multi-cell ranges that hash to multiple distinct XFs all get tagged). The side-table is consulted inStoreWorkbookright after STYLES and before PALETTE, matching the*XFExtposition in [MS-XLS] §2.1.7.20.3 Workbook Globals ABNF. xlExcel5 output is untouched (BIFF5 has no XFExt record) - Известное ограничение. The reader side stays at the wave-D-phase-1 acknowledgement:
ParseXFExtconsumes$087Drecords from the input stream but does not yet feed the recovered RGB back into the workbook's style objects, because doing so in the hash-keyed style model risks invalidating existing XF entries. Files saved by HotXLS now look correct in Excel; files coming in from Excel still surface the indexed-palette approximation when read back throughcell.Interior.Color. Closing that read-side gap is a separate follow-up (Phase 3) that requires reworking the style hash to admit per-XF rich color before the first hash anchor
Версия 2.58.1
Добавлено
- Волна D backlog по диаграммам (только распознавание на стороне чтения): XFExt ($087D) больше не проходит через путь default-skip. A new
ParseXFExtbranch in the BIFF8 workbook-globals case table consumes$087Drecords that Excel writes alongside RGB and theme-colored cell styles. The reader still leaves the indexed-color XF record unchanged — full RGB / theme precision recovery onto the workbook's hash-key style model is deferred to a separate wave because it would require the BIFF writer-side style classes to grow an RGB / theme color field that doesn't exist today. Files coming from Excel with rich colors continue to load with the indexed approximation HotXLS has always produced, but the spec-conformance gap of "treating$087Das unknown" is closed
Изменено
- Почему не полный охват волны D. The plan envisioned a paired write + read implementation, but exploration found that the BIFF write pipeline (
TXLSWorkbook.FXFList: TlxFormatList) encodes XF style data as a string-key with hex-packed indexed color slots and has no analogue of the XLSX-sideTXLSStyleColor(which carriesColorType/ColorValue/TintAndShade). Adding XFExt emission would mean either bridging the two style models or extendingTlxFormatListwith per-XF rich color side-tables, both of which are larger refactors than a single wave can absorb. The change here therefore stays surgical: lxRead recognises the record, lxStyleXf and lxHandle are unchanged
Версия 2.58.0
Изменено
- Writer добавляет fRichSt / fExtSt + cRun / cbExtRst + rgRun + rgExtRst, когда вся запись помещается в один BIFF-фрагмент.
AddSSTItemnow factors the rich / phonetic tail size into its overflow check; strings whose body + tails fit a single 8224-byte SST chunk emit the full preserved layout, and Excel re-opens the workbook with the original formatting intact. Strings that overflow fall back to plain text without formatting (the splitter would otherwise need to interleave Continue flag bytes with the still-running rgRun byte stream, a state machine the current writer doesn't have); this is the explicit known limitation documented in the wave-C plan and affects only very long rich-formatted strings (> ~4000 wide chars)
Удалено
- Волна C backlog по диаграммам: rich text и phonetic round-trip SST (BIFF8 XLUnicodeRichExtendedString). Rich-text formatting set in Excel (a cell whose individual characters carry their own font / color, the "two colors in one cell" effect from the Format Cells dialog) sits in the shared string table as an
XLUnicodeRichExtendedStringwith an attachedrgRunFormatRun array. Far-East phonetic info (the furigana / hiragana annotation above kanji) attaches as anrgExtRstblock on the same record. HotXLS previously dropped both on load and re-emitted the string as plain text on save, so opening then resaving a workbook flattened every multi-format cell to a single font / color. The shared-string parser now preserves both trailing blocks per unique string, and the writer re-attaches them when the string fits a single SST record
Исправлено
- Reader проходит границы Continue без повторного чтения байтов флагов. A new
CollectRawTailhelper insideParseSSTpulls the rawrgRunbytes (cRun × 4 bytes per FormatRun) followed by the rawrgExtRstbytes, spilling across Continue ($003C) records as needed — neither block is re-prefixed with the string's flag byte at a Continue boundary per [MS-XLS] §2.4.58, which the old per-byte skip logic could not preserve correctly whenrtorszovershot the current record. The preserved tails are registered against the workbook SST through the newTXLSStringTable.AddWithExtras, which deliberately does not bump the cell-reference counter so subsequentLabelSSTparsing still produces correctcstTotalon save - Исправление граничного случая байта флага Continue (унаследовано из аудита SST v2.54.0). Per [MS-XLS] §2.4.58 the leading flag byte of an SST Continue record carries only the
fHighBytebit (bit 0); bitsfExtSt(bit 2) andfRichSt(bit 3) MUST be ignored because those structures exist exactly once at the head of the first record.ParseSSTnow masks the Continue flag byte with$01, preventing a stray high bit from making the reader skip ahead 2 or 4 bytes looking for cRun / cbExtRst fields that aren't there and misaligning every byte that follows
Версия 2.57.0
Добавлено
- Reader объединяет все фрагменты Continue перед сохранением данных. The new
ParseHFPicturebranch inParseWorksheetRecordwalks every entry of the collatedDataList(the $086C body in slot 0 plus any number of $003C bodies that follow) and stores the joined bytes as a singleTByteson the worksheet. A sheet may carry several entries — up to six in Excel's UI (default / first / even pages × left / center / right) — so the storage is an array rather than a single field - Writer выводит записи HFPicture сразу после PageSetup, а существующий splitter Continue обрабатывает переполнение BLIP. A new
StoreHFPicturesstep inserts itself into the per-sheet store sequence immediately afterStoreSetup, matching the*HFPictureposition in [MS-XLS] §2.1.7.20.2 worksheet ABNF. Each preserved body is wrapped in a fresh $086C header and routed throughAppendData— the existingAddContinuehelper takes over when the BLIP exceeds the 8224-byte BIFF limit, so a 30-50 KB JPEG ends up spread across one $086C plus four to six $003C records exactly the way Excel writes it - Новая публичная поверхность API отсутствует. Wave G is a round-trip preservation feature; HFPicture content is opaque to application code (no caller-facing setter to inject a new header image). Workbooks that never carried an HFPicture record produce byte-identical output as before. The internal helper
TXLSWorksheet._AddHFPictureBlobis reserved for the reader; the underscore prefix flags it the same way as_Drawing/_Autofilter
Исправлено
- Волна G backlog по диаграммам: изображения Header / Footer проходят сохранение и открытие (BIFF8 HFPicture). When Excel saves a worksheet with a header or footer background image (Insert → Header & Footer → Picture, then the company logo style), the picture sits in an
HFPicture($086C) record that embeds an OfficeArt BLIP. HotXLS previously had no case branch for this record so the entire payload was dropped on load; saving the workbook again therefore lost the header/footer image. The reader now preserves the full record body (every Continue chunk concatenated) per sheet, and the writer re-emits it in the spec-correct position so Excel reopens the file with the original images intact
Версия 2.56.0
Добавлено
- Волна B backlog по диаграммам: round-trip цвета вкладки листа (BIFF8 SheetExt). Sheet tab colors set in Excel via right-click Tab Color are now both readable and writable through the BIFF8 path.
TXLSWorksheet.TabColoris a new public property that takes a HotXLSLongWordcolor (low byte=R, mid=G, high=B, top byte=0, same convention asFont.Color/Interior.Color); the default value0means "automatic / no tab color" and suppresses the record entirely
Изменено
- Writer выводит запись SheetExt ($0862) для каждого листа. One 48-byte record is appended to the workbook globals stream just before EOF for every sheet whose
TabColoris non-zero. Layout follows [MS-XLS] §2.4.282 SheetExt v1 + §2.5.108 FullColorExt: the 12-bytefrtRefHeaderU+ 4-bytecb+ 4-byte reservedflagsTab1+ 16-byte FullColorExt block (xclrType=2 RGB, nTintShade=0, xclrValue=tab color) + 4-byteiTabId(0-based stream order of the matching BoundSheet8) + 4-byte reservedflagsTab2.iTabIduses the same iteration order as the BoundSheet block so the two stay aligned across multi-sheet workbooks. xlExcel5 output is untouched (no SheetExt record in BIFF5) - Пример сохранения и открытия. Setting
Workbook.Sheets[1].TabColor := $00FF00(green: B=0, G=$FF, R=$00) before SaveAs to .xls produces a workbook that opens in Excel with a green tab; saving that same workbook back out and re-opening it returns the property to$00FF00. Files coming from Excel with one or more tab colors are now opened without losing the colors, instead of having every tab default to automatic
Исправлено
- Reader восстанавливает цвет вкладки при открытии. A new
ParseSheetExtbranch inParseWorkbookRecord's case table readsiTabIdand the FullColorExt block and writes the resolved RGB value back toSheets[iTabId + 1].TabColor.xclrType=2(RGB) stores the raw value;xclrType=1(indexed icv) resolves through the workbook palette (Colors[icv, 0]) so the application sees a concrete RGB regardless of how Excel happened to encode it;xclrType=0(auto) andxclrType=3(theme) leaveTabColorat its default0, matching the writer-side "no tab color" semantics
Версия 2.55.1
Исправлено
- Восстановлена сборка основной ветки. Two pre-existing identifier errors that left HotXLS unable to compile on RAD Studio 12+ are now fixed. Both came in with earlier bug-fix releases but had no compile gate, so the regressions only surfaced when the next contributor tried to rebuild the package
- Writer многоколоночных shared-formula больше не ссылается на отсутствующее поле записи. The v2.50.0 SHRFMLA wire-format fix added
Data.AddByte(Group.LastCol)inWriteShrfmlabut did not extendTXLSShrfmlaGroupwith the new field, so the package failed to compile with "Undeclared identifier: LastCol". The record now carriesLastColalongside the existingFirstCol, andCollectSharedFormulas.OpenGrouppopulates it with the group's anchor column. Behaviour on single-column shared-formula groups (the only kind the collector currently produces) is unchanged; the spec-correctcolLastbyte is now real instead of an alias ofcolFirst - Запись ячейки XLSX ссылается на XlsxFloatToStr через предварительное объявление. The v2.51.0 locale-safety fix introduced an XlsxFloatToStr call in the cell-value branch (line 2718) but the helper is defined a few hundred lines below (line 2910). Without a forward declaration, Delphi's single-pass compiler reported "Undeclared identifier: XlsxFloatToStr". A forward declaration is now placed at the top of
lxHandleX's implementation block so both the early call site and the existing definition compile cleanly
Версия 2.55.0
Исправлено
- Кэш значений по сериям больше не обрезается до Series[0]. [MS-XLS] §2.1.7.20.1 chart-sheet ABNF allows
*(SIIndex *NUMBER)— oneSIIndex(1) + N×NUMBERblock per series. The Phase-1 builder emitted only one cache block sized bySeries[0].ValArea, so any later series with a longer value range had its cache slots silently cut short. The builder now (a) computes the maximum point count across all series for theDIMENSIONSrow range, and (b) loops over every prepared series emitting an individualSIIndex(1)block whose NUMBER count matches that series'AreaPointCount(ValArea). Cache slots stay zero-valued (BRAIPtgArea3dreferences still resolve to the live source cells at draw time); the change is purely about giving Excel's strict parser a complete cache footprint - Подписи Chart Title / CatAxisTitle / ValAxisTitle передаются в запись. The Phase-1 implementation accepted three Title parameters on
AddChartSheetoverloads and silently discarded them ("Junk := Length(...)" placeholder). They now emit a proper attached-label block —TEXT($1025) +POS+BRAI-literal-tStr +SeriesText($100D) +OBJECTLINK($1027) + End — at the spec-correct position just before theCHARTcontainer's End record per [MS-XLS] §2.1.7.20.1 CHARTTITLES ABNF.OBJECTLINK.wLinkObjuses 1 for chart title, 2 for value-axis title, 3 for category-axis title per [MS-XLS] §2.4.182. Callers passingTitle := 'Quarterly Sales'finally see "Quarterly Sales" rendered above the plot area in Excel - Волна A backlog по диаграммам: подключение кэша нескольких рядов плюс подписи диаграммы / оси. Two long-standing chart-builder limitations are now fixed; both come from the v2.54.0 audit backlog. The first emit-side change is wire-format only (no API change); the second wires through existing
AddChartSheetTitle / CatAxisTitle / ValAxisTitle parameters that previously had no effect
Версия 2.54.1
Добавлено
- Дата ячейки сохраняет свой формат даты при сочетании с любым одним стилем без numFmt. A
TDateTimecell withFontIndex/FillIndex/BorderIndex/AlignmentIndex/ProtectionIndexset but no explicitNumberFormatIndexused to route through a single-dim cellXf whosenumFmtIdwas 0 (General), so Excel rendered the cell as a raw serial number (e.g.46038) instead of1/15/2026. The XLSX style engine now treats the implicit date as a virtual dim: any other styled dim promotes the cell into a composite cellXf that carriesnumFmtId=14alongside the real dim. Pure-date cells with no other styling still route toXlsxXfIndexDateas before. New public surface:TXLSXWorkbook.RegisterCompositeXf/GetCompositeXfgain 7-arg overloads that accept an OOXML built-innumFmtIdoverride (the existing 6-arg signatures are unchanged and forward to the new variant with the override disabled) - Имена листов, нарушающие правила именования Excel, автоматически очищаются. Excel rejects sheet names that exceed 31 characters, contain
: \ / ? * [ ], start or end with a single quote, equal the reserved nameHistory(case-insensitive), or collide with another sheet name (case-insensitive). HotXLS used to pass the raw user input straight through, so calls likeWorkbook.Sheets.Add('Q1:Q2 Sales')produced a workbook that failed to open with the “The name you entered is not valid” dialog.TXLSXSheets.Addnow normalises the name via the newXlsxSanitizeSheetNamehelper (forbidden chars become_, surrounding single quotes drop, length caps at 31, empty / reserved fall back to'Sheet') and appends a' (2)'/' (3)'suffix on case-insensitive collisions. Idempotent on already-valid names, so sheets parsed out of conforming .xlsx files round-trip unchanged
Исправлено
- Дальнейшая правка по кросс-аудиту [MS-XLSX]. Two targeted fixes from the v2.52.0 audit’s "deferred" list. Both are user-observable; neither breaks existing call sites
Версия 2.54.0
Добавлено
- Глубокий спек-аудит, раунд 2, по [MS-XLS] v20250520 / [MS-OFFCRYPTO] v20240820. Eight independent corner-case / wire-format defects found by eight parallel code-reviewer agents auditing Worksheet shell records, SST/Continue edges, formula PTG depth, encryption padding, chart records, drawing/comment writer, and Pivot/Table support. Public API unchanged; existing code recompiles untouched
- Chart3DBarShape больше не выводится на 2D-диаграммах. [MS-XLS] §2.4.47 specifies that Chart3DBarShape "MUST be ignored if the current substream does not contain a Chart3d record". HotXLS doesn't yet support 3D chart types (no Chart3d record emitted), so writing an empty Chart3DBarShape inside every DataFormat block was both redundant and non-spec (the empty payload also failed the 2-byte riser+taper layout). The record is now omitted entirely
Изменено
- Свойство Comment Visible больше не инвертирует смысл.
TMSOShapeTextBox.GetVisible/SetVisiblereturned True whenfHiddenwas set and storedfHiddenwhen callers asked for the comment to be visible — the bit's meaning is the inverse ([MS-XLS] §2.4.179 grbit bit1: 1 = hidden). Callers usingComment.Visible := Truepreviously got hidden comments; now the property matches its name in both directions - Токен Formula tFuncVar теперь маскирует бит fCeFunc при поиске имени функции. [MS-XLS] §2.5.198.63 splits the trailing Word into
tab(15 low)+fCeFunc(1 high); the reader stored the full Word intoItem.IntValueas the hash-table key, so functions emitted with the user-prompt flag (macro/UDF callers) hashed to$8000 | iftaband produced an empty function name, killing the entire formula. Now masked with$7FFF - Операция PtgArray класса V выводится корректно.
GetArrayData(aClass=0)previously fell through to the A-class opcode ($60); per [MS-XLS] §2.5.198.32 the opcode is$20for V-class,$40for R-class,$60for A-class.aClass=0now correctly maps to$20
Удалено
- Несколько записей FILEPASS теперь игнорируются после первой. [MS-XLS] §2.4.117 allows at most one FILEPASS; a hostile or malformed Workbook with a second FILEPASS used to free the live decrypter and re-derive a fresh keystream mid-stream, putting it out of sync with the data already consumed. Subsequent FILEPASS records are now silently dropped while encryption stays armed
- Накопленный backlog аудита зафиксирован в TechnicalNotes.md. Larger spec gaps surfaced by the round 2 audit (XFExt records not emitted, PtgArray constant data not serialized, Chart Title/CatAxisTitle/ValAxisTitle parameters dropped, per-series chart cache, Pivot Table / QueryTable / DConn unsupported) are documented as known gaps for future feature work rather than silent omissions
Исправлено
- Производный ключ RC4 корректен для паролей длиной 16 символов и больше. [MS-OFFCRYPTO] §2.3.6.1 stores the MD5 single-block message-length field as a 64-bit little-endian bit count in bytes 56–63. The previous reader (
lxDecryption) and writer (lxEncrypter) both wrote only the low byte viaSetByte, silently dropping the high byte for passwords of 16+ characters (length-in-bits ≥ 256). Long-password files now derive the same ValDigest on both sides; previously long passwords were rejected even when correct, and HotXLS-encrypted files with long passwords could not be re-opened - Запись Comment Note теперь соответствует спецификации. Two distinct fixes in
TMsoDrawing.StoreNotes(per [MS-XLS] §2.4.179 Note): (1)idObjis now written as a Word (2 bytes) instead of a LongWord (4 bytes), correcting a 2-byte offset slide that misaligned every byte after idObj; (2) the previously absentstAuthorXLUnicodeString field is now serialized (cch + flags + UTF-16 body) fromFAuthorinstead of being replaced by a bareWord(0). Excel's strict reader terminates Note parsing atstAuthor, so omitting it corrupted comment metadata on round-trip even when Excel still opened the file
Версия 2.53.0
Изменено
- Формулы макрокоманд с флагом запроса пользователя больше не ломают парсер (§3.7.2 tFuncVar). The byte at offset+1 of a
tFuncVartoken packs the argument count in bits 6-0 ($7F) and the user-prompt flag in bit 7. Without masking, prompt-flagged tFuncVars were read as 128+N arguments, blowing the formula stack and yielding nil for the whole expression - Флаг выравнивания JustifyLastLine корректно проходит сохранение и открытие (§5.115 XF). The XF BIFF8 alignment byte (offset 6) packs HorAlign + WrapText + VerAlign + JustifyLastLine. Bit 7 (
$80, JustifyLastLine) was never written, so cells configured with the flag reverted to the Excel default after save / reopen - Строка 0 / строка 65535 больше не ошибочно помечаются как границы группы структуры (§5.88 ROW). The fCollapsed (
$10) bit fired for the boundary rows when their explicit outline level differed from the absent neighbours' default level 1. Absent neighbours are now treated as matching the row's own level
Исправлено
- OpenOffice excelfileformat.pdf, раунд 2 кросс-аудита. Three additional BIFF8 wire-format fixes uncovered by re-running the spec sweep after v2.50.0, targeting modules the first pass had touched only lightly: the formula token decoder, the XF alignment byte, and the ROW outline-collapse boundary check
Версия 2.52.0
Добавлено
- <sst count="..."> сообщает общее число ссылок на ячейки, а не уникальных строк. ECMA-376 §18.4.8 defines
countas the total reference count anduniqueCountas the distinct-string count; the writer used to emit both asFStrings.Count(always equal), misleading OOXML consumers about reference density.TXLSXSharedStringsnow tracks a separateRefCountthat increments on everyAdd/AddRichcall regardless of dedup, and the attribute reports the real reference total
Изменено
- [MS-XLSX] кросс-аудит — раунд 2. Three follow-up refinements to the XLSX writer after the v2.51.0 audit. Each item is independently grounded in an ECMA-376 or W3C XML clause; combined effect is better OOXML consumer interop and quieter validation output
- Строки ячеек с ведущими / завершающими пробелами проходят сохранение и открытие. The inline-string fallback in
XlsxFormatCellValueemitted<is><t>...</t></is>withoutxml:space="preserve"; XML 1.0 §3.3.3 normalization stripped the surrounding spaces on load, so a cell whose value was “ Pending ” came back as “Pending”. The SST, rich-text run, and comment-text paths already carried the attribute; the inline-string fallback now matches - Каждый лист теперь содержит подсказку <dimension>. ECMA-376 §18.3.1.35 marks the
<dimension ref="..."/>element optional but every Excel-written .xlsx contains it; consumers that read it (Apache POI / NPOI / OOXML SDK) pre-size their cell buffers from the hint instead of growing dynamically. The writer now computes the bounding rectangle of populated cells during the row-grouping pass and emits the element as the second child of<worksheet>(after<sheetPr>if present, before<sheetViews>). Empty worksheets collapse to<dimension ref="A1"/>
Версия 2.51.0
Изменено
- Ячейки, содержащие управляющие символы, больше не ломают книгу. XML 1.0 §2.2 forbids ASCII codes 0x00–0x08, 0x0B, 0x0C, 0x0E–0x1F (and U+FFFE / U+FFFF) anywhere in an XML document — they cannot be encoded as numeric character references either. Cell values that happened to contain those bytes (legacy data feeds, log dumps, escape-key sentinels) used to be written into
<t>...</t>verbatim, producing an .xlsx Excel refuses to open with no path back to the data. The writer now silently strips the forbidden code points; valid whitespace (TAB / LF / CR) is preserved - Переносы строк внутри значений атрибутов корректно проходят сохранение и открытие. XML §3.3.3 normalises raw TAB / LF / CR inside an attribute value to a single space before handing the value to the application. Multi-line headers / footers, defined-name comments, multi-line data-validation prompts, hyperlink display strings, and any other attribute that carried a newline used to collapse to a single space on load.
XlsxEscapeAttrnow emits those characters as	/
/
numeric character references so Excel reads them back as the original whitespace - Записи <col> выводятся в порядке возрастания столбцов. ECMA-376 18.3.1.4 / 18.3.1.13 expects every
<col min="..."/>entry to appear in ascendingminorder. The previous TStringList(Sorted=True) dedup sorted the integer column indices lexically ("10" before "2"), so a sheet that customised both column 2 and column 10 produced<col min="10"/>before<col min="2"/>. Excel tolerated the layout but Office File Validation flagged the file and strict OOXML consumers (Apache POI strict mode, LibreOffice with strict-validation enabled) rejected it. Column entries are now sorted numerically before emission
Исправлено
- [MS-XLSX] кросс-аудит пройден. Five wire-format and locale-safety fixes across the XLSX writer uncovered by validating against the Microsoft [MS-XLSX] — Excel (.xlsx) Extensions to the Office Open XML SpreadsheetML File Format documentation (v20260108) and the underlying XML 1.0 / OOXML schema requirements. Public API is unchanged; existing applications recompile and re-save without modification
- Сохранённые файлы .xlsx теперь открываются в любом регионе Windows. Page margins, column widths, row heights, font sizes, color tints, theme tints, custom-font rich-text run sizes, and the
<v>-wrapped numeric value of every cell were being serialised through Delphi’s locale-awareFloatToStr. On Windows configured for a region whose decimal separator is ',' (most of continental Europe and parts of Asia / Latin America) the writer emitted attribute values likewidth="8,43"andtop="0,75", which the OOXML schema rejects — Excel surfaced “We found a problem with some content in <file>.xlsx” and offered a recovery pass that wiped page setup, column widths, and the numeric cell values. Every double-valued OOXML attribute now uses an invariant '.' separator regardless of the active region. The same fix also patches the in-memory column-width / row-height cache that previously stored locale-formatted strings;GetColWidth/GetRowHeightreturned0.0right after aSetColWidth/SetRowHeightcall on the same workbook in those regions
Версия 2.50.0
Изменено
- Флаги опций FORMULA определяют членов общей формулы (§5.50 FORMULA). Cells inside a shared-formula group now set the
fShrFmlabit (0x0008) in the FORMULA record option flags so strict parsers recognise thetExptoken as a back-reference - Жирные и подчёркнутые шрифты корректно распознаются строгими читателями (§5.45 FONT). The FONT option-flags word now sets bit 0 (bold) and bit 2 (underlined) in addition to the dedicated
bls/ulsfields - Флаги опций CFRULE содержат предписанные спецификацией постоянные биты (§5.16 CFRULE). When at least one formatting block is present the option-flags DWORD now ORs in bit 7 (
0x00000080, "Always 1") and bits 21-19 (0x00380000, "Always 111") - Очистка data-validation и conditional-formatting больше не разыменовывает память за хвостом. Two
Destroydestructors (TDataValidator,TCondFormatter) walked0..cnton lists whose valid indices are0..cnt-1
Исправлено
- Кросс-аудит OpenOffice excelfileformat.pdf пройден. Eight follow-up wire-format and lifetime fixes uncovered by re-validating the BIFF8 writer / reader against the OpenOffice Microsoft Excel File Format documentation after the v2.49.0 [MS-XLS] pass. Public API is unchanged; existing applications recompile and re-save without modification
- Общие формулы теперь охватывают весь диапазон столбцов (§5.94 SHAREDFMLA). The
SHRFMLArecord body wrotecolFirstinto thecolLastbyte, collapsing every multi-column shared formula group to a single-column group in Excel. Fill-down formulas across two or more columns now expand to the correct cells when the workbook is reopened. The reader-sidecolLastwidth was also corrected - Результаты Boolean / Error общей формулы корректно проходят сохранение и открытие (§5.50 FORMULA). The same
FormulaValuebyte-layout bug fixed in v2.49.0 for standalone formulas was still present in the shared-formula writer (cells that carry atExptoken pointing at aSHRFMLAmaster). CachedTRUE/FALSEand#REF!/#DIV/0!/etc. values now appear as written - Формулы CHOOSE() корректно читаются обратно (§3.10.5 tAttrChoose). The
tAttrparser previously skipped a fixed 4 bytes for every subtype;tAttrChoose($04) is variable-length. The decoder now readsncand advances by6 + 2·ncbytes
Версия 2.49.0
Изменено
- Результаты Boolean и Error в записи Formula BIFF8 теперь корректно проходят сохранение и открытие. [MS-XLS] §2.5.133
FormulaValuepacks the type tag into byte[0] and the bool/error code into byte[1]; the writer used to emit$0001/$0002as a Word and put the value into byte[2], so cached Boolean formulas read back as False and Error formulas as #NULL! in every consuming application - Cell colours set via
SetColorRGBrender correctly. The colour manager wrote ColorType=1 (theme) for RGB values and ColorType=2 (RGB) for theme values, swapping the two code paths. Both setters now route through the matching ColorType bucket so RGB values feed the RGB resolver and theme indices feed the theme resolver - WriteAccess record honours [MS-XLS] §2.4.349 cch <= 54. The
userName.cchfield now carries the actual user-name length (6 for "HotXLS") with the remaining bytes filled by the spec-defined "unused" trailer. Previously the field carried cch=109, which Office File Validation flags as a hard format violation - Путь открытия потока Workbook BIFF8 совпадает с написанием в спецификации. The first OLE
OpenStreamattempt uses 'Workbook' (capital W per [MS-XLS] §2.1.7.20) instead of all-lowercase, so compound-file containers on case-sensitive OLE implementations open the stream on the first try
Удалено
- Читатель VBA-модулей больше не отбрасывает последний байт каждого потока. The seek-to-end length used
trunc(l) - 1instead oftrunc(l), truncating the compressed-source tail and causing the RLE container decompressor to terminate early on certain modules
Исправлено
- Wire-формат листа диаграммы выровнен со спецификацией. SIIndex records emit in numIndex=1 → 2 → 3 order ([MS-XLS] §2.4.262; was 2 → 1 → 3, which strict parsers reject), DEFAULTTEXT count clamped to the spec maximum of 2 ([MS-XLS] §2.1.7.20.1; was 4), Chart3DBarShape placeholder uses the correct id
$105F(was$1066) - Индекс быстрого поиска ExtSST соответствует спецификации для больших книг. The
dsstfield is now computed asmax((cstUnique / 128) + 1, 8)per [MS-XLS] §2.4.107 instead of the static default of 8; workbooks with more than ~900 unique strings now build a correctrgISSTInfbucket array and Excel's quick-find SST lookup works - Спек-аудит по [MS-XLS] v20250520. Sixteen wire-format and behaviour fixes across the BIFF8 writer, formula decoder, encryption path, chart builder, conditional-format and data-validation runtime, SST/ExtSST index, VBA storage reader and OLE stream open path. Public API unchanged; existing code recompiles untouched. Highlights below
- Обфускация XOR и дешифрование RC4 исправлены. The XOR Method-1 decrypt loop now matches [MS-OFFCRYPTO] §2.3.7.3 (XOR first, then rotate-right 5; seed XorArray index from the entry stream position, not the post-process position). RC4
Skipnow walks every 1024-byte boundary continuously instead of jumping straight to the destination block, keeping the keystream state aligned with the file position for every subsequentDecryptcall - Записи HLink tooltip загружаются корректно. The
HLinkTooltip($0800) body decoder used to read FrtRefHeader anchor fields at offsets 2/4/6/8 instead of 4/6/8/10, so the anchor-range comparison never matched and per-cell tooltips were silently discarded; tooltips now associate with their hyperlinks. BIFF8 range-reference decoder also fixed aFFirstColRel/FLastColReltypo in the BIFF5/7 fallback sign-extension path that mis-decoded ranges with negative last-column relative offsets - Исправления runtime для условного форматирования и проверки данных.
IsContainRowin bothTCondRangeandTDVRangereturned true only when the range degenerated to a single row (the comparison was inverted); per-row clearing of CF / DV rules now works on multi-row ranges. Three destructors (CondFormat, formatter, DVRangeList) usedfor i := 0 to cnton lists whose valid indices are 0..cnt-1; the off-by-one is fixed and long-running workloads no longer occasionally AV during teardown. CF12 icon-set rules emit ct=$06(IconSet per [MS-XLS] §2.4.43) instead of ct=$05(Filter), so workbooks containing icon-set rules open with the rules intact
Версия 2.48.10
Изменено
- Два потока эмитируются через путь Win32
StgCreatePropSetStg+IPropertySetStorage.Create+IPropertyStorage.WriteMultiple— тот же код, который использует Microsoft Office, поэтому Office File Validation принимает байтовую раскладку. Поток SummaryInformation создаётся сAppName="HotXLS"по умолчанию и пустым Автором; TRIAL-сборки по-прежнему перезаписывают значения Автора / AppName баннером пробной версии черезlxTrial.XlsTrialStampXlsSummaryпосле штампа по умолчанию, поэтому пробные файлы остаются идентифицируемыми в панели Файл > Сведения > Свойства Excel. Поток DocumentSummaryInformation создаётся пустым (Win32 всё ещё эмитирует заголовок набора свойств + свойство CODEPAGE — достаточно, чтобы строгий парсер Excel считал метаданные "присутствующими и хорошо сформированными") - Этот релиз закрывает восьмиверсионную последовательность последующих исправлений chart Phase 2 (v2.47.0 — v2.48.10): от связывания серий
tArea3D, через перевыравнивание id BRAI, наблюдаемые Excel значения sdtX/cValx, размещение SERIESTEXT, удаление заполнения потока Workbook, оболочечные записи на уровне листа, и теперь потоки метаданных OLE. Результат — диаграммный .xls, который открывается в Excel 2003 и современном Excel без каких-либо предупреждений "у файла есть проблемы", байтово выровненный с тем, что сам Excel пишет для тех же данных
Исправлено
- Файлы .xls, сохранённые HotXLS, теперь включают два OLE-составных потока наборов свойств, которые Excel ожидает в каждой рабочей книге:
\005SummaryInformationи\005DocumentSummaryInformation. До v2.48.10 только TRIAL-сборки писали их (как механизм штампования баннера); release-сборки производили файлы .xls, чей поток Workbook был действительным BIFF8, но чей OLE-контейнер не имел стандартных потоков метаданных Office. Строгий парсер Excel 2003 рассматривает это как условие "File error: data may have been lost" (современный Excel сохраняет баннер Защищённого Просмотра "у этого файла есть проблемы"). Добавление потоков устраняет диалоговое окно на рабочих книгах с диаграммами без изменения какой-либо записи BIFF8 - Это исправление универсально — каждый .xls, сохранённый HotXLS, теперь несёт стандартные метаданные OLE, не только рабочие книги с диаграммами. Выводы только-листа из предыдущих релизов избежали симптома, потому что Excel более снисходителен к рабочим книгам только-листа без метаданных, чем к рабочим книгам с листом диаграммы, но технически им также не хватало потоков. Новый модуль
Lib/lxXlsSummary.pasсодержит две вспомогательные процедуры; lxHandle.pas вызывает их безусловно внутриTXLSWorkbook.SaveWorkbookпосле того, какStoreWorkbookзаполняет поток Workbook, и передFDocStorage.Commit
Версия 2.48.9
Изменено
- Листы диаграмм BIFF8 теперь несут полный набор оболочечных записей уровня листа, который требует Excel 2003+. chart_phase2_demo.xls v2.48.8 рендерил столбчатую диаграмму корректно, но Excel 2003 всё ещё показывал диалоговое окно "File error: data may have been lost" (новые версии Excel сохраняли баннер Защищённого Просмотра) потому что substream диаграммы пропускал те же записи уровня листа, что несёт substream рабочего листа. Реальные файлы Excel (как from-scratch, так и re-saved варианты вывода HotXLS) оборачивают записи диаграммы в эту оболочку:
- Перед записями диаграммы (между BOF и UNITS):
HEADER($0014, пустой),FOOTER($0015, пустой),HCENTER($0083, значение 0),VCENTER($0084, значение 0),SETUP($00A1, 34-байтная настройка страницы),PRINTSIZE($0033, значение 3) - После записей диаграммы (после самого внешнего CHART END, перед EOF):
DIMENSIONS($0200, 14 байт) объявляет диапазон кэшированных данных, три маркераSERIESINDEX($1065) для слотов кэша категорий / значений / размеров пузырей, по одномуNUMBER($0203, 14 байт) на кэшированную точку значения, иWINDOW2($023E, 10-байтный вариант для листа диаграммы) в конце
dev-notes/biffview-refs/excel_column_chart_resaved.xls(референс столбчатой диаграммы, сохранённый Excel, локально) - Перед записями диаграммы (между BOF и UNITS):
- Сквозной дымовой тест: откройте регенерированный
Demo/Delphi/XlsCreateChart/chart_phase2_demo.xlsв Excel 2003 — запрос "File error: data may have been lost" больше не появляется, и столбчатая диаграмма рендерится идентично прежней. Тот же файл чисто открывается в современном Excel без баннера Защищённого Просмотра
Исправлено
- Кэш значений в настоящее время эмитирует нулевые заполнители (
0.0для каждой точки данных), соответствуя тому, что сам Excel пишет при пересохранении диаграммы, исходный кэш которой не был предварительно заполнен. Диаграмма по-прежнему рисует реальные данные, потому что ссылкиPtgArea3dBRAI разрешаются на исходные ячейки рабочего листа во время рисования — кэш позволяет Excel анализировать лист диаграммы без предупреждений, а не питает построение. Будущая версия может заполнить кэш реальными числами из диапазонаValues; wire-формат на месте
Версия 2.48.8
Удалено
- Сам метод
StoreExtraSpaceостаётся как приватный мёртвый код вlxHandle.pasна случай, если будущий путь кода действительно нуждается в потоках, округлённых до сектора; точка вызова вStoreOleFileудаляется. Длина потока Workbook теперь точно равна длине в байтах всех действительных записей (демо диаграммы: 3164 байт; референс Excel from-scratch: 4419 байт — оба не выровнены по сектору). Пути кода читателя не затронуты — HotXLS всегда корректно читал не-сектор-выровненные потоки Workbook из сохранённых Excel файлов
Исправлено
- Писатель BIFF8 (.xls) больше не дополняет поток Workbook завершающими нулевыми байтами.
TXLSWorkbook.StoreOleFileранее вызывалStoreExtraSpace(Book)после записей последнего листа, заполняя длину потока до следующей границы 512 байт (сектор OLE). Строгий парсер Excel рассматривает эти завершающие нулевые байты как фиктивный поток записей с id0x0000и показывает запрос Защищённого Просмотра "этот файл имеет проблемы" — виден на chart_phase2_demo.xls v2.48.7 даже после исправления wire-формата BRAI / sdtX / SERIESTEXT и корректного рендеринга диаграммы. Удаление вызова убирает заполнение из содержимого потока Workbook; заполнение сектора OLE всё ещё происходит, но в слое контейнера CFB под потоком, где сам Excel его размещает (каждый сохранённый Excel .xls имеет длину потока Workbook, не выровненную по сектору) - История симптомов: любой сохранённый HotXLS .xls, общая длина в байтах действительных записей которого не совпадала случайно с границей 512 байт, нёс поток с завершающими нулями. Ошибка существовала с коммита бутстрапа репозитория, но редко проявлялась — большинство рабочих книг имеют достаточно записей, чтобы заполнение оказалось маленьким (≤ 4 нулевых байта, которые Excel терпит). Рабочие книги с листами диаграмм оказываются далеко ниже границы сектора (демо v2.47.0 — v2.48.7 заполняло 420 нулевых байт), поэтому именно там запрос Защищённого Просмотра стал постоянным
Версия 2.48.7
Добавлено
- Новый инструмент инспекции на уровне байтов
dev-notes/biffview-refs/dump_chart_substream.pyвыгружает substream диаграммы любого BIFF8 .xls с декодированием по записям (SERIES / BRAI / SERIESTEXT / AXIS / CATSERRANGE / LEGEND / OBJECTLINK / POS / TEXT). Использовался во время этого релиза для byte-diff вывода HotXLS относительно образцов-эталонов, сохранённых Excel; доступен для будущих follow-up по спецификации диаграмм
Изменено
- Также выровнено с форматом wire столбчатой диаграммы, сохранённой Excel:
SERIES.sdtXтеперь0x0003(наблюдаемое значение Excel для текстовых категорий, а не0x0001, документированный [MS-XLS] §2.4.252), иcValxнесёт фактический счётчик категорий вместо0. Правило "cValx MUST = 0, когдаsdtX∈ {1, 3}" опровергнуто каждым изученным образцом, сохранённым Excel - Файлы диаграмм, сохранённые в v2.41.0 — v2.48.6, все несут инвертированный wire-формат BRAI. Они открываются в Excel без ошибок, но показывают вышеуказанные симптомы легенды / оси X. Пересохраните через v2.48.7+ для миграции; без изменения API — тот же вызов
AddChartSheetтеперь производит диаграмму, которая рендерится идентично тому, что сам Excel написал бы для тех же данных
Исправлено
- Записи серий диаграмм BIFF8 наконец корректно отображаются в Excel. Исправление заключается в выравнивании назначений id BRAI с [MS-XLS] §2.4.51 — родительский план реализации документировал их инвертированными, распространяя ошибку через каждый релиз диаграмм с v2.41.0 по v2.48.6. Правильная семантика id:
id = 0— имя серии / метка легенды (план говорил: categories)id = 1— values (правильно)id = 2— categories (план говорил: name)id = 3— bubble sizes (план говорил: errBars)
- Носитель литерального имени
SERIESTEXT($100D) возвращается, но в правильном месте: непосредственно после BRAIid = 0, всё ещё внутри блока SERIES BEGIN/END. Это то, что делают реальные файлы Excel — точка эмиссии v2.48.5 (после всего кластера BRAI, передDataFormat) была неправильной и ломала парсинг диаграммы; правильная позиция — прямо рядом с BRAI имени серии
Версия 2.48.6
Изменено
- Известно нерешённое: с wire-форматом v2.48.6 Excel по-прежнему рендерит метки оси X столбчатой диаграммы как нули и откатывается к конкатенации текста ячеек категорий для легенды (вместо использования литерала PTG tStr из BRAI id=2
'Q1 Sales'). Это реальный пробел wire-формата, который требует столбчатой диаграммы, сохранённой Excel, в качестве референса для побайтового diff — отслеживается как follow-up. Сама область построения с 4 столбцами рендерится корректно (высоты 100/150/200/175 соответствуют Values)
Удалено
- Новое Delphi-демо Поддержка XlsCreateChart в
Demo/Delphi/XlsCreateChart/создаёт книгу из двух листов: лист "Data" с четырьмя строками (Region, Sales) и лист "Chart1" со столбчатой диаграммой, серия которой связываетData!$A$2:$A$5/Data!$B$2:$B$5как Categories / Values. Демо — постоянный преемник ad-hocchart_phase2_demo.xls, который v2.47.0 — v2.48.5 размещали в корне репозитория для тестов BiffView; корневой файл удалён, а новое демо пишет свой вывод рядом со своим .exe
Исправлено
- BIFF8-substream листа диаграммы отзывает изменения v2.48.5. Реальные тесты Excel на регенерированном демо v2.48.5 вообще не отрендерили диаграмму — хуже базовой линии v2.47.0 (где диаграмма рисовалась, но с неверными метками оси X). Два изменения v2.48.5 были причиной:
SERIES.sdtX = 4на самом деле не принимается Excel, хотя Apache POI экспонируетCATEGORY_DATA_TYPE_TEXT = 4. [MS-XLS] §2.4.252 строго требует, чтобыsdtXбыл0x0001или0x0003- Добавленная запись
SERIESTEXT($100D) внутри блока SERIES BEGIN/END — структурное нарушение.SERIESTEXTпринадлежит блокам TEXT (контексты заголовка диаграммы / заголовка оси / метки данных), а не внутри блока SERIES. Встраивание там запутывает парсер диаграмм Excel и отвергает весь substream
- v2.48.6 восстанавливает wire-формат v2.47.0 И добавляет одно исправление соответствия спецификации:
SERIES.cValxтеперь0, когдаsdtX = 1(правило [MS-XLS] §2.4.252 spec MUST). До v2.48.6 писалосьcValx = count(4 в демо), нарушая правило, что, возможно, способствовало предупреждению Excel "у документа есть проблемы" в защищённом представлении.cValyвсё ещё несёт фактическое количество значений (sdtY=1 не имеет правила нуля)
Версия 2.48.5
Изменено
- Поле
sdtXзаписиSERIESтеперь4(текстовые категории), а не1. [MS-XLS] §2.4.252 документирует только1(даты) и3(последовательность BIFF7), но реальные файлы столбчатых / линейчатых / графических диаграмм, сохранённые Excel, пишут4для текстовых осей категорий (соответствует константеCATEGORY_DATA_TYPE_TEXTApache POI). ПриsdtX=1Excel пытался привести ячейки'North'/'South'к числам → fallback на 0; сsdtX=4текстовые метки проходят буквально. Предыдущая wire-форма также нарушала правило спецификации "cValxдолжен быть нулём приsdtX=1"
Исправлено
- Записи серий диаграмм BIFF8 теперь корректно отображаются в Excel. v2.47.0 подключила привязку
tArea3Dдля диапазонов Categories / Values, но Excel по-прежнему рисовал все метки оси X как0и использовал склеенный текст категорий ("North South East West") как легенду и автоматический заголовок, вместо предоставленного пользователем Name. Два исправления восстанавливают намеренное отображение: - Запись
SERIESTEXT($100D) теперь эмитируется внутри блока SERIES BEGIN/END (после кластера BRAI, передDataFormat) всякий раз, когда указан литеральный Name. Механизм первой половины Phase 2 (BRAI id=2 + PTGtStr) сохранён ради полноты спецификации, но Excel фактически берёт метку легенды и автоматический заголовок изSERIESTEXT; при наличии только варианта BRAI Excel откатывался на склеивание ячеек категорий. После этого исправления легенда показывает реальный Name (например,'Q1 Sales'), а пустой заголовок диаграммы оставляет слот автоматического заголовка пустым - Миграция: выводы листов диаграмм v2.42.0 — v2.47.0 по-прежнему открываются в Excel без ошибок, но проявляли симптомы выше. Пересохраните через v2.48.5+, чтобы получить исправленный wire-формат; изменений API не требуется, тот же вызов
AddChartSheetтеперь производит правильную диаграмму
Версия 2.48.4
Изменено
- Вывод BIFF8 CFEX ($087B) выведен на пенсию. HotXLS больше не пишет парную CFEX после каждой CF12 ($087A) — вся конфигурация Data Bar / Color Scale / Icon Set теперь идёт встроенно в хвосте по типам CF12 (v2.48.1 — v2.48.3). Файлы .xls, сохранённые HotXLS, становятся компактнее и в точности соответствуют собственному выводу Excel. Apache POI / NPOI уже игнорируют CFEX, так что это чистое упрощение без потери читаемости
- Путь чтения BIFF8 CF12 теперь потребляет хвост по типам прямо из CF12, а не из CFEX.
ParseCfExстановится пустой операцией; запись диспетчера lxRead для $087B остаётся, чтобы файлы HotXLS v2.34..v2.47 не вызывали ошибку, но их содержимое CFEX игнорируется - Это завершает 5-PATCH переписывание wire-формата Gap #6 (v2.48.0 заголовок + v2.48.1 data_bar + v2.48.2 color_gradient + v2.48.3 multistate + v2.48.4 пенсия CFEX). Записи условного форматирования Excel 2007+, сохранённые HotXLS, теперь побайтово соответствуют собственному wire-формату Excel, обеспечивая совместимость с Apache POI / NPOI и любым другим BIFF8-читателем, соответствующим спецификации
Версия 2.48.3
Изменено
- Правила Icon Set в BIFF8 CF12 ($087A) теперь выводят NPOI-совместимую подзапись
multistateвстроенно, позволяя Apache POI / NPOI читать идентификатор семейства иконок, пороги по точкам и флаги reverse / show-icon-only прямо из CF12 без обращения к устаревшей записи CFEX. Раскладка соответствует NPOIIconMultiStateFormatting.Serialize():reserved(2) + reserved(1) + num(1) + iconSet.id(1) + options(1)+IconMultiStateThresholdна каждую точку (cfvo + байт equals + 4 зарезервированных) - Значения
TXLSIconSetTypeHotXLS от0до16соответствуют 1:1 перечислению idIconSetNPOI, поэтому существующий пользовательский код с константами наборов иконок продолжает работать без изменений.ShowOnlyустанавливает бит 0 options (iconOnly),Reverse— бит 2 - Пороги по умолчанию для каждой точки (
cfvPercentHotXLS с равномерными значениями: 3 иконки=0/33/67, 4 иконки=0/25/50/75, 5 иконок=0/20/40/60/80) выводятся как RangeType NPOIPERCENT(4)+ Double значение + байт equals (всегдаEQUALS_INCLUDE=1пока). Это завершает часть kind-tail переписывания CF12 Gap #6; пенсия вывода CFEX появится в v2.48.4
Версия 2.48.2
Изменено
- Правила Color Scale из 2 и 3 точек в BIFF8 CF12 ($087A) теперь выводят NPOI-совместимую подзапись
color_gradientвстроенно, позволяя Apache POI / NPOI читать порог, цвет и позиции интерполяции каждой точки прямо из CF12 без обращения к устаревшей записи CFEX. Раскладка соответствует NPOIColorGradientFormatting.Serialize():reserved(2) + reserved(1) + numI(1) + numG(1) + options(1)+ColorGradientThresholdна каждую точку (cfvo + position Double) +step + ExtendedColorна каждую точку - Точки используют формулу NPOI
step = 1 / (N-1), так что Color Scale из 3 точек получает позиции 0,0 / 0,5 / 1,0, а из 2 точек — 0,0 / 1,0. Цвета точек (RGB или тема черезSetThemeColor) передаются через тот же блок ExtendedColor, что и у Data Bar в v2.48.1 - Виды по умолчанию для 3-точечной ColorScale (cfvMinOfRange / cfvPercentile=50 / cfvMaxOfRange) соответствуют RangeType NPOI
MIN(2) / PERCENTILE(5) / MAX(3); значение средней точки (50,0 как Double) и позиции по точкам побайтово верифицированы на записи 215poi_ConditionalFormattingSamples.xlsв наборе тестов
Версия 2.48.1
Изменено
- Правила Data Bar в BIFF8 CF12 ($087A) теперь выводят NPOI-совместимую подзапись
data_barвстроенно (28 байт послеtemplate_params), позволяя Apache POI / NPOI декодировать цвет полосы, мин/макс пороги и границы длины в процентах прямо из CF12 без обращения к устаревшей записи CFEX (которую POI полностью игнорирует). Раскладка соответствует NPOIDataBarFormatting.Serialize():reserved1(2)+reserved2(1)+options(1)+percentMin(1)+percentMax(1)+ ExtendedColor(16) + ThresholdMin/Max - Цвет полосы HotXLS (BGR
LongWord) записывается в блок ExtendedColor сtype=RGB; Data Bar с тематическим цветом (заданным черезSetThemeColor) выводитtype=THEMED+ themeIndex + tint.MinLength/MaxLengthпо умолчанию составляют 10% / 90% (настраивается через объект спецификации), что соответствует стандартному виду Data Bar в Excel - Хвосты Color Scale и Icon Set (v2.48.2 — v2.48.3) и пенсия CFEX (v2.48.4) ещё впереди; этот выпуск завершает только часть Data Bar переписывания CF12 Gap #6. Подробнее о переписывании заголовка, на котором строится этот PATCH, см. запись v2.48.0
Версия 2.48.0
Исправлено
- Расположение заголовка BIFF8 CF12 ($087A) исправлено в соответствии с NPOI
CFRule12Record.serialize()и эталонными файлами, сохранёнными Excel. Предыдущая раскладка помещалаipriority/iTemplate/grbit/parmsсразу послеcce2и воспринималаcbdxfкак 2-байтовое поле длины; Excel фактически записываетext_formatting_length(4)+ необязательный заголовокSerializeFormattingBlockперед токенами формул, затемformula_scale,ext_opts,priority,template_typeи блокtemplate_paramsс префиксом длины - Записи CF12, выводимые HotXLS, теперь соответствуют байтовой раскладке записей 152..215
poi_ConditionalFormattingSamples.xlsв части заголовка (хвосты по типам data_bar / color_gradient / multistate появятся в v2.48.1 — v2.48.3; парный CFEX по-прежнему выводится в этом выпуске и будет упразднён в v2.48.4). Подробнее о смежном исправлении CONDFMT12, ставшем поводом для этого переписывания, см. запись v2.47.1 - Внеспецификационное 2-байтовое поле
nID, которое HotXLS добавлял в конец каждого CF12 (такого поля не существует в спецификации), удалено — идентичность правила несёт родительская запись CONDFMT12. Существующие файлы .xls версий v2.34.0 — v2.47.1 следует пересохранить через v2.48.0 для перезаписи их записей CF12
Версия 2.47.1
Исправлено
- Проводной формат записи BIFF8 CONDFMT12 ($0879) исправлен для соответствия файлам, сохранённым Excel. Предыдущая реализация следовала раннему черновому варианту, который помещал 8-байтовый связанный диапазон как «зарезервированный» внутри FtrHeader и вставлял несуществующее 4-байтовое поле Reserved перед
numCF; файлы .xls Excel фактически заполняют эти 8 байт диапазоном ячеек правила и не имеют поля Reserved, поэтому файлы, созданные HotXLS, были смещены на 4 байта, а слот диапазона содержал нули. Эталонный дамп изpoi_ConditionalFormattingSamples.xls(тестовый файл Apache POI), запись 152, теперь побайтово совпадает с выводом HotXLS - Конкретное исправление:
StoreCondFmt12Headerтеперь записывает FtrHeader какrt(2) + grbitFrt(2) + associatedRange(8), затем тело какnumCF(2) + needRecalcAndId(2, упакованные биты) + enclosingRange(8) + cref(2) + массив sqref. Общее количество фиксированных байт уменьшилось с 30 до 26 (удалены 4 байта Reserved).ParseCondFmt12симметрично обновлён для чтения по исправленным смещениям - Существующие файлы .xls, сгенерированные HotXLS v2.34.0 — v2.47.0, следует пересохранить через v2.47.1 для восстановления записей CONDFMT12. Файлы, прошедшие через Excel между обновлениями версий, не были затронуты, поскольку Excel перезаписывал записи в своём корректном формате при сохранении
Версия 2.47.0
Изменено
- Создание листа диаграммы BIFF8 теперь привязывает реальные диапазоны данных к сериям. Строки A1
CategoriesиValues, передаваемые в 6-аргументную перегрузкуAddChartSheet(например,'Data!$A$2:$A$5'), компилируются в PTG-токеныtArea3D, записываемые в записи серииBRAI id=0(категории) иBRAI id=1(значения). Открытые в Excel файлы .xls теперь рендерят реальные точки данных в области графика вместо пустой диаграммы-заглушки из v2.42.0 - Разрешение имени листа и регистрация EXTERNSHEET выполняются автоматически: парсер находит лист по имени в книге, регистрирует запись XTI, если она ещё не существует, и записывает соответствующий 0-индексированный
ixtiв тело PtgArea3d. При повторном сохранении поток записей диаграммы сериализуется заново через компилятор формул, что сохраняетixtiв согласованности с финальным порядком EXTERNSHEET - Принимаемые формы ссылок:
Sheet1!$A$2:$A$5(абсолютная),Sheet1!A2:A5(относительные маркеры допустимы — серии диаграммы всегда сохраняются как абсолютные),'My Sheet'!$A$1:$B$5(имена листов с пробелами в одинарных кавычках) и ссылки на одну ячейку, напримерSheet1!$A$1(вырождается в PtgArea3d размером 1×1). Количество точек данных (cValx/cValy) теперь автоматически вычисляется по размерам области - Завершает Roadmap #10 Phase 2 (столбчатая диаграмма end-to-end). Метки серий (первая половина Phase 2, v2.42.0) плюс привязка диапазонов серий (этот релиз) означают, что столбчатая диаграмма, созданная через
AddChartSheet, теперь отображает корректные записи легенды и реальные данные без постобработки в Excel - Неподдерживаемые формы ссылок безмолвно откатываются на BRAI-заглушку
cce=0в стиле v2.41.0, чтобы диаграмма по-прежнему открывалась в Excel: межкнижные ссылки ([Book2.xls]Sheet1!...), именованные диапазоны (Sheet1!ProfitColumn), ссылки без префикса листа!и ссылки, указывающие на сам лист диаграммы. Эти случаи отложены на следующие фазы
Версия 2.46.0
Изменено
- Поиск использует встроенную палитру по умолчанию Excel 2003 — icv 0..7 — это 8 системных цветов, icv 8..15 отражают системные цвета, icv 16..63 — стандартные настраиваемые значения по умолчанию. Выход за пределы диапазона icv падает на чёрный
Исправлено
- Декодер DXF на стороне BIFF8 теперь разрешает цвета xclrType=1 (индексированная палитра) из стандартной 64-цветной палитры Excel 2003
- Настройка записи PALETTE BIFF8 не учитывается
- Пути xclrType=0 (auto) и xclrType=2 (RGB) не изменились
Версия 2.45.0
Добавлено
- Новое свойство
PriorityнаTCondFormatRule(сторона BIFF8) иTXLSXConditionalFormat(сторона XLSX). По умолчанию ноль сохраняет существующее поведение auto-by-index при сохранении; положительное значение фиксирует приоритет
Изменено
- Правила условного форматирования теперь делают round-trip атрибута priority как в XLSX
<cfRule priority="N"/>, так и в поле BIFF8 CF12ipriority - Priority управляет слоистостью нескольких правил — когда несколько правил охватывают один и тот же диапазон, Excel применяет их в порядке приоритета. Round-trip приоритета сохраняет предполагаемый пользователем порядок рендеринга
- Поведение по умолчанию не изменилось для вызывающих, которые не трогают
Priority
Версия 2.44.0
Добавлено
- Новые методы на
TXLSIconSetSpec:SetIconOverride(stopIndex, OverrideSet, IconId)иClearIconOverride(stopIndex). Свойства только для чтенияHasIconOverride[i],IconOverrideSet[i],IconOverrideId[i] - Писатель XLSX выводит дочерние
<cfIcon>только для точек остановки, которые вызвалиSetIconOverride. Читатель парсит входящие элементы<cfIcon>по позиции - Правила условного форматирования Набор Значков теперь поддерживают переопределения значков для каждой точки остановки на стороне XLSX. Каждая из 3 / 4 / 5 точек остановки в наборе значков может отказаться от значения по умолчанию семейства и отображать любой значок из любого из 17 встроенных семейств Excel 2007, идентифицируемый именем набора + id значка. OOXML-элемент:
<cfIcon iconSet="OtherSet" iconId="N"/>
Изменено
- Известные ограничения: BIFF8 (.xls) CFEX не имеет слота для переопределений по точке; правило с переопределениями, сохранённое в .xls, отображает значение по умолчанию семейства для всех точек
Версия 2.43.0
Добавлено
- Новые методы на
TXLSDataBarSpecиTXLSCfValueпереключают слот в режим темы:SetThemeColor(themeId, tint)иClearThemeColor - Поведение по умолчанию не изменилось: правила, созданные с существующими точками входа только-RGB, продолжают выводить
<color rgb="..."/>точно так же, как раньше
Изменено
- Правила условного форматирования XLSX (.xlsx) теперь делают round-trip ссылок на тематические цвета в элементе
<color>правил Гистограммы и Цветовой Шкалы. Ранее писатель выводил только<color rgb="FFRRGGBB"/>и читатель игнорировал атрибутыtheme/tint - Писатель XLSX выводит
<color theme="N"/>, когдаTintточно равен 0.0, или<color theme="N" tint="0.5"/>, когда не равен нулю
Исправлено
- Известные ограничения: BIFF8 (.xls) CFEX по-прежнему несёт только RGB-цвет; разрешение тематической палитры книги остаётся за рамками; правила
iconSetне несут элементов<color>
Версия 2.42.0
Добавлено
- API создания листов-диаграмм BIFF8 получает пятую перегрузку
AddChartSheet, которая принимает массив записейTXLSChartSeriesInfo(Name,Categories,Values). Каждое непустоеNameпишется в субпоток диаграммы как литеральная метка серии через токен PTGtStrвBRAIимени серии (id=2). Excel использует эту метку в легенде и селекторе серий, поэтому многосерийная диаграмма теперь поставляется с надлежащими подписями серий вместо стандартных заполнителей "Series1 / Series2"
Изменено
TXLSChartSeriesInfoреэкспортируется изlxHandleвместе сTXLSChartType, чтобы вызывающие могли построить массив без прямого импортаlxChartBuilder- Это первая половина Roadmap #10 Фаза 2 (столбчатая диаграмма от конца до конца). Путь имени серии подключён; привязка данных категории и значения (преобразование A1-range строк
CategoriesиValuesв настоящие ссылкиtArea3Dдиапазона ячеек внутри BRAI) остаётся заполнителем — эти два поля принимаются API, но пока не эмитируются в субпоток. Последующий релиз направит их через компилятор формул и таблицу EXTERNSHEET для завершения второй половины Фазы 2
Версия 2.41.0
Добавлено
- HotXLS получает программное создание листов-диаграмм BIFF8. Новый набор перегрузок
AddChartSheetуSheetsпишет полный субпоток диаграммы в сохранённый файл .xls, тогда как раньше листы-диаграммы можно было сохранить только непрозрачно при load-save round-trip. Четыре перегрузки покрывают обычные точки входа: только имя / имя + тип диаграммы / + заголовок / + заголовок оси категории + заголовок оси значения. ВозвращаемыйIXLSWorksheetпоявляется в коллекцииSheets, получает запись boundsheet листа-диаграммы при сохранении, и Excel открывает его как вкладку диаграммы - Новое перечисление
TXLSChartTypeвыбирает тип диаграммы:xlsChartTypeColumn,xlsChartTypeBar,xlsChartTypeLine,xlsChartTypePie. Перечисление реэкспортируется изlxHandle, чтобы пользовательский код не должен был импортировать модуль chart-builder напрямую - Ограничения: новый лист-диаграмма отображает пустую диаграмму по умолчанию запрошенного типа. Привязка данных серий (связывание диаграммы с реальными диапазонами ячеек), заполненный текст заголовка и детальное форматирование по типу (gap width / overlap / hole size / marker style) отложены до последующих фаз. Excel сохраняет и переоткрывает с сохранением присутствия и типа диаграммы, но пока без данных, предоставленных пользователем
Изменено
- Создаваемый субпоток диаграммы покрывает требуемое спецификацией обрамление BIFF8 — BOF (dt=$0020), Chart / PlotGrowth / Frame / Series / SheetProperties / AxesUsed / AxisParent (POS + ось категории + ось значения + PlotArea + Frame + ChartFormat + запись типа + ChartFormatLink + Legend), EOF — так что Excel распознаёт результат как настоящую вкладку диаграммы запрошенного типа. Существующий round-trip через
TXLSCustomChartне изменился - Это первая часть Roadmap #10 (субпоток CHART — самый большой пункт аудита BIFF8). Фаза 1 предоставляет каркас и API-поверхность, чтобы последующие фазы могли добавить привязку данных серий, заголовки осей и более богатое форматирование по типам
Версия 2.40.0
Добавлено
- Новое демо Delphi Поддержка XlsCondFormat12 в
Demo/Delphi/XlsCondFormat12/демонстрирует API расширения условного форматирования v2.34.0+ от начала до конца. Три кнопки позволяют генерироватьCondFormat12.xls(бэкенд BIFF8),CondFormat12.xlsx(бэкенд XLSX) или оба бок о бок. Каждый выходной лист несёт одни и те же четыре типа правил — Гистограмма, 3-цветная шкала, Набор значков (3 стрелки) и 2-цветная шкала — охватывая десять строк данных, чтобы открыть файлы в Excel и визуально проверить рендеринг каждого бэкенда - Путь BIFF8 дополнительно осуществляет переопределение стиля DXF v2.35.0: правило Гистограммы прикрепляет белый жирный цвет шрифта, чтобы текст ячейки оставался читаемым над тёмной заливкой полосы
- Новая фикстура тестов DUnitX в
Tests/Delphi/HotXLS.CondFormat12Tests.pasохватывает десять сценариев round-trip и поверхности API: round-trip BIFF8 для всех четырёх типов правил, round-trip DXF Style для RGB цветов, тематических цветов и флагов шрифта, и XLSX round-trip для Гистограммы / 3-цветной шкалы / Набора значков с ShowOnly. Фикстура подключена кHotXLSDelphiTests.dprи соответствующему.dproj - Для поддержки фикстуры тестов
TCondFormatпредоставляет два новых публичных аксессора:RuleCountиRule(I), позволяя вызывающему коду перебирать правила после чтения вместо обращения к ранее закрытому списку правил
Версия 2.39.0
Добавлено
- Переопределение стиля Differential XF (DXF) на правилах условного форматирования теперь поддерживает кодирование тематического цвета в дополнение к существующему режиму RGB. Каждый слот цвета — цвет шрифта, фон заливки, передний план заливки — может быть установлен относительно индекса темы книги плюс значение оттенка
- Три новых метода на
TXLSDxfStyleвключают слот в режим темы:SetFontColorTheme(themeId, tint),SetFillBgColorTheme(themeId, tint),SetFillFgColorTheme(themeId, tint). Tint — это single в диапазоне [-1.0, +1.0]. Соответствующие существующие методыSetXxxColor(rgb)остаются в режиме RGB; два режима взаимно исключают друг друга для каждого слота - Проводной формат BIFF8 следует стандартной разметке XFProp Colour: RGB —
xclrType=2+ 4-байтовое BGR LongWord, режим темы —xclrType=3+ 2-байтовый знаковый tint × 32767 + 4-байтовый индекс темы. Декодер блоба DXF зеркально отражает этот dispatch - Известные ограничения: round-trip в режиме темы поддерживается только на стороне BIFF8 (.xls) — сторона XLSX (.xlsx) по-прежнему выводит и читает только
<color rgb="..."/>
Исправлено
- Запросите активный режим через новые свойства только для чтения
XxxColorIsTheme/XxxColorThemeId/XxxColorThemeTint.HasXxxColorвозвращает True в любом режиме
Версия 2.38.0
Добавлено
- Существующая обработка XLSX
<cfRule type="cellIs">не изменилась; диспетчер выбирает новые типы правил только когда атрибутtypeих называет
Изменено
- Читатель анализирует обёртку OOXML
<cfRule type="dataBar|colorScale|iconSet">и внутреннее тело<dataBar>/<colorScale>/<iconSet>, обходя дочерние записи<cfvo>для восстановления type и val каждого порога, и записи<color>для восстановления цвета гистограммы или цветов по точке остановки шкалы - Правила наборов значков round-trip-ят имя семейства
iconSet(17 базовых наборов Excel 2007), флагreverseи флагshowValue(отображённый вShowOnly) - Значения цветов, проанализированные из атрибута OOXML
rgb="AARRGGBB", преобразуются в то же соглашение BGRLongWord, используемое API записи
Удалено
- Чтение XLSX (.xlsx) теперь распознаёт правила расширения условного форматирования Excel 2007+ во входящих файлах — гистограмму, цветовую шкалу (2 и 3 точки, автоматически определяемые из количества cfvo) и набор значков — и заполняет соответствующий объект
TXLSXConditionalFormat, чтобы пользовательский код мог проверять и round-trip-ить эти правила без потери. Ранее .xlsx-книги, сохранённые Excel с этими типами правил, молча отбрасывались при загрузке
Исправлено
- Известные ограничения: ссылки на цвета темы читаются как 0; переопределения
iconIdдля каждой точки остановки не захватываются; атрибутpriorityу<cfRule>игнорируется при чтении
Версия 2.37.0
Добавлено
- Запись CFEX добавляет байт флага версии (ver=1), чтобы более старые читатели HotXLS, ожидающие минимальный layout CFEX v2.34.0, молча возвращались к устаревшей интерпретации. Читатель v2.37.0 также распознаёт записи ver=0, созданные более старыми сборками
- Читатель теперь обнаруживает смешанные записи CONDFMT + CONDFMT12 в одном диапазоне — распространённый шаблон в файлах, сохранённых Excel. Более старая запись CONDFMT помечается через новое свойство
IsShadowedнаTCondFormat. Писатель продолжает выводить оба семейства записей при сохранении - Новое свойство
TotalRangeнаTCondFormatпредоставляет ранее приватный объединённый диапазон
Изменено
- Формат записи BIFF8 CFEX теперь несёт полный массив cfvo для каждой точки остановки (kind + строка значения + цвет, согласно семантике cfvo [MS-XLS]) вместо только цвета полосы/остановки. Правила гистограммы теперь сохраняют типы и значения порогов min/max, цветовые шкалы сохраняют комбинацию kind + value + color каждой точки остановки, а наборы значков сохраняют kind + value каждого порога вместе с флагами reverse / showOnly
- Известные ограничения: обнаружение тени ограничено точным совпадением ограничивающей рамки. Полный cfvo round-trip ColorScale сохраняет 8 стандартных значений kind, но не сохраняет метаданные оттенка цвета темы Excel
Версия 2.36.0
Добавлено
- Вывод XLSX (.xlsx) теперь поддерживает три типа правил расширения условного форматирования Excel 2007+ — гистограмма, цветовая шкала (2-stop и 3-stop) и набор значков — приводя бэкенд XLSX в паритет с бэкендом BIFF8 (.xls) из v2.34.0. Четыре новых публичных метода на
TXLSXWorksheetотражают API XLS:AddCondFormatDataBar,AddCondFormatColorScale2,AddCondFormatColorScale3,AddCondFormatIconSet - Встроенное сопоставление имён наборов значков охватывает те же семнадцать базовых наборов Excel 2007, поддерживаемых бэкендом XLS, выводимых как стандартная строка атрибута OOXML
iconSet - Известные ограничения: тематическая кодировка цвета ещё не выводится; переопределения
iconIdдля каждой точки остановки в наборах значков не поддерживаются. Распознавание стороны чтения XLSX входящих правил гистограмм / цветовых шкал / наборов значков из файлов, сохранённых Excel, остаётся отложенным — в этом выпуске подключена только запись
Изменено
- Сохранённый файл .xlsx теперь выводит элемент OOXML
<conditionalFormatting>с соответствующей дочерней структурой для каждого типа правила:<cfRule type="dataBar"><dataBar>для гистограмм,<cfRule type="colorScale"><colorScale>с 2 или 3 cfvo + color stops, и<cfRule type="iconSet"><iconSet iconSet="...">с соответствующим набором cfvo
Исправлено
- Типы порогов и значения цветов используют то же перечисление и соглашение о цвете, что и API XLS — то же
TXLSCfValueKind, тот же формат Delphi BGRLongWord. Существующие вызовы XLSXAddConditionalFormatпродолжают вести себя идентично
Версия 2.35.1
Добавлено
- Поведение round-trip: цикл load-edit-save теперь отражает любое изменение
Rule.Styleпосле загрузки. Если пользователь читает книгу, изменяетRule.Style.SetFontColorи сохраняет, новый цвет побеждает; если пользователь не трогает Style, сохранённый файл несёт те же переопределения, что и оригинал - Неизвестные значения
xfPropTypeв DXF blob пропускаются, а не отклоняются, поэтому более новые файлы Excel, использующие типы свойств, ещё не распознанные этим выпуском, продолжают загружаться (сырые байты остаются вDxfBlobдля проверки или будущей поддержки round-trip)
Изменено
- Читатель BIFF8 теперь декодирует байты Differential XF (DXF), прикреплённые к правилу CF12, обратно в property bag
TXLSDxfStyleправила, в дополнение к сохранению сырых байтов вDxfBlob. Загрузка книги, сохранённой Excel, со стилизованными правилами гистограммы / шкалы цветов / набора значков теперь предоставляет цвет шрифта, цвета заливки, жирный / курсив / подчёркивание и идентификатор числового формата напрямую через паруHasXxx+значение на каждомRule.Style
Версия 2.35.0
Добавлено
- Правила условного форматирования теперь могут нести переопределение стиля Differential XF (DXF), так что правило CF12, срабатывающее в Excel, может изменить цвет шрифта, заливку, насыщенность, курсив, подчёркивание или числовой формат ячейки без изменения базового XF ячейки. Переопределение представлено как новое свойство
TXLSDxfStyleна каждомTCondFormatRule, доступное после создания правила через существующие APIAddCondFormatDataBar/AddCondFormatColorScale*/AddCondFormatIconSet - Известные ограничения: кодировка тематического цвета для DXF не поддерживается (только RGB); переопределения границ и точки остановки градиента отсутствуют в наборе свойств этого выпуска; порядок байтов для блобов значений XFProp следует публичным заметкам [MS-XLS] и может потребовать небольших корректировок для полной точности round-trip Excel после проверки с помощью BiffView. Паритет стороны XLSX для трёх новых типов правил остаётся отложенным
- Поддерживаемые переопределения стиля в этом выпуске: цвет шрифта, цвет фона заливки, цвет переднего плана заливки, узор заливки, шрифт жирный, шрифт курсив, стиль подчёркивания шрифта, и идентификатор встроенного числового формата. У каждого свойства есть парный флаг
HasXxx— только свойства, явно установленные черезSetXxx, выводятся в файл BIFF8
Изменено
- Писатель BIFF8 теперь добавляет непустой блок DXF к записи CF12, когда у Style правила установлено хотя бы одно переопределение. Блок DXF использует публичный layout массива XFProp (cxfp + кортежи на каждое свойство тип / размер / данные), позволяя Excel улавливать изменения стиля при применении правила
- Читатель BIFF8 сохраняет сырые байты DXF из файла, сохранённого Excel, в свойство
DxfBlobправила, поэтому round-trip load-edit-save больше не теряет молча стиль ячейки, переносимый правилами CF12. Декодирование сырых байтов обратно в property bagTXLSDxfStyleзапланировано на последующий выпуск - Поведение по умолчанию не изменилось для правил, которые не подключают стиль — выводится
cbdxf = 0, идентично v2.34.0, поэтому существующие правила гистограммы / шкалы цветов / набора значков отрисовываются точно так же, как раньше
Версия 2.34.0
Добавлено
- Новый публичный API условного форматирования на листе для правил расширения Excel 2007+:
AddCondFormatDataBar,AddCondFormatColorScale2,AddCondFormatColorScale3иAddCondFormatIconSet. Каждый метод принимает диапазон sqref вида"A1:A10"плюс параметры, специфичные для типа (цвет полосы, цвета остановок градиента или семейство набора значков), и возвращает созданный объект правила - Писатель BIFF8 (.xls) теперь выдаёт соответствующие записи Запись CONDFMT12 / CF12 / CFEX наряду с существующими записями CONDFMT / CF по значению ячейки, поэтому книги, созданные через новый API, сохраняют свои правила гистограмм, шкал из 2 или 3 цветов и наборов значков на диске
- Существующее поведение правил по значению ячейки не изменилось; добавлены только новые API и новая обработка записей BIFF8
- Известные ограничения этой версии: вывод XLSX для трёх новых типов правил пока не подключён (существующие правила XLSX по значению ячейки не затронуты); блок дифференциального стиля XF в CF12 выводится пустым, поэтому Excel может отображать полосы и шкалы цветами по умолчанию вместо цветов, предоставленных API; массивы cfvo для каждой точки остановки в CFEX несут только цвет, а не комбинацию тип / значение. Эти пробелы запланированы для последующих выпусков v2.34.x / v2.35.x вместе с демонстрационной книгой и проверкой рендеринга в Excel
Изменено
- Встроенный каталог наборов значков охватывает семнадцать базовых наборов Excel 2007 (семейства 3 стрелки / 3 флага / 3 светофора / 3 знака / 3 символа, 4 стрелки / 4 оценки / 4 светофора, и 5 стрелок / 5 оценок / 5 четвертей), выбираемых через перечисление
TXLSIconSetType - Типы порогов для границ гистограммы и точек остановки шкал цвета / наборов значков могут быть число, минимум / максимум диапазона, процент, процентиль или формула, соответствуя типам cfvo Excel
Удалено
- Читатель BIFF8 распознаёт поступающие записи CONDFMT12 / CF12 / CFEX и предоставляет их через ту же модель правил в памяти, так что .xls-файлы, созданные Excel с правилами расширения, больше не отбрасываются молча при загрузке
Версия 2.33.3
Добавлено
- Новый демо Delphi Поддержка XlsTables в
Demo/Delphi/XlsTables/демонстрирует сторону записи Tables BIFF8 (ListObjects) от начала до конца. Он генерируетSalesTable.xlsс областью продаж из четырех столбцов (Регион / Продукт / Квартал / Выручка), связанной как Table в A1:D10 с использованиемSheet.AddTable('SalesTable', 'A1:D10', headers). Откройте созданный .xls в Excel, чтобы проверить раскрывающиеся списки столбцов, чередующиеся полосы строк и имя структурированной ссылки SalesTable в Поле имени
Изменено
- Демо — это самый короткий сквозной рецепт для принятия API
AddTablev2.33.0: устанавливаетStyleName = 'TableStyleMedium2'иShowRowStripes = True, заполняет девять строк данных + одну строку заголовка и записывает рабочую книгу одним вызовомSaveAs. Вывод идёт рядом с исполняемым файлом - Инфраструктура компиляции не изменилась: существующий
build-Win32-Demo.cmdавтоматически подхватываетXlsTables.dprчерез свой обходfor /r Demo *.dpr— никаких изменений в сценариях сборки или конфигурациях .cbproj/.dproj не требуется
Версия 2.33.2
Изменено
- Проверка покрытия консервативна: Table считается "покрывающей" автофильтр только когда её первая/последняя строка и первый/последний столбец охватывают границы автофильтра. Частичное перекрытие сохраняет поведение выпуска автофильтра на уровне листа
- Сохранения BIFF5 и рабочие листы без таблиц не затронуты — проверка подавления выполняется только когда формат файла — BIFF8 и рабочий лист содержит хотя бы одну Table. Изменений в публичном API нет
Исправлено
- BIFF8 (.xls)
SaveAsтеперь подавляет автономные записи на уровне листаAUTOFILTERINFO/AUTOFILTER($009D / $009E), когда Table на том же листе полностью покрывает диапазон автофильтра. Excel встраивает раскрывающийся список автофильтра внутрь самого объекта Table, поэтому выпуск дополнительного автофильтра на уровне листа для идентичного диапазона приводит к отклонению файла валидацией файлов Office. Это соответствует исправлению на стороне XLSX, поставленному в v2.29.4
Версия 2.33.1
Добавлено
- Сторона чтения BIFF8 (.xls) теперь распознает записи Tables общих функций, которые v2.33.0 добавила на стороне записи. Открытие .xls, сохраненного Excel (или самим HotXLS) с одним или несколькими ListObjects/Tables, теперь заполняет коллекцию
Tablesрабочего листа объектомTXLSTableдля каждой проанализированной записи FEAT11 ($0872), восстанавливая диапазон таблицы из первичного Ref8U, восстанавливая id, имя и имя отображения таблицы при их наличии, и заполняя имя стиля таблицы из парной записи LIST12 ($0877). Ранее эти записи молча игнорировались
Изменено
- Общий opcode FEATHEADR ($0867) теперь распределяется по полю
Isfвместо того, чтобы всегда направляться в парсер защиты. Isf=2 (Расширенная защита) сохраняет существующее поведение; Isf=4 (SharedList) распознается как маркер для Tables на листе; Isf=3 (SmartTags) и другие значения безопасно игнорируются. FEATHEADR11 ($0871) также молча распознается как маркер Tables
Исправлено
- Читатель работает в режиме наилучшего усилия и толерантен: неправильно сформированные или варианты Excel полезные нагрузки FEAT11 элегантно деградируют до Table, которая имеет хотя бы правильный диапазон ячеек. Защита листа round-trip не изменилась
Версия 2.33.0
Добавлено
- Новый публичный API в
IXLSWorksheet: свойствоTables: TXLSTables(коллекция только для чтения) и методAddTable. Форма зеркально отражаетTXLSXTable/TXLSXTablesна стороне XLSX.TXLSTableпредоставляетId,Name,DisplayName,Range,Columns,StyleName(по умолчанию'TableStyleMedium2'),ShowFirstColumn,ShowLastColumn,ShowRowStripes(по умолчанию true),ShowColumnStripesиTotalsRowShown - Новые записи потока листа испускаются непосредственно перед EOF рабочего листа, после защиты листа, только когда формат файла — BIFF8 (
xlExcel97). Рабочие книги без таблиц сохраняются точно так же, как и раньше — FEATHEADR не испускается, изменений в потоке записей нет, накладных расходов нет. Сохранения BIFF5 не затрагиваются - Известные ограничения этого первоначального выпуска (v2.33.0): формулы строки итогов и вспомогательные диапазоны структурированных ссылок еще не испускаются; подавление конфликта между
AUTOFILTERINFOна уровне листа и диапазоном Table будет добавлено в последующем релизе; сторона чтения (разбор сохраненного Excel-ом .xls с таблицами обратно в коллекциюTables) также является последующим релизом
Изменено
- ID таблиц назначаются последовательно для каждого листа (1..N) во время сохранения, если не были предварительно установлены. Имя стиля по умолчанию
'TableStyleMedium2'совпадает с тем, что уже используют Excel и сторона XLSX
Удалено
- Рабочие листы BIFF8 (.xls) теперь поддерживают объекты Table (Excel ListObject). Вызовите
Worksheet.AddTable(Name, Range, Columns)наIXLSWorksheet, чтобы прикрепить именованную область таблицы к диапазону ячеек — например,Sheet.AddTable('SalesTable', 'A1:F9', HeaderList). Путь сохранения .xls теперь генерирует семейство записей общих функций BIFF8, помечающих лист как содержащий Table: FEATHEADR ($0867 с Isf=4), FEATHEADR11 ($0871) и пару FEAT11 ($0872) + LIST12 ($0877) на каждую таблицу. Ранее вызовAddTableна фасаде XLS был недоступен; таблицы, определенные на рабочем листе, молча отбрасывались приSaveAs(xlExcel97)
Версия 2.32.1
Исправлено
- Исправлена ошибка компиляции, появившаяся в функции записи FILEPASS версии v2.32.0, которая препятствовала сборке библиотеки в RAD Studio 12+ со строгой проверкой типов. Помощник
EncryptAllBlobsобъявлял свой буфер рассеяния какPByteв контексте, гдеPByteразрешался в локальный псевдонимlxHandle, тогда как целевой вызовEncryptBlobDataвlxEncrypterожидалlxBLOB.PByte. Хотя оба типа являются псевдонимами для^Byte, Delphi рассматривает их как различные при строгой проверке типов E2010. Теперь переменная буфера полностью квалифицирована какlxBLOB.PByte, поэтому путь шифрования паролем v2.32.0 чисто компилируется во всех поддерживаемых версиях RAD Studio (12.0–37.0)
Версия 2.32.0
Изменено
- Путь записи выводит запись BIFF8 FILEPASS ($002F) сразу после BOF книги и шифрует RC4 каждое последующее тело записи тем же алгоритмом, что и сторона чтения (vMajor=1, vMinor=1 -- шифрование "Office 97/2000 Compatible" от Excel). 16-байтовые Salt и Verifier генерируются через Windows
CryptGenRandom, а не через PascalRandom. Повторная деривация ключа блока на каждой границе 1024 байт сохранена - Шифрование применяется только к BIFF8 (
xlExcel97); путь BIFF5 остаётся в открытом виде. ПустойEncryptionPasswordсохраняет прежнее поведение открытого текста (по умолчанию), существующие приложения не затронуты - Примечание безопасности: BIFF8 RC4 (vMajor=1/vMinor=1) использует 40-битный ключ, считающийся взломанным по стандартам 2025 года. Используйте эту функцию для совместимости с классическим интерфейсом защиты паролем Excel, а не для конфиденциальности чувствительных данных. Для реальной безопасности предпочитайте XLSX + AES
Исправлено
- Новое свойство
EncryptionPasswordвIXLSWorkbook. Установка непустого пароля передSaveAsтеперь создаёт совместимый с Excel защищённый паролем .xls файл: Excel, LibreOffice Calc и другие BIFF8-читатели запрашивают пароль при открытии и отказывают в доступе при неверном пароле. Ранее установщик пароля молча игнорировался на стороне записи - Сторона чтения: исправлена скрытая ошибка в
ParseFilePass, из-за которой первое тело записи после FILEPASS (обычно CODEPAGE) обрабатывалось как открытый текст. Зашифрованные файлы, записанные HotXLS, теперь корректно проходят туда-обратно через HotXLS
Версия 2.31.0
Добавлено
- В
IXLSWorkbookдобавлено свойствоUseSharedFormulas. При значенииTrueметод SaveAs в формате BIFF8 группирует ячейки с эквивалентными формулами-шаблонами в нативные записи SHRFMLA ($04BC), соответствуя компактному формату Microsoft Excel. Столбцы формул вида=A1*B1,=A2*B2, …,=A99*B99группируются автоматически, уменьшая размер файла на 30–60 % на листах с большим количеством однотипных формул - Сторона чтения не затронута. Это MINOR-обновление версии (2.30.x → 2.31.0): добавлено новое публичное свойство, и при включённой функции меняется формат вывода BIFF8
Изменено
- Группировка выполняется по столбцу вниз, последовательно, на основе шаблона: группируются только ячейки одного столбца с последовательными строками и PTG-эквивалентными формулами. Ячейки с формулами массива или флагами объединения исключаются
- Значение по умолчанию —
False, прежняя посячейная запись FORMULA-записей остаётся без изменений. Для включения установитеWorkbook.UseSharedFormulas := Trueперед вызовомSaveAs
Версия 2.30.6
Исправлено
- Исправлен четвёртый класс ошибок компиляции в демонстрационных проектах C++Builder под компилятором bcc32 на основе clang в RAD Studio 37.0: паттерн индексации
->Borders[idx]->Propпо умному указателю интерфейса вызывал ошибку E5843 ("тип ссылки на член не является указателем"). Все вхождения изменены на->Borders->Item[idx]->Prop. Исправление затрагивает демо-проекты ApiTour, ExportWithColoring, PurchaseOrder и QuickStart и завершает полную совместимость с компилятором clang для всех девяти демо-проектов C++Builder
Версия 2.30.5
Исправлено
- Все девять демонстрационных проектов C++Builder теперь успешно компилируются под компилятором bcc32 на основе clang в RAD Studio 37.0. Исправлены три класса ошибок компиляции: свойство
EOFвlxFormulaпереименовано вIsEofдля устранения конфликта с макросом Cstdio.h; константы перечисления XLS API (xlHAlignCenter,xlAround,xlMediumи др.) в демонстрационном коде C++Builder теперь явно квалифицированы пространством имёнLxhandle::; присваивание значений ячеек XLSX изменено сOleVariant(...)наVariant(...), посколькуTXLSXCell.Valueимеет типSystem::Variant, а компилятор clang отклоняет неявное преобразование из защищённой базовой классOleVariant
Версия 2.30.4
Изменено
- Демо OrderCalc (пример заказа на покупку для Delphi) теперь включает опцию экспорта в XLSX наряду с существующими форматами XLS, HTML и RTF. При выборе «Excel 2007+ (*.xlsx)» в диалоге сохранения заказ записывается через нативный API TXLSXWorkbook, создавая напрямую стандартный XLSX-файл со шрифтами, заливками, рамками, выравниванием, числовыми форматами и формулами Excel
Версия 2.30.3
Изменено
- SaveXLSWorkbookAsXLSX (мост, используемый TDataToXLS.SaveAs и TGridToXLS.SaveAs, когда имя целевого файла оканчивается на .xlsx) теперь копирует цвета заливки фона ячеек, цвета шрифта и атрибуты стиля шрифта (имя, размер, жирный, курсив) из базовой рабочей книги XLS в выходной файл XLSX. Ширины столбцов — включая намеренно узкие декоративные столбцы — также копируются. Ранее передавались только значения и числовые форматы, поэтому выходной файл XLSX был без форматирования, все ширины столбцов имели значения по умолчанию, а любой намеренно узкий декоративный столбец выглядел как увеличенный пустой столбец
Версия 2.30.2
Исправлено
- Исправлена ошибка round-trip в читателе XLS, при которой направление Outline.SummaryRow инвертировалось после Open. Флаг fRwSumsBelow в записи WSBOOL (спецификация BIFF8 p278 byte 0 bit 6, маска $0040) означает «итоговые строки находятся *под* подробностями», но ранее парсер устанавливал SummaryRow = xlAbove, когда бит был установлен (и xlBelow, когда сброшен) -- ровно наоборот относительно спецификации. Сторона писателя уже была правильной (выдаёт $0040 для xlBelow), поэтому открытие Excel-файла с «итоговыми строками под подробностями» и его повторное сохранение через HotXLS молча переворачивало направление outline на «над». Теперь направление парсинга соответствует спецификации и писателю, поэтому конфигурации outline корректно проходят round-trip. fColSumsRight ($0080) уже обрабатывался правильно и не изменялся
Версия 2.30.1
Изменено
- Писатель XLS (BIFF8) теперь выдаёт записи INTERFACEHDR / INTERFACEEND / WRITEACCESS в секции globals рабочей книги, соответствуя нативному расположению записей Microsoft Excel. Нативный Excel всегда пишет эту тройку между CODEPAGE/DSF и WINDOW1, и более строгие читатели BIFF / пути Office File Validation могут их ожидать. INTERFACEHDR несёт code page (1200, UTF-16), INTERFACEEND — пустой маркер, а WRITEACCESS несёт имя пользователя «сохранил» (в настоящее время жёстко задано как "HotXLS"; в будущем выпуске оно может быть продвинуто в свойство Workbook). Выходные XLS-файлы теперь более точно соответствуют нативному байтовому расположению Excel
Версия 2.30.0
Добавлено
- Добавлен мост экспорта classic-в-XLSX. TDataToXLS.SaveAs и TGridToXLS.SaveAs теперь записывают имена файлов .xlsx через движок XLSX, сохраняя без изменений существующие пути .xls, .html и .rtf
- Добавлены API представления рабочего листа для XLS и XLSX. IXLSWorksheet.View и TXLSXWorksheet.View поддерживают обычное представление, предварительный просмотр разрывов страниц и представление макета страницы, и настройка сохраняется соответствующим путём писателя/читателя файлов
- Добавлены классические API совместимости рабочей книги: IXLSWorkbook.SetCodePage и IXLSWorkbook.VBAProject. Проекты VBA теперь можно инспектировать через имена модулей TXLSVBAProject/TXLSVBAModule и исходный текст, когда рабочая книга содержит хранилище VBA
- Добавлен опциональный unit cxGridAddExcel для рабочих процессов экспорта DevExpress cxGrid. Он намеренно не включён в пакеты по умолчанию, чтобы установки без DevExpress продолжали собираться без ошибок
Изменено
- TXLSXWorkbook расширен ParsedVBAProject — представлением только для чтения, разобранным над валидной полезной нагрузкой vbaProject.bin, при этом сохраняется существующее поведение round-trip сырых байтов VbaProject
Исправлено
- Исправлен рендеринг листов диаграмм XLSX, при котором диаграмма выглядела пустой при открытии рабочей книги в Excel (только что открытый лист диаграммы кратко показывал 3 значка контекста диаграммы в правом верхнем углу, а затем сбрасывал их, оставляя лист пустым). Чертежи листов диаграмм теперь используют <xdr:absoluteAnchor> с явным размером (~10in × 7.2in = 9525000 × 6858000 EMU) вместо <xdr:twoCellAnchor> с cx=0/cy=0; листы диаграмм не имеют сетки ячеек, относительно которой можно было бы разрешить twoCellAnchor, поэтому Excel откатывался на внутренний xfrm нулевого размера и рендерил диаграмму с нулевым числом пикселей. Согласно ECMA-376-1 14.2.3.2, чертежи листов диаграмм должны использовать absoluteAnchor. Якоря диаграмм рабочих листов не изменены
Версия 2.29.4
Изменено
- Обновлён демо MemoryDataExport (XlsxFeatureGallery), чтобы убрать избыточный вызов SetAutoFilter('A1:F9') на листе Details -- AddTable уже прикрепляет autoFilter к диапазону таблицы, поэтому дополнительный вызов ранее вызывал указанный выше отказ OFV. Защитное подавление в писателе покрывает клиентский код, который не получил обновление демо
Исправлено
- Также прекращена эмиссия избыточного файла xl/worksheets/_rels/sheetN.xml.rels для листов с диаграммами, добавленных через AddChartSheet. Дублирующий файл отношений указывал на несуществующую часть листа и появлялся как «сирота» внутри zip .xlsx; листы с диаграммами теперь записывают только корректный xl/chartsheets/_rels/sheetN.xml.rels
- Исправлена ошибка упаковки XLSX, которая вызывала окно восстановления Excel «Обнаружена проблема с некоторым содержимым в <file>.xlsx» в рабочих книгах, где autoFilter уровня листа и Таблица покрывали один и тот же диапазон (например, лист Details из XlsxFeatureGallery.xlsx демонстрации MemoryDataExport, который вызывал AddTable('SalesTable', 'A1:F9', ...) с последующим SetAutoFilter('A1:F9')). OOXML запрещает два механизма фильтрации на одном диапазоне; писатель теперь подавляет дублирующую эмиссию <autoFilter> на уровне листа, когда его диапазон совпадает с диапазоном любой таблицы. Собственный autoFilter Таблицы (отображаемый как раскрывающиеся списки в заголовке таблицы) продолжает работать
- Исправлено связанное нарушение схемы в выводе <dataValidation>: атрибут operator выдавался для каждой валидации, но ECMA-376-1 18.3.1.32 разрешает его только для типов whole / decimal / date / time / textLength. AddListValidation создаёт type="list", который ранее «утекал» с operator="between"; OFV строже Excel в этом отношении и мог отклонить рабочую книгу. Атрибут operator теперь опускается для list / custom / none
- Исправлен элемент <legacyDrawing r:id="..."/> на листах, в которых смешаны внутренние и внешние гиперссылки с комментариями (лист Dashboard XlsxFeatureGallery.xlsx содержит 1 внутреннюю + 1 внешнюю + 1 комментарий). Подсчёт rId считал все гиперссылки вместо только внешних (внутренние используют встроенный атрибут location= и не потребляют rId), поэтому legacyDrawing указывал на целевой rels комментариев вместо vmlDrawing. ECMA-376-1 18.3.1.51 требует, чтобы legacyDrawing ссылался на rels типа vmlDrawing. Теперь rId вычисляется только из числа внешних гиперссылок
Версия 2.29.3
Исправлено
- Исправлена регрессия round-trip XLSX, при которой границы, нарисованные на иначе пустых строках, терялись после Open + modify + SaveAs. Горизонтальный разделитель строки 8 ApiTour (создаваемый вызовом Range.SetBorders на строке без данных) корректно отображался в свежесгенерированном ApiTour.xlsx, но исчезал в ApiTour-XLSX-Modified.xlsx после того, как этап Modify демо повторно сохранял файл, оставляя Excel показывать сломанную вертикальную линию сетки в C8 / D8 только в изменённом файле (оригинальный ApiTour.xlsx не затрагивался). Парсер XLSX теперь также применяет стили ячеек, когда элемент `<c>` является самозакрывающимся или не имеет дочерних элементов value/formula, поэтому стилизованные ячейки без значения переживают round-trip
Версия 2.29.2
Исправлено
- Исправлена регрессия round-trip XLSX в потоках Open + modify + SaveAs. Когда ParseWorksheetXml читал ячейку, чей <c s="N"/> ссылался на cellXf из styles.xml, он сохранял N напрямую в cell.FormatIndex. При SaveAs cellXfs перестраиваются из пулов стилей рабочей книги (с опциональными составными записями), и слот нового макета на том же числовом индексе почти никогда не несёт ту же семантику; пересохранённая ячейка указывала на неверный cellXf -- или за пределы новой таблицы cellXfs -- и Excel сообщал «Office обнаружил проблему с этим файлом. Можно попробовать восстановить его». ApplyStyle теперь обратно отображает cellStyle на FontIndex / FillIndex / BorderIndex / NumberFormatIndex / AlignmentIndex / ProtectionIndex через таблицы CellXfXxxMap, которые ParseStylesXml уже заполняет, поэтому round-trip заново выдаёт ячейку относительно свежепостроенных cellXfs
Версия 2.29.1
Исправлено
- Исправлены две регрессии рендеринга XLSX, выявленные демо ApiTour: (1) ячейки внутри строки могли выдаваться вне порядка столбцов, когда вызов Range.SetBorders добавлял ячейки в немонотонном порядке (например, этап outline создаёт A8/C8, этап inside создаёт B8 -- вывод был A8 / C8 / B8 / вместо A8 / B8 / C8 / поэтому Excel сообщал «Office обнаружил проблему с этим файлом» и принудительно включал Protected View). Писатель XLSX теперь сортирует ячейки каждой строки по столбцам перед эмиссией, соответствуя схеме OOXML CT_Row. (2) Ячейки, в которых одновременно устанавливалось 2 или более индексов стиля (Font + Fill + Border и т. д.), сжимались в одномерный cellXf через цепочку приоритетов (FontIndex побеждал, Border / Fill отбрасывались), поэтому, например, строка заголовка с FontIndex + FillIndex + BorderIndex, установленными вызовом Range[..].SetBorders, отображалась без границ. Писатель теперь собирает составной пул cellXf во время SaveAs и направляет многомерные ячейки в синтезированный cellXf, который сохраняет каждое измерение
Версия 2.29.0
Изменено
- Внутренний вспомогательный unit `lxList2` переименован в `lxKeyList`, а классы `lxList` с ключом WideString переименованы из `TXLSKeyList` / `TXLSKeyEntry` / `TXLSKeyArray` в `TXLSStringKeyList` / `TXLSStringKeyEntry` / `TXLSStringKeyArray`, чтобы имя unit соответствовало его основному классу `TXLSObjectKeyList`, а два поколения key-list были самоописательными (`TXLSStringKey*` для устаревшего пула с ключом WideString, `TXLSObjectKey*` для пула дедупликации на основе THashtableKey). Если ваш код ссылается на старое имя unit или имена классов, обновите предложения uses и имена типов соответственно
Версия 2.28.3
Исправлено
- Исправлена регрессия эмиссии ячеек XLSX, из-за которой границы, установленные на иначе пустых строках, исчезали. `Range[''A3:C10''].SetBorders(xlsxEdgeOutline,...)` на листе, в котором строка 8 не содержала данных, ранее отображала вертикальную линию сетки C/D разорванной в этой строке, поскольку писатель пропускал любую ячейку, в которой Value не было присвоено -- даже если ячейке был присвоен BorderIndex / FontIndex / FillIndex / NumberFormatIndex / AlignmentIndex / ProtectionIndex. Писатель теперь выдаёт `<c r='..' s='..' />` для ячеек без значения, которые несут любой индекс стиля
Версия 2.28.2
Исправлено
- Исправлено нарушение схемы листа XLSX, из-за которого Excel отказывался загружать листы, в которых сочетались объединённые ячейки и AutoFilter. Писатель XLSX теперь выдаёт элемент <autoFilter> перед <mergeCells>, соответствуя последовательности OOXML CT_Worksheet (autoFilter — #11, mergeCells — #15). Ранее такие рабочие книги вызывали диалог восстановления Excel с `Load error. Line 1, column 0` на sheet1.xml, и восстановление также удаляло tableParts / autoFilter с соседних листов Details
Версия 2.28.1
Добавлено
- Добавлены удобные API для классического интерфейса XLS. Теперь IXLSRange предоставляет помощники только для чтения Width и WidthInPixels, а также SaveAsCSV(FileName); IXLSWorksheet и IXLSWorkbook предоставляют перегрузки SaveAsCSV(FileName / Stream) для указанного диапазона или активного листа; IXLSPageSetup предоставляет Order, Draft, BlackAndWhite, PrintNotes и только для чтения IsFitToPages. Теперь при сохранении/открытии записи SETUP сохраняются эти флаги печати
Версия 2.28.0
Добавлено
- Добавлен экспорт в формат RTF для TXLSXWorkbook. Новые перегрузки SaveAsRTF (FileName / Stream x default-active-sheet / explicit SheetIndex) записывают выбранный лист как документ RTF 1.6, содержащий простую таблицу. Ширина столбцов определяется данными ColWidth листа (1 единица Excel соответствует примерно 96 RTF twips); столбцы без явной ширины используют StandardWidth, если он задан, в противном случае - 809 twips (примерно 8.43 символа). Форматирование ячеек (полужирный, курсив и размер шрифта) применяется из FontIndex ячейки. Не-ASCII символы кодируются как RTF \\uN? unicode escapes в соответствии с RTF 1.6 §2.4.2, охватывая весь диапазон BMP. Объединенные ячейки не охватываются — содержимое отображается в исходной ячейке, а остальные ячейки в диапазоне отображаются как пустые. Значение SheetIndex по умолчанию записывает активный лист; значение вне диапазона возвращает -1. Пустые листы создают минимальный допустимый документ RTF
Версия 2.27.0
Добавлено
- Добавлен экспорт в HTML для TXLSXWorkbook. Новые перегрузки SaveAsHTML (FileName / Stream x default-active-sheet / explicit SheetIndex) записывают выбранный лист как HTML-документ в кодировке UTF-8 с BOM. Результатом является одна таблица <table> внутри минимальной HTML-страницы. Объединенные ячейки отображаются как атрибуты colspan / rowspan. Форматирование ячеек отображается как встроенные CSS: шрифт, размер (pt), полужирный (font-weight:bold), курсив (font-style:italic), перечеркивание (text-decoration:line-through) и явный цвет шрифта; однотонная заливка отображается как background-color; горизонтальное выравнивание (слева / по центру / справа / по ширине) и WrapText (white-space:pre-wrap). Значения дат отображаются как 'yyyy-mm-dd hh:nn:ss'; ячейки с расширенным текстом преобразуются в объединенный текст. Цвета темы игнорируются (файл theme1.xml не используется в простом экспорте в HTML). Значение SheetIndex по умолчанию записывает активный лист; значение вне диапазона возвращает -1
Версия 2.26.0
Добавлено
- Добавлена поддержка цветовых тем, индексных цветов и оттенков/нюансов для TXLSXFont, TXLSXFill и TXLSXBorderEdge. Каждый цветовой слот теперь содержит три новых поля, помимо существующего RGB-цвета: ColorTheme (целое число; -1 = не задано; 0..11 = слот цветовой темы OOXML), ColorIndex (целое число; -1 = не задано; 0..63 = слот палитры OOXML устаревшего формата — сопоставляется с Workbook.IndexedColor[N] и XlsxDefaultIndexedPalette) и TintAndShade (дробное число в диапазоне [-1.0, 1.0]; выводится только при использовании темы). TXLSXFill предоставляет варианты Foreground (передний план) и Background (задний план) для всех трех. Приоритет при сохранении: тема > индексный > RGB; старый путь "ColorIsAuto = True" по-прежнему подавляет элемент. Функции SaveAs и Open сохраняют и восстанавливают полные атрибуты <color theme="N" tint="..."/> и <color indexed="N"/> для цветов шрифта, заливки и границ. Для учета: TXLSXBorders.LookupOrAdd теперь сравнивает все три новых поля, чтобы цветные границы, использующие тему, не конфликтовали с записями, использующими RGB, в пуле
Версия 2.25.0
Добавлено
- Добавлена поддержка двусторонней работы со ссылками на внешние книги. Новые типы: TXLSXExternalLink (целевой URL + список имен листов) + коллекция TXLSXExternalLinks. Свойство TXLSXWorkbook.ExternalLinks предоставляет доступ к коллекции; метод Add(Target) добавляет новую ссылку, которую вызывающий код заполняет. Функция SaveAs создает блок <externalReferences> на уровне книги в файле xl/workbook.xml, запись externalLink в файле xl/_rels/workbook.xml.rels (в конце диапазона rid, чтобы существующие rid оставались стабильными), файл xl/externalLinks/externalLink{N}.xml для каждой записи (<externalBook><sheetNames>) и связанный с ним файл .rels, указывающий на URL удаленной книги с TargetMode="External", а также соответствующие ContentType Overrides. Функция Open сканирует пары externalLink{N}.xml + .rels, начиная с индекса 1 и останавливается при первом пропуске. В текущей версии поддерживается только целевой URL и список имен листов; значения ячеек, хранящиеся в <sheetDataSet>, не сохраняются
Версия 2.24.0
Добавлено
- Добавлена функция `TXLSXRange.SetBorders` для создания сложных границ. Новый перечисляемый тип `TXLSXBorderEdgeKind` (xlsxEdgeAll / Outline / Inside / InsideHorizontal / InsideVertical / Top / Bottom / Left / Right / DiagonalUp / DiagonalDown) позволяет выбирать, какие грани записывать. `SetBorders(Kind, Style, Color)` / `SetBorders(Kind, Style)` (по умолчанию - непрозрачный черный) перебирает каждую ячейку в диапазоне, вычисляет маску грани для каждой ячейки (угловые ячейки получают две внешние грани, граничные ячейки - одну, внутренние ячейки - внутренние линии сетки), комбинирует `Style` + `Color` с клоном текущей границы ячейки (поэтому последовательные вызовы `Outline + Inside` добавляются, а не перезаписывают), затем выполняет поиск или добавление на уровне книги в `Workbook.Borders` и записывает полученный индекс границы (1-based) обратно в ячейку. Новая функция `TXLSXBorders.LookupOrAdd` возвращает 0 для пустых границ, чтобы избежать ненужных записей в пуле
Версия 2.23.0
Добавлено
- Добавлены перегруженные функции экспорта в CSV для `TXLSXWorkbook`. Новые точки входа: `SaveAsCSV(FileName) / SaveAsCSV(FileName, SheetIndex, Delimiter) / SaveAsCSV(Stream) / SaveAsCSV(Stream, SheetIndex, Delimiter)` записывают заполненную область выбранного листа в кодировке UTF-8 с начальным BOM и символами конца строки CRLF. Варианты по умолчанию выбирают активный лист и запятую в качестве разделителя; перегруженные варианты `SheetIndex/Delimiter` принимают любой `WideChar` (обычно табуляция #9 для TSV). Заключение полей соответствует RFC 4180 - значения, содержащие разделитель, двойную кавычку, CR или LF, заключаются в кавычки, а встроенные кавычки удваиваются. Значения даты отображаются как 'yyyy-mm-dd hh:nn:ss'; ячейки с форматированным текстом преобразуются в объединенный текст; пустые ячейки во внутренней области ограничивающей рамки отображаются как просто разделители, и строка заканчивается на последней заполненной колонке
Версия 2.22.0
Удалено
- Добавлены переопределения цветовой палитры на уровне книги для `TXLSXWorkbook`. Новые точки входа: `IndexedColor[Index: Integer]: LongWord` (чтение/запись, допустимые слоты 0..63, LongWord в формате ARGB), `HasCustomIndexedColor(Index): Boolean` (возвращает, был ли слот переопределен вызывающим), `CustomIndexedColorCount: Integer` (количество переопределенных слотов; 0 = палитра выводится как стандартная), `ResetIndexedColors: procedure` (отбрасывает все переопределения). Новая константа `XlsxDefaultIndexedPalette` предоставляет стандартную палитру ECMA-376 для слотов 0..63. `SaveAs` выводит `<colors><indexedColors>` со всеми 64 дочерними элементами `<rgbColor>` только в том случае, если хотя бы один слот был переопределен; нетронутые слоты используют палитру по умолчанию, поэтому файлы, сохраненные без изменений, остаются чистыми. `Open` анализирует этот блок и молча отбрасывает слоты, значения которых совпадают со значениями по умолчанию, чтобы обеспечить минимальную обработку. Недопустимые значения слотов (меньше 0 или больше 63) отбрасываются вместо вызова исключения
Версия 2.21.0
Добавлено
- Добавлены шесть свойств отображения для TXLSXWorksheet: Zoom: Целое число, определяющее процент масштабирования, отображаемый в строке состояния Excel (от 10 до 400, по умолчанию 100; значения вне диапазона обрезаются при записи). DisplayGridLines / DisplayZeros: Булевы значения (по умолчанию True), скрывающие линии сетки ячеек или отображающие ячейки со значением 0 как пустые, если установлено значение False. DisplayRightToLeft: Булево значение (по умолчанию False), меняющее ориентацию листа на право-лево для арабского/еврейского и других языков. StandardWidth / StandardHeight: Число с плавающей точкой, устанавливающее ширину столбца (единицы символов Excel) / высоту строки (пункты); 0 означает, что значение не установлено, в этом случае Excel применяет свои значения по умолчанию 8.43 / 15. При сохранении SaveAs генерирует теги <sheetView showGridLines / showZeros / rightToLeft / zoomScale> и <sheetFormatPr defaultColWidth / defaultRowHeight> только в том случае, если значения отличаются от значений по умолчанию Excel; Open считывает их. Существующая обработка закрепленных панелей и выбранных вкладок в <sheetView> не изменена и теперь использует один и тот же механизм записи
Версия 2.20.7
Добавлено
- Добавлены перегрузки TStream для TXLSXWorkbook для сериализации в памяти. Новые точки входа: SaveAs(Stream: TStream) / SaveAs(Stream: TStream; FileFormat: TXLSXFileFormat) записывают весь пакет .xlsx в указанный поток, начиная с текущей позиции; Open(Stream: TStream) считывает его. Вызывающий код владеет потоком и должен освободить его. Полезно для HTTP-ответов, хранилищ BLOB, конвейеров в памяти и модульных тестов, которые обходят локальную файловую систему. Существующие перегрузки SaveAs / Open, основанные на файлах, не изменены и теперь используют одни и те же внутренние помощники для записи / чтения
Версия 2.20.6
Добавлено
- Добавлены свойства Hidden / Visible / Comment для TXLSXDefinedName. Hidden соответствует атрибуту OOXML <definedName hidden="1"> (по умолчанию False / Visible=True; True скрывает имя из интерфейса "Диспетчер имен" Excel). Visible - это псевдоним типа Boolean (обратное значение Hidden) для более понятного кода. Comment соответствует тегу <definedName comment="...">. SaveAs генерирует оба атрибута только в том случае, если они отличаются от значений по умолчанию; Open считывает их. SheetIndex (существующая привязка к локальной области через localSheetId) не изменена
Версия 2.20.5
Добавлено
- Добавлено пять дополнительных атрибутов шрифта в TXLSXFont. Новый перечислитель TXLSXFontVertAlign (xlsxVertAlignBaseline / Superscript / Subscript) управляет существующими в Excel флажками "Superscript" / "Subscript" с помощью одного свойства VertAlign (взаимно исключающие в пользовательском интерфейсе). Новые свойства OutlineFont и Shadow типа Boolean для соответствующих эффектов шрифта в Excel. Новый тип Integer Family (номер семейства шрифтов OOXML: 1=Roman / 2=Swiss / 3=Modern / 4=Script / 5=Decorative; 0=не задано) и CharSet (номер кодовой страницы GDI: 0=ANSI / 1=Default / 134=GB2312 / 136=ChineseBig5 / и т.д.; -1=не задано). Метод SaveAs создает соответствующие дочерние элементы <vertAlign> / <outline/> / <shadow/> / <family> / <charset> внутри элемента <font>; метод Open считывает их. ColorIndex / ThemeColor / TintAndShade будут реализованы в будущей версии, посвященной темам
Версия 2.20.4
Добавлено
- Добавлены переключатели направления диагональных линий границы. TXLSXBorder теперь предоставляет свойства DiagonalUp: Boolean и DiagonalDown: Boolean. Оба флага используют существующий стиль и цвет диагональной линии и определяют, какую диагональную линию(ии) Excel отображает: только вверх (снизу слева вверху справа), только вниз (сверху слева внизу справа) или обе. Метод SaveAs создает атрибуты diagonalUp / diagonalDown для элемента <border>, когда они установлены; метод Open считывает их. Ранее движок записывал одну диагональную линию без контроля направления, поэтому Excel никогда не рисовал ни одну из диагональных линий
Версия 2.20.3
Добавлено
- Добавлена опция Date1904 для рабочей книги. TXLSXWorkbook теперь предоставляет свойство Date1904: Boolean, которое позволяет выбирать между эпохой Windows 1900 (по умолчанию; соответствует Excel для Windows) и эпохой Mac 1904 (устаревший формат Excel для Mac). Метод SaveAs создает <workbookPr date1904="1"/> в файле xl/workbook.xml, когда эта опция включена; метод Open считывает ее. Этот флаг является только метаданными — движок не преобразует сохраненные значения; вызывающий код должен установить Date1904 перед присваиванием значений ячейкам типа TDateTime, чтобы обеспечить правильное отображение даты при сохранении и открытии
Версия 2.20.2
Добавлено
- Добавлена поддержка автоматической фильтрации по критериям для каждого столбца. Новые типы: TXLSXAutoFilterOp (Equal / NotEqual / GreaterThan / LessThan / GreaterOrEqual / LessOrEqual), TXLSXAutoFilterColumn (ColId + 1 или 2 критерия + соединитель AND/OR), TXLSXAutoFilterColumns. TXLSXWorksheet предоставляет свойство AutoFilterColumns и удобные методы AddAutoFilterColumn(ColId, Op, Criteria) / AddAutoFilterColumn(ColId, Op1, Criteria1, Op2, Criteria2, AndConnector) / ClearAutoFilterColumns. SaveAs расширяет существующий тег <autoFilter ref="..."/> в тело <filterColumn colId=N><customFilters and=0|1><customFilter operator="..." val="..."/>...</customFilters></filterColumn> для каждого столбца, когда заданы критерии; Open парсит ту же структуру. Ранее движок хранил только диапазон автоматической фильтрации (sqref), и Excel отображал пули выпадающих списков фильтров
Версия 2.20.1
Добавлено
- Добавлена поддержка ручных переносов на страницу на TXLSXWorksheet. Новые элементы: AddRowBreak(BeforeRow) / AddColBreak(BeforeCol) для вставки горизонтального или вертикального переноса на новую страницу перед указанной строкой/столбцом (семантика интерфейса Excel "Before" — строка N начинается с новой страницы). Методы проверки: HasRowBreak / HasColBreak; методы удаления: RemoveRowBreak / RemoveColBreak (удаляет один элемент); методы массового удаления: ClearRowBreaks / ClearColBreaks / ClearAllPageBreaks. RowBreakCount / ColBreakCount + индексированные RowBreaks(Index) / ColBreaks(Index) предоставляют доступ к хранимым индексам "Before" (с отсчетом от 1) для итерации. SaveAs генерирует <rowBreaks> / <colBreaks> с дочерними элементами <brk id="N-1" max="..." man="1"/> между <headerFooter> и <drawing>; Open парсит их обратно
Версия 2.20.0
Добавлено
- Добавлена поддержка видимости листа (Hidden / VeryHidden), выбор листа и отслеживание активного листа на TXLSXWorkbook / TXLSXSheets / TXLSXWorksheet. Новые типы: TXLSXSheetVisibility (xlsxSheetVisible / xlsxSheetHidden / xlsxSheetVeryHidden). Новые свойства TXLSXWorksheet: Visibility, Visible (булевский псевдоним), IsSelected (только для чтения). Новые члены TXLSXSheets: ActiveIndex, Activate(Index), Move(FromIndex, ToIndex). Добавлен прокси TXLSXWorkbook.ActiveSheet. SaveAs генерирует <sheet state="..."/> для записей листов в книге, <bookViews><workbookView activeTab=N/></bookViews>, когда активный лист не является значением по умолчанию 0, и атрибут tabSelected="1" для активного листа в <sheetView>; Open парсит все три обратно в новые свойства. Первый добавленный лист становится видимым и активным по умолчанию, чтобы существующие участки кода продолжали работать
Версия 2.19.2
Добавлено
- Добавлено четыре дополнительных параметра для атрибутов PageSetup в TXLSXWorksheet, чтобы полностью охватить возможности OOXML <pageSetup>: BlackAndWhite (режим черно-белого печати), Draft (отключение графики для более быстрой предварительной печати), PrintNotes (печать комментариев к ячейкам в отображаемом виде, а не скрытие их) и PrintOverThenDown (печать строк слева направо, а не стандартное построчное построение сверху вниз). Функция SaveAs создает соответствующие атрибуты blackAndWhite / draft / cellComments / pageOrder; функция Open восстанавливает их. По умолчанию эти параметры отключены, чтобы не изменять существующие листы и не добавлять им лишние атрибуты