可移植的无界面输出
版本 2.384.100 起提供一条有界的输出管线,带显式的捕获与渲染 API
在 Windows 上从 Classic XLS 或 XLSX 工作簿捕获受支持的矩形,传输其不可变快照,然后在 Linux 或 macOS 上用 Free Pascal 与原生 Cairo 渲染 PDF、SVG 或 PNG
捕获适配器使用工作簿引擎;Windows 捕获使用其默认几何服务,而原生 Linux 与 macOS 捕获可以提供显式的 FreeType/HarfBuzz 几何服务,由应用自选的字体文件支撑
独立的原生消费者经由 lxPortableCairo 接受 lxPortableRender 场景,全程不需要 Excel 或桌面会话;其几何 API 同样使用既有的可移植工作簿视图与渲染几何单元
消费者接受不可变场景或传输流;加载与计算工作簿的平台要求另行参见 Free Pascal 支持
捕获既有工作簿的矩形
lxPortableWorkbookCapture 中的 CaptureXLSPortableRenderSnapshot 接受 IXLSWorkbook 或 IXLSXWorkbookOwner,可带显式或默认的 TXLSPortableRenderLimits;另有两个重载接受显式限额,其后跟一个作用于捕获视图的 IXLSRenderGeometry 提供程序
SheetIndex 与含端点的 Row1、Col1、Row2、Col2 都是 1 基;得到的快照存储相对捕获矩形、从零开始的位置
program CaptureRectangle;
{$APPTYPE CONSOLE}
uses SysUtils, Classes, lxHandleX, lxPortableRender,
lxPortableWorkbookCapture;
var
Workbook: TXLSXWorkbook;
Owner: IXLSXWorkbookOwner;
Snapshot: IXLSPortableRenderSnapshot;
Stream: TFileStream;
begin
Workbook := TXLSXWorkbook.Create;
Owner := Workbook;
if Workbook.Open('report.xlsx') <> 1 then
raise Exception.Create('Cannot open report.xlsx');
Snapshot := CaptureXLSPortableRenderSnapshot(Owner, 1, 1, 1, 30, 6);
Stream := TFileStream.Create('report.hxrs', fmCreate);
try
SaveXLSPortableRenderSnapshot(Snapshot, Stream,
XLSDefaultPortableRenderLimits);
finally
Stream.Free;
end;
Owner := nil;
end.
使用工作簿对象期间保持所有者接口存活;释放接口即可,不要手动释放由接口持有的工作簿
Classic XLS 请使用 lxHandle 中的 TXLSWorkbook 与 IXLSWorkbook 配合同一个捕获调用
捕获读取既有的公式缓存,矩形内任何没有缓存的公式都会被拒绝;它从不隐式重算、抓取外部数据或在源工作簿中登记新样式
应用需要新鲜的公式结果时请在捕获前显式重算;既有缓存会按存储原样渲染,捕获不为其新鲜度背书
该操作持有读取视图并在返回前检查工作簿生成号;返回的快照脱离工作簿所有权,工作簿释放后仍可使用
外观与捕获边界
快照包含格式化的显示文本、以点计的物理尺寸、解析后的 RGB 颜色、受支持的单元格字体与对齐、填充、边框以及完整的合并矩形;隐藏行列尺寸为零
受支持的字体外观包括粗体、斜体、单下划线与删除线;受支持的单元格外观包括纯色填充、左/中/右水平对齐、上/中/下垂直对齐、自动换行、缩小填充与从右到左阅读顺序
细、中、粗、发丝、双线、点线、虚线与中虚线等工作簿边框映射到可移植边框样式和点宽度;其他边框样式会被拒绝
受支持的富文本携带生效的 run 字体、磅值、RGB 颜色、粗体、斜体、单下划线、删除线以及 run 级上标或下标;普通单元格的轮廓/阴影/垂直字体效果、不受支持的下划线样式、渐变或图案填充、对角边框、缩进、文字旋转和不受支持的对齐都会被拒绝
捕获矩形必须完整包含每个合并单元格;被裁剪、重叠或不一致的合并,以及合并外边缘上不兼容的样式都会被拒绝
工作表背景和不受支持的工作表类别会拒绝捕获;两个工作簿门面中受支持的 PNG/JPEG 图片与普通矩形/椭圆文本形状会作为有序场景对象被捕获,连同 XLSX 单元格图片、布尔复选框以及下文所述受支持的缓存 XLSX 图表子集;不受支持的图表、形状预设、WordArt、分组变换、浮动控件、Slicer、Timeline 与迷你图在其解析足迹与矩形相交时会被拒绝
足迹可被可靠解析且位于矩形之外的不受支持内容可以与捕获共存;无法解析的绘图足迹会被拒绝,而不是悄悄漏掉可能重叠的内容
与矩形相交的 Classic 表格样式会被拒绝;XLSX 内置与受支持的自定义 Table 区段在分离的样式上下文中解析,带区段尺寸的条纹和直接的单元格格式覆盖
对受支持导入 Table 的纯色或隐式差分填充,RGB bgColor 提供可见背景;只有 RGB fgColor 时继承的背景保持不变,同时携带两种颜色的区段使用其背景色
包含类型化摘要无法表示的外观时,相关 Table 区段在生效时被拒绝,包括下划线、数字格式、显式清除的粗体/斜体、字体方案、显式无填充图案和不受支持的颜色形式;捕获矩形之外的无关系段不会阻塞捕获
受支持的条件格式在不求值公式的情况下应用:针对字面数值边界的缓存数字或日期比较、字面布尔或数值表达式、文本包含/前缀/后缀规则、空白与错误;按受支持属性高优先级外观胜出,XLSX 的 StopIfTrue 会停止更低优先级的匹配规则
Classic 文本规则要求字面字符串查找串并匹配缓存的字符串单元格;XLSX 文本规则使用其存储的文本条件
受支持的差分外观包括带色调的已解析主题颜色和普通索引颜色;导入的自动颜色、非主题色调、同时带前景与背景色的差分填充,以及不受支持的边框、对齐、删除线或其他未表示的差分外观在匹配规则生效时被拒绝
需要求值的条件公式、聚合或依赖日期的规则、色阶、数据条与图标集在遇到时被拒绝;重叠条件格式规则的数量有上限
Date1904 转换在应用日历偏移之前先选择适用的原始数字格式区段;非活动的日历区段不改变普通数字显示,布尔值仍是布尔
选中的 Date1904 日历区段与格式条件或流逝时间构造组合时会被拒绝;带引号或转义的区段分隔符同样被拒绝,而该边界不会仅仅因为另一个区段是日历格式就阻塞选中的普通数字区段
富文本与有序绘图场景
TXLSPortableCell.RichText 是 TXLSPortableTextRun 记录数组,包含 Text、FontFamily、FontSizePoints、FontStyles、ColorRGB 与 BaselineShiftPoints;拼接后的 run 文本必须与单元格显示文本完全一致
XLSX 的 run 从生效的捕获单元格字体继承省略的属性,包括受支持的表格与条件格式;显式赋值的 false 标志和显式的 none/baseline/automatic 颜色值会覆盖继承
原生共享字符串与内联字符串保留 run 边界和空白;不受支持的原生字体子元素、属性、命名空间、主题/索引富颜色和注音标注会被拒绝,而不是悄悄丢失可见外观
Classic 的 run 把存储的 BIFF 字体索引解析为完整的生效 run 字体;注音元数据和不受支持的 run 字体会被拒绝,捕获保留工作簿生成号与样式池
Classic 文本形状读取既有的 OfficeArt 属性与 TXO 字体 run,不创建绘图包装也不改变工作簿;锚点使用真实的行/列尺寸和偏移,受支持的纯色填充与轮廓保留其颜色和宽度,内嵌的 PNG/JPEG 字节在传输前分离
矩形文本使用原生的 7.2pt 水平与 3.6pt 垂直边距;椭圆文本额外使用其内切文本矩形,两个工作簿门面中都让普通文本留在形状轮廓之内
导入的 Classic 矩形与椭圆容器保留其类型化文本与格式;被跳过且无解析足迹的原生形状或分组元数据会显式拒绝捕获,而未知的对象尾部记录、绘图扩展、旋转、非纯色填充和不受支持的线条样式会拒绝相交对象
导入的 XLSX 双单元格矩形与椭圆锚点支持带 alpha 的显式 RGB 纯色填充、实线或虚线/点线轮廓、物理锚点偏移和单个普通富文本段落;每个 run 保留其生效的字体、磅值、颜色、粗体、斜体、单下划线与删除线,包括显式的粗体或斜体重置
导入的形状读取器在解析前预留原始 XML 暂存存储,并以协作方式检查项、字节与文本预算;它保留工作簿绘制顺序和读取租约,不创建形状模型或不存在的单元格
未知的原生形状属性、效果、主题、旋转、分组变换、多段落和不受支持的锚点类别会被显式拒绝;解析出的不受支持足迹在捕获矩形之外时不阻塞请求区域
run 级上标与下标使用 run 字号的三分之二,基线偏移为原磅值的三分之一;切开 Unicode 整形簇的样式边界,或跨不兼容 run 边界的 CRLF 序列,会在原生布局阶段被拒绝
TXLSPortableSceneObject 携带 Kind、基于点的 X、Y、Width、Height、裁剪矩形、填充/轮廓颜色与不透明度,以及可选的路径点、文本单元格或编码的栅格字节与尺寸
TXLSPortableSceneKind 包含 xpskRectangle、xpskEllipse、xpskPolyline、xpskPolygon、xpskText、xpskPNG 与 xpskJPEG;数组顺序即绘制顺序,靠后的对象覆盖靠前的对象
额外的 CreateXLSPortableRenderSnapshot 重载接受 TXLSPortableSceneObjects 数组;查询 IXLSPortableRenderSceneSnapshot 获取从零开始的 Objects 与 ObjectCount,其 getter 返回分离的副本,包括 run、点与栅格数组
单元格图片与复选框路径先于浮动绘图;浮动绘图保留工作簿顺序、物理锚点与视口裁剪,文本形状使用次主题字体 11 磅及 7.2 磅水平、3.6 磅垂直的文本边距
PNG 与 JPEG 图片在文件头、像素尺寸与字节预检之后做原生解码;受支持的浮动图片保留透明度与拉伸几何,而单元格图片在保持宽高比的前提下适配单元格或完整合并矩形
裁剪、旋转、阴影、亮度/gamma 调整、平铺、SVG 伴生文件与实时相机绑定不受支持;保留的图片 XML 会对照受支持的外观校验,因此隐藏图片、未知嵌套元数据、外部命名空间属性、非矩形图片几何和未建模的变换只在足迹与捕获重叠时被拒绝
布尔单元格复选框使用主题中性的矢量框和可选的勾选标记,包括从行格式与列格式继承的生效控件;请求的单元格遍历在遍历前有上限,其他控件类别和空白或非布尔的复选框值会被拒绝,受支持的单元格场景会抑制标量布尔或图片错误的回退文本
复选框默认值属于插入元数据,不会为缺失的单元格编造布尔值;显式的直接单元格控件清除会掩盖继承的控件,而捕获读取保留稀疏缺失与工作簿生成号
XLSReadPortableImageDimensions 校验有界的 PNG IHDR 或受支持的八位顺序/渐进 JPEG 帧,并返回其声明的宽高;解码仍由渲染器负责
IXLSPortableSceneCaptureSource.ReadPortableSceneObjects 使用 1 基工作簿坐标和相对该区域、基于点的场景坐标,校验范围与协作限额,并返回消耗的字节、文本与项计数;HasPortableCellScene 标识其标量显示被捕获场景替换的单元格
原生布局的 CellCount 统计网格单元格,LineCount 还包含文本场景对象;文本对象的行 CellIndex 是 CellCount 加上它在文本场景对象中的从零开始序号,而 GetCellGeometry 仍限于网格单元格
标量快照继续序列化为 HXRSNP01;含 run 或场景对象的快照序列化为 HXRSNP02,加载器以同样的不可变所有权与输入位置回滚契约接受两个版本
合并的项预算统计存储单元格、富文本 run、场景对象与路径点;字节限额在分配前计入暂存与分离数组、文本、编码栅格负载以及有界的原生元数据检查
可移植快照 API
| 符号 | 契约 |
|---|---|
EXLSPortableRender | 快照数据无效、捕获外观不受支持、原生后端不可用、资源受限或渲染失败时抛出的异常 |
TXLSPortableFontStyle, TXLSPortableFontStyles | xpfsBold、xpfsItalic、xpfsUnderline 与 xpfsStrikeout,按集合组合 |
TXLSPortableHorizontal, TXLSPortableVertical | xphLeft、xphCenter、xphRight 与 xpvTop、xpvCenter、xpvBottom |
TXLSPortableBorderStyle, TXLSPortableBorder | xpbsNone、xpbsSolid、xpbsDashed、xpbsDotted 与 xpbsDouble;每条边框携带 Style、WidthPoints 与 ColorRGB |
TXLSPortableCell | 从零开始的 Row/Column、正的 RowSpan/ColumnSpan、显示 Text、FontFamily、FontSizePoints、FontStyles、TextColorRGB、FillColorRGB、HasFill、WrapText、ShrinkToFit、RightToLeft、Horizontal、Vertical 以及四个 LeftBorder/TopBorder/RightBorder/BottomBorder 记录 |
TXLSPortableCells, TXLSPortableSizes | 存储单元格与以点计的物理行/列尺寸的动态数组 |
TXLSPortableRenderLimits | MaxGridCells、MaxStoredCells、MaxBytes 与 MaxTextCharacters 约束构建、捕获与序列化 |
XLSDefaultPortableRenderLimits | 返回 2000000 个网格单元格、2000000 个存储单元格、67108864 字节与 16777216 个 UTF-16 文本字符 |
XLSDefaultPortableCell | 初始化单单元格跨度的 Calibri 11 磅及默认零值外观;构造前设置其位置与所需外观 |
CreateXLSPortableRenderSnapshot | 校验并复制生成号、行高、列宽与存储单元格到分离的不可变接口;单元格必须唯一、按行优先、在边界内且跨度不重叠 |
IXLSPortableRenderSnapshot | 只读的 Generation、RowCount、ColumnCount、CellCount、从零开始的 RowHeightPoints、ColumnWidthPoints 与复制的 Cells 记录 |
| 快照 getter 方法 | GetGeneration、GetRowCount、GetColumnCount、GetCellCount、GetRowHeight、GetColumnWidth 与 GetCell 暴露相同的值;无效的索引访问抛出异常 |
SaveXLSPortableRenderSnapshot | 把一个快照校验并序列化到有界的私有缓冲,然后把完整的 HXRSNP01 或 HXRSNP02 负载复制到给定流的当前位置 |
LoadXLSPortableRenderSnapshot | 读取带版本的 little-endian 快照(严格 UTF-8 文本),校验计数、几何、样式与跨度,并拒绝尾部多余数据;失败时恢复输入流位置 |
所有限额必须为正;校验过的最大值为 2000000 个网格/存储单元格、1073741824 字节与 268435456 个文本字符,尺寸不超过 1048576 行乘 16384 列
MaxGridCells 统计整个矩形,包括未存储的空白单元格;CellCount 统计存储的可见单元格与合并锚点,可能更小
Generation 记录源生成号或应用提供的值;它是元数据,不是指向工作簿的活动链接,也不是自动的新鲜度检查
原生渲染与显式字体
XLSPortableCairoBackendAvailable 报告编译进来的原生后端是否可用;原生输出要求 Linux 或 macOS 上的 Free Pascal,且进程能访问 Cairo、FreeType、HarfBuzz 与 FriBidi 库
macOS 构建显式链接这四个原生库;私有的依赖前缀和显式的子进程加载路径可以在不改共享编译器设置或 shell 配置的情况下提供它们
Windows 上的 Delphi XE5、Win32 与 Win64 可以编译可移植接口并使用快照序列化,但原生 Cairo 布局准备在该平台上报告后端不可用
给 PrepareXLSPortableCairoLayout 传入显式字体链;渲染器先尝试匹配字族和粗/斜样式,再按提供顺序尝试同样式回退,要求每个受支持文本簇都有字形覆盖
请提供捕获内容实际需要的 regular、bold、italic 与 bold-italic 文件;没有系统字体发现,也没有合成的粗体/斜体替代,缺失文件、样式映射或字形覆盖都会被拒绝
字体字节在整形前捕获,因此修改文件影响后续布局,而既有布局保留其捕获的字节;FaceIndex 选择字体文件或集合中非负的字面
原生操作为 FreeType 字面安全而串行化;不可变快照与已准备布局的检查不需要活动的工作簿
Fonts[0].FamilyName := 'Calibri'; Fonts[0].FileName := '/srv/fonts/Regular.ttf'; Fonts[0].FaceIndex := 0; Fonts[0].Bold := False; Fonts[0].Italic := False;
这里 Calibri 是所选文件的显式字族别名,允许应用控制的字体映射;映射到不同字体时请检查输出度量
渲染器支持硬换行、四空格制表符展开、段落双向排序、整形的连字与组合标记、贪心换行与缩小填充;换行优先于缩小
换行保留已实现的组合标记、变体选择符、ZWJ 与 virama 簇边界,并优先在空格与全角空格处断行;它不是完整的 UAX #29 字素实现或 Unicode 断行算法,区域指示符与 Hangul Jamo 的换行边界不做保证
字号解析到 1/64 磅,文本裁剪到单元格边界;PDF 内嵌显式字体并带逻辑文本映射,SVG 使用矢量字形路径,PNG 按请求 DPI 绘制相同的定位字形
准备并检查布局
| 符号 | 契约 |
|---|---|
TXLSPortableFontFile, TXLSPortableFontFiles | 每个显式映射包含 FamilyName、FileName、FaceIndex、Bold 与 Italic;动态数组有序,含 1 到 64 个映射 |
TXLSPortableCairoFormat, TXLSPortableOutputFiles | xpcfPDF、xpcfSVG 或 xpcfPNG,以及文件保存返回的输出文件名数组 |
TXLSPortableCairoOptions | 页面宽/高、四个页边距、单元格内边距与栅格 DPI,外加页面、字形、行、布局、输出、字体、整形与绘制限额 |
XLSDefaultPortableCairoOptions | 用有界默认值初始化每个选项;覆盖个别字段前先使用它 |
PrepareXLSPortableCairoLayout | 校验并复制快照,捕获显式字体字节,返回持有的已准备 TXLSPortableCairoLayout;用 Free 释放 |
TXLSPortableCairoLayout | 暴露 PageCount、LineCount、CellCount、GetTextLine、GetCellGeometry、SaveToStream、Save 与 Destroy |
TXLSPortableTextLineInfo | 复制的行记录含 CellIndex、GlyphCount、XPoints、BaselinePoints、WidthPoints、FontSizePoints 与逻辑 Text |
TXLSPortableCellGeometry | 复制的矩形含完整布局中的 XPoints、YPoints、WidthPoints 与 HeightPoints |
GetTextLine(Index), GetCellGeometry(Index) | 从零开始的索引检查已准备行与存储单元格;无效索引拒绝 |
分页按先横后纵的顺序裁剪固定可打印区域瓦片;跨越页边界的单元格或文本片段会出现在每个相交页上,没有自动整格适配、工作表打印标题重复或工作簿页面设置解释
渲染器选项与界限
| 字段 | 默认值与含义 |
|---|---|
PageWidthPoints, PageHeightPoints | 595 乘 842 点 |
MarginLeftPoints, MarginTopPoints, MarginRightPoints, MarginBottomPoints | 各 36 点;页边距必须留出正的可打印矩形 |
CellPaddingPoints, RasterDPI | 2 点与 96 DPI;DPI 影响 PNG 尺寸 |
MaxPages, MaxGlyphs, MaxLines | 256 页、2000000 个整形字形与 200000 行文本 |
MaxLayoutBytes | 268435456 字节,用于有界的布局工作与栅格表面检查 |
MaxOutputBytes | 每个渲染输出缓冲 268435456 字节,覆盖完整 PDF 或单个 SVG/PNG 页,而不是多个页面文件之和 |
MaxFontBytes | 一个布局的显式字体输入文件合计 134217728 字节 |
MaxShapedCharacters, MaxDrawOperations | 各 16000000,约束整形工作与逐单元格绘制工作 |
无效或非有限的几何以及非正的工作预算会被拒绝;页面尺寸上限 100000 点,栅格 DPI 上限 1200,渲染前还有额外的字节、计数与栅格面积检查
进程级原生字体字节池额外限制最多 256 个不同缓冲与 256 MiB;完全相同的字节可共享存储,容量只在 Cairo 实际持有的字体字面释放其缓冲时归还
布局用完请释放;库不会重置共享的 Cairo 缓存,逻辑上已完成的布局可能让字体字节常驻,因为原生 Cairo 仍持有字面
写出输出并处理失败
SaveToStream(Stream, Format, PageIndex = 0) 对 PDF 写出所有页,要求 PageIndex = 0;SVG 与 PNG 写出所选的从零开始页
快照序列化与原生渲染先在私有有界缓冲中完成,再复制到目标流;校验或渲染失败会保留目标流,但调用方流的写入失败可能留下部分字节,并遵循该流自身的失败行为
Save(FileName, Format) 写出一个 PDF 文件或每页一个 SVG/PNG 文件并返回其路径;多页文件名在扩展名前插入 -0001、-0002 等后缀
既有文件或目录目标会被拒绝;每次保存先暂存所有页,再独占地发布新目标,失败时清除自己的暂存/已发布输出
文件系统必须支持原生的独占暂存与链接发布操作;PDF、SVG 与 PNG 的分开保存是独立操作,不构成组合事务
独立的 Linux 消费者
Tests/Portable/RenderPortableSnapshot.pas 是一个完整的消费者,加载快照、准备一个布局并保存全部三种格式;在 Linux 上安装可移植单元与原生库后构建它
fpc -Mdelphiunicode -Fu/path/to/HotXLS/Lib RenderPortableSnapshot.pas ./RenderPortableSnapshot report.hxrs /srv/output/report fonts.tsv 595 842 96
fonts.tsv 是 UTF-8 文本,每个映射四个制表符分隔的字段:字族别名、绝对 Linux 字体路径、face 索引,以及 regular、bold、italic 或 bolditalic
Calibri /srv/fonts/Regular.ttf 0 regular Calibri /srv/fonts/Bold.ttf 0 bold Calibri /srv/fonts/Italic.ttf 0 italic Calibri /srv/fonts/BoldItalic.ttf 0 bolditalic
请使用实际安装或应用提供的字体文件,并选择新的输出基础名,因为既有目标文件会被拒绝;为首个映射未覆盖的文字补充同样式回退
Stream := TFileStream.Create('report.hxrs', fmOpenRead or fmShareDenyWrite);
try
Snapshot := LoadXLSPortableRenderSnapshot(Stream,
XLSDefaultPortableRenderLimits);
finally
Stream.Free;
end;
Options := XLSDefaultPortableCairoOptions;
Layout := PrepareXLSPortableCairoLayout(Snapshot, Fonts, Options);
try
Files := Layout.Save('/srv/output/report.pdf', xpcfPDF);
Files := Layout.Save('/srv/output/report.svg', xpcfSVG);
Files := Layout.Save('/srv/output/report.png', xpcfPNG);
finally
Layout.Free;
end;
缓存图表录制
lxPagination 中的 XLSRecordCachedChartScene 把既有图表布局渲染器的基于点的图元录制为不可变的可移植场景表示;其源必须是没有所属工作表、也没有保留原生 XML 的分离 TXLSXChart,因此录制无法解析工作表引用或刷新工作簿缓存
当前子集支持柱形、条形、折线、散点、饼图、圆环图以及带单一主绘图组的普通单系列面积图,要求有限的数值缓存和严格递增且有界的缓存索引;散点类别的缓存包含数字 X 坐标,其余家族使用存储的类别标签
柱形、条形、折线与面积的值缓存必须有连续的从零开始索引;稀疏的类别值缺口会被拒绝,录制从不把缺失索引展开成大数组
条形绘图保留水平几何与类别标签;饼图与圆环图使用类别图例、遵循 FirstSliceAng 与 HoleSize 并省略数值轴,而普通单系列面积绘图保留围绕零基线的填充多边形
折线与散点系列通过 LineVisible、LineColorRGB 与 LineWidthPoints 支持独立的线条可见性、显式 RGB 颜色与点宽度;LineStyleSet、LineColorSet 与 LineWidthSet 区分显式设置与继承默认值,EffectiveLineVisible 解析既有的仅填充系列约定
数据标记支持自动圆、显式圆或无标记;显式 MarkerSize 取 2 到 72 设置其点直径,MarkerFillSet 与 MarkerBorderSet 把显式的黑色 RGB 零值与自动选色区分开;连接线段先于不透明的数据标记绘制
没有存储宽度的显式标记边框使用普通 0.75 磅线条,而图例样本把圆直径限制在 6 点;请求的标题字体同时写在真实富文本 run 及其默认文本属性上,Excel 导出图表时保留其可见的尺寸、颜色与强调
不受支持的图表家族、堆积或多系列面积图、多系列圆形图、画廊样式、圆角、次要或组合绘图组、日期轴、自定义数字格式、对数轴、自定义交叉行为、旋转文本、趋势线、误差线、层次类别、数据标签、其他标记形状以及缺失的值缓存会在渲染前抛出 EXLSPortableRender
自定义数值轴刻度字体、次要网格、显式主/次单位、无效的显式系列颜色和不受支持的轴位置会被拒绝;条形图例目前要求普通的右侧放置,圆形图要求有限非零的缓存总计和有界几何,并对弧形暂存存储做早期的保守预留
返回的数组保留图元绘制顺序、显式颜色、字体、文本对齐、不透明度与图表裁剪边界;项、字节与文本记账包含保守的渲染器暂存预留,协作的缓存检查先于暂存数组分配
XLSValidateCachedChartSceneModel 对模型执行同样的有界缓存与外观预检,不解析工作表单元格;XLSX 捕获桥在克隆前使用该检查,并记录带本地一维 A1 引用、物理原生锚点偏移、范围裁剪与绘制顺序的受支持编写图表模型
平台中立的录制器位于 lxPortableChart;既有的 lxPagination 入口共享相同的布局与图元录制实现,保留 Windows 渲染器的行为,并对每个受支持家族匹配不可变的场景字节与预算记账
原生 Linux 与 macOS 工作簿捕获使用下文描述的显式几何重载;导入系列的 RGB 填充、绘图区背景、图表背景与图表边框从各自命名空间已解析的形状属性恢复,因此嵌套的系列颜色不会覆盖绘图区背景
导入的保留 ChartML 只有在其命名空间展开后的元素、属性与重要文本流都匹配受支持的类型化重建时才被接受;命名空间别名与属性顺序会规范化,而未建模的原生扩展、外部属性和不受支持的外观会被保守拒绝
原始 XML 与重建的暂存预算在克隆与投影工作之前检查;只有分离副本会清掉其经过校验的保留 XML,源保留原生元数据、单元格存储、缓存内容与生成号
捕获按底层 OfficeArt 绘制顺序遍历,包括不在公开 Shapes 包装中的图表框,并对相交的不受支持框拒绝而不是悄悄略过
带声明外观的 Classic 缓存图表
Classic BIFF8 捕获支持上述七个普通图表家族,前提是其核心记录、本地存储值、显式线性刻度与外观均可表示;它读取保留的记录和可用公式缓存,不求值公式、不展开稀疏存储、也不克隆已编译的公式树
使用 TXLSWorkbook.CreateReadOnlyViewWithChartAppearance(Source, Limits, Geometry) 创建单独的只读视图,带由 IXLSClassicChartAppearanceSource 提供的冻结 TXLSClassicChartAppearanceDeclaration 值集合;Geometry 在 Windows 上可选,在 Linux 或 macOS 上提供显式的原生字体度量
TXLSClassicChartAppearanceDeclarations 是应用实现该来源时可用的图元声明动态数组
把配置好的视图传给 CaptureXLSPortableViewRenderSnapshot(View, SheetIndex, Row1, Col1, Row2, Col2, Limits);坐标为 1 基,捕获完成或被拒绝时适配器恢复调用方的活动工作表
普通捕获入口继续拒绝未解析的生效 Classic 布局或图例字体;这个单独的视图入口使用已冻结的声明和几何提供程序
| 声明成员 | 契约 |
|---|---|
Generation, SheetIndex, ObjectId | 固定的工作簿生成号、1 基工作表索引与实际存储的图表对象身份;过期的生成号、缺失或重复的身份以及属于其他对象的身份都会被拒绝 |
HasChartSize, ChartWidthPoints, ChartHeightPoints | 以点计的显式有限正图表框尺寸;保留存储的锚点原点与绘制顺序,标志为 false 时保持锚点推导的尺寸 |
HasPlotInnerRectangle, PlotInnerRectangle | 显式的内部绘图矩形,不含标签与轴标题;这条声明外观路径必需它 |
HasTitleRectangle, TitleRectangle | 图表有标题时的显式标题矩形;源文本、字族、强调与颜色仍来自经过校验的核心记录 |
HasLegendRectangle, LegendRectangle | 存在图例时声明的图例边界 |
HasLegendFontSize, LegendFontSizePoints | 图例存在时调用方显式的生效磅值;核心字族、强调与颜色保留 |
TXLSPortableChartRectangle | Left、Top、Width 与 Height 是相对捕获图表框的有限点数;活动矩形要求尺寸为正且在该框内 |
Count, GetCount, ReadDeclaration | 视图配置期间,来源报告有界数量并按从零开始的索引返回一个图元记录;声明会在后续捕获之前复制 |
这些值是调用方声明的外观,不是自动的 Excel 布局或推断的字体缩放;请从独立核对过的来源或应用自定义的布局获取它们,并用渲染时使用的显式原生字体映射审查输出
显式的框尺寸与内部绘图边界必须为经过校验的轴标签字体留足空间;标签空间不足会被拒绝,而不是裁剪文本或套用缩放系数
应用在视图释放之前保持工作簿所有者存活;借用的视图持有读取租约并保留声明来源,而得到的不可变快照既不保留工作簿也不保留提供程序
受支持的核心投影包括字面纯色填充、可见实线、圆形标记、标题与图例文本、类别放置以及有界的显式数值刻度;自动刻度、未解析的自动标记外观、平滑、未知富扩展、外部或非线性系列引用和未表示的点样式会在输出前被拒绝
声明几何或图例尺寸并不授权忽略未知的图表扩展或未校验的样式;字节、文本、存储单元格与场景限额对保留的源数据、声明、分离缓存和录制暂存空间仍然生效
额外的 XLSValidateCachedChartSceneModel 与 XLSRecordCachedChartScene 重载为分离模型接受 TXLSCachedChartSceneAppearance;设置显式控件之前先用 XLSDefaultCachedChartSceneAppearance 初始化
更低层的 lxClassicChartScene 中的 XLSReadClassicChartScene 从保留的 TXLSCustomChart、其精确的源计算器和一个租用的 TXLSClassicChartSceneSource 返回调用方持有的分离 TXLSXChart 以及图元外观与预算计数器;录制完成后释放返回的模型
TXLSClassicChartSceneSource.ReadAppearance 提供一个图元声明,ReadCell 读取有界的固定本地存储值,ReadFont 用有界的生效核心字体数据填充给定的文本样式,PaletteColor 解析显式存储的调色板条目;应用实现必须保留固定的源并遵守每个给定的字节与字符配额
| 场景外观成员 | 含义 |
|---|---|
SeriesMarkerSizePoints | 有界的每系列点直径,包括小数值;零保持模型的标记尺寸,非零覆盖必须在 2 到 72 点之间 |
OverrideBorder, BorderColorRGB, BorderWidthPoints | 显式的图表框轮廓外观 |
AxisColorRGB, TickColorRGB, GridlineColorRGB, AxisWidthPoints, TickWidthPoints, GridlineWidthPoints | 显式的轴、刻度与主网格绘制颜色及点宽度 |
AreaFillOpacity, SeriesFillAlpha | 面积不透明度与系列填充 alpha |
UseAxisTickControls, CategoryBetween | 经过校验的显式轴控件与类别放置 |
TitleOffsetXPoints, TitleOffsetYPoints | 施加到录制器普通标题位置的有限偏移 |
OverridePlotInnerRectangle, OverrideTitleRectangle, OverrideLegendRectangle, PlotInnerRectangle, TitleRectangle, LegendRectangle | 相对图表框的字面点矩形 |
PieRadiusRatio | 圆形绘图半径占较小绘图维度的有界比例 |
图表图元遵循 HotXLS 既有的布局策略;需要 Excel 未建模默认值的图表画廊外观仍是显式的不支持边界
直接原生工作簿捕获
CreateXLSPortableCairoRenderGeometry(Fonts, Calibration, Generation, Backend, Options, CacheCapacity) 返回由与原生输出相同的显式字体文件、FreeType、HarfBuzz 和文本整形支撑的 IXLSRenderGeometry;列宽使用结合工作簿校准的实际测量的最大数字宽度
提供程序持有分离的字体字节和有界的度量缓存,在分配前检查字体与布局预算,并在改变缓存状态前校验度量请求;缓存满时可以返回未缓存的度量而不超出容量
捕获会验证提供程序生成号与全部校准字段是否匹配当前只读工作簿视图,为该视图保留提供程序,并保持工作簿默认几何工厂不变;普通的默认原生几何仍是显式的 GDI 边界
创建提供程序之前,请通过显式释放的视图捕获生成号;保留临时的接口结果可能把其读取租约延续到外围作用域结束
View := Owner.CreateReadOnlyView; Generation := View.Generation; View := nil; Geometry := CreateXLSPortableCairoRenderGeometry(Fonts, Workbook.CaptureRenderCalibration, Generation, xlsrgbBitmap, XLSDefaultPortableCairoOptions, 4096); Snapshot := CaptureXLSPortableRenderSnapshot(Owner, 1, 1, 1, 30, 6, XLSDefaultPortableRenderLimits, Geometry);
原生消费者用 LX_PORTABLE_CORE 和相应的原生依赖编译;Windows 上调用原生 Cairo 几何工厂会被显式拒绝,而 Windows 捕获可以通过同样的作用域重载使用其既有几何工厂
实际的原生捕获支持上文所述的建模标量、富文本、受支持栅格、普通形状与七个缓存图表家族;图表捕获保留原始导入的 ChartML、缓存点、稀疏单元格存储、打包存储与工作簿生成号
不可变打印区域、页边距、适应或百分比缩放、重复标题、手动分页符以及整格或合并格分页,参见 可移植打印计划
高级捕获桥
lxSemanticSnapshot 中的 IXLSRenderCaptureSource 是由受支持只读工作簿视图实现的内部协调接口;普通应用应调用基于所有者的捕获重载
TXLSClassicReadOnlyWorkbookView 与 TXLSXReadOnlyWorkbookView 实现 IXLSRenderCaptureSource,包括下面八个渲染方法;这些类通过只读视图协调捕获,适配器管理其生命周期,应用则保留自己的工作簿所有者接口并调用 CaptureXLSPortableRenderSnapshot
它们既有的 TryReadCell 方法经只读视图提供存储单元格快照;渲染方法为可移植捕获补充分离的外观与几何
| 成员或帮助器 | 用途 |
|---|---|
ValidateRenderRange | 捕获前检查 1 基矩形边界与不受支持的外观足迹 |
ReadRenderStyle | 为 1 基单元格返回分离的 TXLSSemanticCellStyle 元数据和富文本存在标志 |
IXLSRenderRichTextCaptureSource, ReadRenderRichText | 可选的视图扩展,返回有界的分离 TXLSRenderTextRuns;每个 TXLSRenderTextRun 包含 Text 与生效的语义 Style,使用提供的基础样式和正的 run/字节配额,不物化单元格也不修改样式池 |
RenderRowHeightPoints, RenderColumnWidthPoints | 返回物理几何,把隐藏维度折叠为零 |
IXLSRenderGeometryCaptureSource, SetRenderCaptureGeometry | 可选的视图扩展,仅在生成号与校准校验通过后保留显式提供程序;无效的提供程序保持视图已保留的提供程序不变 |
ReadRenderMerge | 报告包含某单元格的完整含端点 1 基合并矩形 |
ResolveRenderColor | 把语义主题/索引/RGB 外观解析为可移植 RGB 颜色,在受支持处使用给定的默认值 |
RenderDate1904, RenderRightToLeft | 暴露工作簿日期系统与工作表阅读顺序上下文 |
XLSRenderCaptureLiteral | 识别受支持的字面布尔、有限数字或简单带引号文本子集,供无需求值的捕获使用 |
XLSRenderCaptureIntersects | 对 1 基矩形测试空白分隔的本地 A1 区域,拒绝无法解析的区域语法 |
XLSRenderCaptureCondition | 对既有标量求值受支持的条件子集;比较运算符代码 1 到 8 分别表示介于、不介于、等于、不等于、大于、小于、大于等于和小于等于 |
XLSRenderCaptureApplyDxf | 用 AppliedSlots 掩码应用受支持的分离差分外观,保留更高优先级的格式 |
TXLSDxfStyle._MarkRenderUnsupportedAppearance, TXLSDxfStyle._HasRenderUnsupportedAppearance | 内部前缀的导入协调方法,记录并检查类型化差分模型无法安全渲染的外观;Assign 保留标记,捕获会拒绝带标记的匹配样式 |
这些桥帮助器可能抛出 EXLSSemanticSnapshot;公开的捕获适配器会把该异常转换为 EXLSPortableRender