Обзор XLSX Facade (lxHandleX)
lxHandleX — это специализированный модуль фасада для рабочих процессов с рабочими книгами Excel 2007+ (.xlsx) и OpenDocument Spreadsheet (.ods). Он сосуществует с оригинальным фасадом lxHandle , благодаря чему унаследованный код продолжает работать без каких-либо изменений:
lxHandle— основной фасад для форматов Excel 97-2003 BIFF (.xls), а также экспорта в HTML, RTF, CSV и TSV; весь существующий пользовательский код продолжает использовать этот модуль без измененийlxHandleX— основной фасад для формата Excel 2007+ OOXML (.xlsx), рабочих процессов чтения/записи ODS и подмножества XLSB «значения и стили»; он предоставляет отдельные типы рабочих книг и рабочих листов, автоматическое определение пакета черезOpen,SourceFormat, явные форматы вывода иTODSExportOptions
Иерархия классов
Фасад XLSX предоставляет следующие классы:
type
TXLSXWorkbook = class // top-level workbook with SaveAs / Open
TXLSXHtmlExportOptions = class // HTML document, style, BOM, and table class options
TODSExportOptions = class // ODS export options for generator, chart, and image output
TXLSXSheets = class // worksheet collection on the workbook
TXLSXFonts = class // workbook-level font palette
TXLSXFont = class // single font descriptor
TXLSXFills = class // workbook-level fill palette
TXLSXFill = class // single fill (pattern + fg/bg color)
TXLSXBorders = class // workbook-level border palette
TXLSXBorder = class // four edges + diagonal border
TXLSXNumberFormats = class // workbook-level custom format codes
TXLSXDefinedNames = class // workbook-level named ranges
TXLSXWorksheet = class // single worksheet with cells and decorations
TXLSXStructuralEditRegistry = class // ordered application participants for row and column reference updates
TXLSXCells = class // cell collection on the worksheet
TXLSXCell = class // single cell (value, formula, *Index style refs)
TXLSXRange = class // rectangular worksheet range wrapper
TXLSXMergedCells = class // merged-range collection
TXLSXHyperlinks = class // hyperlink collection
TXLSXComments = class // cell-comment collection
TXLSXImages = class // image collection (drawings + media)
TXLSXConditionalFormats = class // conditional formatting rules
TXLSXDataValidations = class // data-validation rules
TXLSXTables = class // Excel-style table collection
TXLSXCharts = class // chart collection (anchored or full-page)
TXLSXChart = class // single or combination chart with primary, secondary, date, value, and series axes
TXLSXChartPlotGroup = class // ordered chart-family group with its own series and axis pair
TXLSXChartSeries = class // chart series with formula ranges and typed literal caches
TXLSXTextBox = class // standalone worksheet drawing text box
TXLSXRichText = class // per-run rich-text payload for cells
TXLSXAlignment = class // cell alignment / wrap / indent / rotation
TXLSXExternalLinks = class // external workbook link collection
TXLSXExternalLink = class // single external workbook reference (Target URL + SheetNames)
TXLSConnections = class // external data connection collection
TXLSConnection = class // database, web, text, and refresh connection metadata
TXLSQueryTables = class // worksheet query-result collection
TXLSQueryTable = class // query ownership, fields, and result binding
Эти классы не зависят от lxHandle.TXLSWorkBook и
lxHandle.TXLSWorksheet. Приложения, которым требуются оба формата, могут использовать оба фасада параллельно:
uses
lxHandle, // XLS / HTML / RTF / CSV workbook (TXLSWorkBook)
lxHandleX; // XLSX workbook (TXLSXWorkbook)
Быстрый старт
Фасад XLSX следует тем же соглашениям о сигнатурах вызовов, что и фасад BIFF — SaveAs / Open для рабочей книги,
Sheets.Add / Sheets[i] для коллекции рабочих листов и Cells.Item[Row, Col].Value для коллекции ячеек. Приведенный ниже пример создает небольшую рабочую книгу, использующую все поддерживаемые на данный момент функции:
uses lxHandleX;
var
wb: TXLSXWorkbook;
ws: TXLSXWorksheet;
bold, yellow, box, currency: Integer;
begin
wb := TXLSXWorkbook.Create;
try
bold := wb.Fonts.Add('Calibri', 12, True, False);
yellow := wb.Fills.AddSolid($FFFFFF00);
box := wb.Borders.AddBox(xlsxBorderThin);
currency := wb.NumberFormats.Add('"$"#,##0.00');
ws := wb.Sheets.Add('Demo');
ws.Cells.Item[1, 1].Value := 'Hello';
ws.Cells.Item[1, 1].FontIndex := bold + 1;
ws.Cells.Item[1, 2].Value := 123.45;
ws.Cells.Item[1, 2].NumberFormatIndex := currency + 1;
ws.Cells.Item[2, 1].Value := Now; // tagged as date
ws.Cells.Item[2, 2].Formula := 'SUM(B1:B1)';
ws.Cells.Item[3, 1].FillIndex := yellow + 1; // highlight cell
ws.Cells.Item[3, 2].BorderIndex := box + 1; // boxed cell
ws.ColWidth[1] := 24;
ws.RowHeight[1] := 28;
ws.MergeCells(4, 1, 4, 3);
ws.Range['A8:C10'].Merge(True); // merge across rows
ws.AddHyperlink(5, 1, 'https://www.loslab.com', 'Visit losLab');
ws.AddComment(5, 2, 'Important note', 'Kevin');
ws.AddImageFromFile(6, 1, 'logo.png');
ws.AddConditionalFormat('B1:B10', xlsxCfOpGreaterThan, '100');
ws.AddListValidation('C1:C5', 'Yes,No,Maybe');
wb.DefinedNames.Add('SalesData', 'Demo!$A$1:$B$10');
wb.SaveAs('demo.xlsx');
finally
wb.Free;
end;
end;
Поддерживаемые функции
- Значения ячеек: числа, логические значения, строки, даты, формулы
- Таблица общих строк (
xl/sharedStrings.xml) с дедупликацией на пути записи - Палитры стилей на уровне рабочей книги —
Workbook.Fonts,Fills,BordersиNumberFormats— а такжеFontIndex/FillIndex/BorderIndex/NumberFormatIndexдля каждой ячейки; SaveAs выводит реальные блоки<fonts>/<fills>/<borders>/<numFmts>+<cellXfs>, а Open анализирует их обратно, благодаря чему имя, размер, полужирный, курсив, цвет, шаблоны заливки, края границ и пользовательские числовые форматы сохраняются при двусторонней передаче - Ширина отдельных колонок через
Worksheet.ColWidth[Col]и высота строк черезWorksheet.RowHeight[Row](блок<cols>рабочего листа и атрибуты<row>ht) - Встроенный формат даты
cellXfс индексомXlsxXfIndexDate; значенияTDateTimeпомечаются автоматически - Объединенные ячейки (
<mergeCells>), включаяTXLSXRange.Merge(True)для объединения по строкам в стиле Excel - Диапазоны рабочего листа через
Worksheet.Range,RCRange,UsedRange,EntireRowиEntireColumn; см. TXLSXRange для работы с пакетами значений, формулами,SetArrayFormula, индексами стилей, числовыми форматами, границами, флагами защиты, автоподбором размера, объединением, смещением, изменением размера, многоключевой сортировкойSort, встроенными стилями ячеекApplyBuiltinStyle, вспомогательными методами копирования/перемещения, вставки/удаления строк/колонок целиком, а также экспорта выбранного диапазона в HTML - Гиперссылки (
<hyperlinks>), поддерживаемые связями (rels) каждого рабочего листа для внешних URL - Комментарии к ячейкам с рисунком VML (
xl/commentsN.xml+xl/drawings/vmlDrawingN.vml), чтобы всплывающие подсказки отображались в Excel - Встроенные изображения (PNG / JPEG / GIF / BMP) via
Worksheet.Images, записываемые вxl/media/imageN.<ext>, плюс XML рисунка и связи для каждого листа - Автономные текстовые поля рисунков через
Worksheet.AddTextBox, записываемые как фигуры рисунка рабочего листа с текстовым содержимым вместо комментариев к ячейкам, с прямым поиском привязки и вспомогательными средствами удаления диапазона - Именованные диапазоны на уровне рабочей книги через
Workbook.DefinedNames(с областью видимости рабочей книги или отдельного листа черезSheetIndex) - Вычисление формул через
Workbook.CalculateиWorksheet.Calculateс использованием общего парсера и вычислителя формул XLS для формул, начинающихся со знака равенства, ссылок на ячейки и диапазоны, ссылающихся ячеек с формулами, перекрестных ссылок между листами, диапазонов именованных областей, а также поддерживаемых текстовых, календарных, рабочих дней, инженерных преобразований, побитовых, статистических, агрегатных и математических функций; используйтеWorkbook.OnUserFunctionилиWorkbook.OnUserFunctionExдля разрешения пользовательских или неподдерживаемых функций - Условное форматирование для каждого рабочего листа (
Worksheet.ConditionalFormats) и проверка данных (Worksheet.DataValidations), включая быстрое добавление выпадающего спискаAddListValidation(Range, Items)shortcut - Группы структуры строк / колонок (
RowOutlineLevel,ColOutlineLevel), состояние скрытия (RowHidden,ColHidden) и свернутое состояние групп (RowCollapsed,ColCollapsed) - Закрепление областей через
Worksheet.FreezePanes(Row, Col) - Параметры страницы — шесть свойств полей, размер бумаги, ориентация, масштаб страницы, вписать по ширине / вписать по высоте, а также
HeaderText/FooterText; именованные константыxlsxPaper*, такие какxlsxPaperLetter,xlsxPaperA4,xlsxPaperA3иxlsxPaperLegal, могут быть назначены свойствуPaperSize - Автофильтр (
Worksheet.SetAutoFilter) - Таблицы в стиле Excel (TXLSXTable) с информацией о стиле и tableColumns
API дополнительных коллекций фасада
Классы коллекций фасада управляют условными форматами, проверками данных, именованными диапазонами, изображениями и таблицами. Ниже приведены основные члены каждой коллекции:
- TXLSXConditionalFormats: предоставляет правила условного форматирования; свойства:
Count, методы:AddAboveAverage,AddColorScale2,AddColorScale3,AddDataBar,AddExisting,AddExpression,AddIconSet,AddSimpleRule,AddTextRule,AddTop10,DeleteAt,DeleteInRange,FindAt,IndexOfCell - TXLSXDataValidations: предоставляет проверки данных; свойства:
Count, методы:AddExisting,AddList,DeleteAt,DeleteInRange,FindAt,IndexOfCell - TXLSXDefinedNames: предоставляет именованные диапазоны; свойства:
Count, методы:DeleteByName,FindByName,IndexOfName - TXLSXImages: предоставляет встроенные изображения; свойства:
Count, методы:DeleteAt,DeleteInRange,FindAt,IndexOfCell - TXLSXTables: предоставляет таблицы Excel; свойства:
Count, методы:AddExisting,DeleteByName,FindByName,IndexOfName - TXLSConnections:
Раскрывает внешние подключения к данным книги через
Workbook.ConnectionsProperties:CountMethods:Add,AddExisting,FindById,FindByName,NextId,Validate - TXLSQueryTables:
Раскрывает определения результатов запросов листа через
Worksheet.QueryTablesProperties:CountMethods:Add,AddExisting,FindByName,FindByResultTableName,Validate
Поддерживаемые функции
- Свойства документа (
Workbook.Title,Author,Subject,Keywords,Description,LastModifiedBy,Companyи т. д.), записываемые вdocProps/core.xml+docProps/app.xml - Защита паролем рабочего листа / рабочей книги (устаревший 16-битный хэш) через
Worksheet.Protect/Workbook.ProtectWorkbook; сохранение с защитой паролем AES, совместимой с Excel, черезSaveAsEncrypted, с использованием аппаратного ускорения AES-NI при наличии или портативного программного резервного варианта в противном случае; методOpenEncryptedпо-прежнему вызывает исключение для зашифрованных пакетов до тех пор, пока не появится поддержка дешифрования - Сохранение проектов VBA через
Workbook.LoadVbaProjectFromFile/VbaProject; байты возвращаются без изменений; корректные полезные нагрузкиvbaProject.binтакже могут быть проверены черезWorkbook.ParsedVBAProject - Диаграммы — гистограмма / линейчатая / график / круговая / с областями / кольцевая через
TXLSXChart, закрепленные на рабочем листе (
Worksheet.AddChart) or во всю страницу на выделенном листе диаграммы черезWorkbook.AddChartSheet(Name, Type, Title) - Ячейки с форматированным текстом через TXLSXRichText с посимвольным форматированием шрифта; сохраняются при двусторонней передаче через таблицу общих строк
- Внутренние якоря гиперссылок через
Worksheet.AddHyperlinkToCell(Row, Col, "Sheet2!A1")(связь rels не требуется) - API копирования / перемещения / очистки диапазона ячеек на рабочем листе (
CopyRange,CopyRangeTo,MoveRange,ClearRange) - Выравнивание ячеек через
TXLSXAlignment +
AlignmentIndex - Цвет вкладки рабочего листа через
Worksheet.TabColor/TabColorIsAuto - Режим просмотра рабочего листа через
Worksheet.View, включая обычный режим, предварительный просмотр разрывов страниц и разметку страницы - Потоковый путь SaveAs (
Workbook.StreamingWrite := True), который создает и записывает каждый рабочий лист без удержания остальных в памяти; построчный XML-аккумулятор используетTXLSWideStringBuilder, поэтому цикл по ячейкам остается линейным - Двусторонний
Openдля всего вышеперечисленного, кроме зашифрованных пакетов XLSX и идентификации листов диаграмм, которые возвращаются к документированному частичному поведению - Экспорт и импорт на основе потоков:
SaveAs(Stream),Open(Stream)для использования в памяти или в полях BLOB - Чтение и запись OpenDocument Spreadsheet:
Workbook.OpenODSи универсальныйWorkbook.Openмогут загружать пакеты.ods, в то время какWorkbook.SaveAsODSиSaveAs(..., xlsxOpenDocumentSpreadsheet)записывают выходные данные ODS напрямую; функционал формата охватывает значения, формулы, стили, форматированный текст, размеры строк/колонок, объединения, гиперссылки, изображения, диаграммы, именованные диапазоны, автофильтр, условные форматы, проверки данных, закрепление областей, параметры страницы, колонтитулы, диапазоны печати, разрывы страниц, группы структуры, цвет вкладок и видимость листов во всех поддерживаемых двусторонних операциях - Параметры экспорта ODS: передайте
TODSExportOptionsв методSaveAsODS, чтобы переопределить строку генератора документа или скрыть части диаграмм и изображений при создании более легкого пакета - Импорт текста с разделителями:
Workbook.OpenCSV(FileName)иWorkbook.OpenCSV(Stream)импортируют данные CSV или TSV с определением разделителя, кодировки BOM, квотированием в стиле RFC 4180 и необязательным выводом типа значений; методOpen(FileName)автоматически перенаправляет файлы.csvи.tsvимпортеру - Сканирование метаданных рабочей книги:
Workbook.GetSheetNames(FileName, List)andWorkbook.GetSheetNames(Stream, List)считывают упорядоченные имена листов изxl/workbook.xmlбез загрузки XML рабочих листов - Защита ячеек:
TXLSXCell.LockedиFormulaHidden— управляют тем, какие ячейки доступны для редактирования или чьи формулы видны при защите листа - Автоподбор ширины колонки и высоты строки по содержимому ячеек:
Worksheet.AutoFitColumn,AutoFitColumns,AutoFitRow,AutoFitRows - Каскадная вставка и удаление строк / колонок:
InsertRows,DeleteRows,InsertCols,DeleteCols; побочные эффекты распространяются на ячейки, объединенные диапазоны, гиперссылки, комментарии, закрепление областей, строковые ссылки на диапазоны, таблицы, формулы ячеек, формулы условного форматирования / проверки данных, внутренние цели гиперссылок, ссылки параметров печати, ручные разрывы страниц, критерии фильтра колонок автофильтра, диапазоны серий диаграмм, именованные диапазоны, привязки изображений и привязки диаграмм - Расширенные параметры страницы:
PrintArea,PrintTitleRows,PrintTitleCols,PrintGridlines,PrintHeadings,BlackAndWhite,Draft,PrintNotes,PrintOverThenDown - Видимость листа:
PrinterDriverData(HasPrinterDriverData/ClearPrinterDriverData/pageSetup) иxlsDiagnosticPrinterSettingsRelationshipInvalidбез заимствования другой бинарной части - Калибровка отрисовки на уровне книги через
RenderCalibration,CaptureRenderCalibration, andResetRenderCalibration, с валидируемым присвоением записи целиком и независимыми снимками операций для ширины, высоты, межстрочного интервала, полей ячеек, масштабирования экрана и DPI измерения - Геометрия и измерение шрифтов во владении операции через
CreateRenderGeometry, с неизменяемой калибровкой и идентичностью поколения книги, полными учитывающими перенос ключами кэша шрифтов, ограниченным локальным кэшированием и общими преобразованиями пикселей, пунктов, ширины столбцов, MDW и полезной ширины ячейки - AutoFit снимает один геометрический снимок уровня книги на операцию и измеряет шрифты видимых ячеек и переносимый текст с калиброванными интервалами и полями; пагинация снимает отдельный снимок на каждую сборку, оставляет существующие логические страницы неизменными до следующей сборки и никогда не записывает размеры листа
- Sheet visibility:
Worksheet.Visibility(xlsxSheetVisible/xlsxSheetHidden/xlsxSheetVeryHidden) andIsSelected - Ручные разрывы страниц:
AddRowBreak,AddColBreak, поиск индекса и вспомогательные средства удаления диапазонов - Критерии фильтра колонок автофильтра:
Worksheet.AddAutoFilterColumnс одиночными или логическими И/ИЛИ двухкритериальными правилами фильтрации, а такжеWorksheet.AutoFilterColumns.FindByColIdandDeleteByColIdдля прямого поиска и удаления критериев (TXLSXAutoFilterColumn) - Базовая дата рабочей книги:
Workbook.Date1904переключает начальную эпоху дат между 1900 годом (по умолчанию в Windows) и 1904 годом (Mac) - Диагональные границы:
TXLSXBorder.DiagonalUpиDiagonalDownвключают диагональные линии; реброDiagonalнесет стиль и цвет - Расширенные свойства шрифта:
TXLSXFont.VertAlign(надстрочный / подстрочный),OutlineFont,Shadow,Family,CharSet - Метаданные именованного диапазона:
TXLSXDefinedName.HiddenиComment - Параметры просмотра листа:
Worksheet.Zoom,DisplayGridLines,DisplayZeros,DisplayRightToLeft,StandardWidth,StandardHeight - Унаследованная палитра индексированных цветов OOXML:
Workbook.IndexedColor[0..63]сResetIndexedColors - Ссылки на внешние рабочие книги:
Workbook.ExternalLinks/ TXLSXExternalLink — двусторонний обмен метаданными Target URL + SheetNames - Поддержка цветов темы в
Workbook.Connections,Worksheet.QueryTablesи - Theme color support on
TXLSXFont: свойстваTXLSXFill, andTXLSXBorderEdge:ColorTheme/ColorIndex/TintAndShadeсвойства с приоритетом (тема > индекс > RGB) - /
SaveXLSXWorkbookAsXLS/UsePrinterDefaultsс приоритетным порядком (тема > индексированный > RGB) - Экспорт в CSV:
Workbook.SaveAsCSV— 4 перегрузки (FileName или Stream x active-sheet / явный SheetIndex + разделитель), UTF-8 с BOM, квотирование по RFC 4180 - Экспорт в HTML:
Workbook.SaveAsHTMLиTXLSXRange.SaveAsHTMLзаписывают таблицы HTML5 для всего листа рабочей книги или только для выделенного прямоугольника; перегрузки параметров принимаютTXLSXHtmlExportOptionsдля вывода полного документа, вывода стилей, вывода BOM и назначения имени класса таблицы - RTF export:
Workbook.SaveAsRTFЭкспорт в RTF:\uN?— 4 перегрузки, таблица RTF 1.6 с шириной колонок, форматированием шрифта для каждой ячейки и полной поддержкой BMP юникода через знаковые 16-битные управляющие последовательности \uN?
Общая инфраструктура
Оба фасада используют общий набор вспомогательных модулей более низкого уровня, что означает, что дескрипторы стилей, хэш-таблицы, деревья AVL, ввод-вывод ZIP и XML, преобразования RGB-в-HLS и построители строк пишутся один раз и используются обоими путями. Общие вспомогательные модули включают в себя:
lxStyleXf,lxStyleFont,lxStyleColor,lxStyleFill,lxStyleBorder— современные дескрипторы стилейlxRgb— преобразование цвета RGB / HLSlxHashTable,lxKeyList,lxAvlTree,lxCols,lxRows— контейнеры с дедупликацией и строительные блоки кучи ячеек на базе AVLlxXmlReader,lxXmlWriter,lxZipArchive— транспортный уровень OOXMLlxStrBuilder,lxCacheStream,lxWStream,lxZlibStream— вспомогательные средства сборки потоков и строк