可攜式無頭輸出
自版本 2.384.100 起,以有界的輸出管線提供明確的擷取與渲染 API
在 Windows 上從傳統 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.
使用活頁簿物件的期間,讓擁有者介面保持存活;介面持有的活頁簿請釋放介面,不要手動 Free
傳統 XLS 請改用 lxHandle 的 TXLSWorkbook 與 IXLSWorkbook,擷取呼叫相同
擷取讀取既有的公式快取,矩形內任何沒有快取的公式都會被拒;它絕不隱含重算、不抓取外部資料,也不在來源活頁簿中登記新樣式
當應用程式需要最新的公式結果時,請在擷取前明確重新計算;既有快照會照儲存原樣渲染,擷取並不為其新鮮度背書
操作會持有讀取檢視,並在回傳前檢查活頁簿世代;回傳的快照已與活頁簿擁有權分離,活頁簿釋放後仍可使用
外觀與擷取邊界
快照包含格式化後的顯示文字、以點為單位的實際尺寸、解析後的 RGB 色彩、受支援的儲存格字型與對齊、填滿、框線與完整的合併矩形;隱藏列與隱藏欄尺寸為零
受支援的字型外觀包括粗體、斜體、單線底線與刪除線;受支援的儲存格外觀包括實心填滿、左/中/右水準對齊、靠上/置中/靠下垂直對齊、自動換列、縮小以適當大小與由右至左閱讀順序
細、中、粗、髮絲、雙線、點狀、虛線與中虛線等活頁簿框線會映射到可攜框線樣式與點寬度;其他框線樣式會被拒
受支援的 rich text 帶有生效的 run 字型、點數、RGB 色彩、粗體、斜體、單線底線、刪除線,以及 run 層級的上標或下標;普通的儲存格外框/陰影/垂直字型效果、不受支援的底線樣式、漸層或圖樣填滿、對角框線、縮排、文字旋轉與不受支援的對齊都會被拒
擷取矩形必須完整包含每個合併儲存格;被裁切、重疊或不一致的合併,以及合併外緣上不相容的樣式都會被拒
工作表背景與不受支援的工作表種類會讓擷取被拒;兩套活頁簿外觀層中受支援的 PNG/JPEG 圖片與普通矩形/橢圓文字圖形會被擷取成有序的場景物件,連同 XLSX 儲存格圖片、布林核取方塊與下述受支援的快取 XLSX 圖表子集;不受支援的圖表、圖形預設樣式、WordArt、群組轉換、浮動控制項、交叉分析篩選器、時間軸與走勢圖,在其解析出的足跡與矩形相交時會被拒
足跡能可靠解析且位於矩形外的不受支援內容可以與擷取並存;無法解析的繪圖足跡會被拒,而不是默默略過可能重疊的內容
與矩形相交的傳統資料表樣式會被拒;XLSX 內建與受支援的自訂 Table 區段會在分離的樣式內容中解析,帶有區段大小的條紋與直接的儲存格格式覆寫
對受支援的已匯入 Table 實心或隱含差異填滿,RGB bgColor 提供可見背景;只有 RGB fgColor 時繼承的背景不變,同時帶兩種色彩的區段使用其背景色
含具型別摘要無法表達之外觀的已匯入 Table 區段,在該區段適用時會被拒,包括底線、數字格式、明確清除的粗體/斜體、字型配置、明確的無填滿圖樣與不受支援的色彩形式;位於擷取矩形外的無關區段不會擋住擷取
受支援的條件式格式設定在不評估公式的情況下套用:針對字面數值邊界的快取數值或日期比較、字面布林或數值運算式、文字包含/前綴/後綴規則、空白與錯誤;每個受支援屬性都是優先權較高的外觀勝出,XLSX 的 StopIfTrue 會停止優先權較低的相符規則
傳統文字規則要求字面字串 needle 並比對快取字串儲存格;XLSX 文字規則使用其儲存的文字條件
受支援的差異外觀包括含濃度(tint)的已解析佈景主題色彩與普通索引色彩;已匯入的自動色彩、非佈景主題濃度、同時帶前景與背景色的差異填滿,以及不受支援的框線、對齊、刪除線或其他未表達的差異外觀,在符合的規則適用時會被拒
需要評估的條件公式、彙總或日期相依規則、色階、資料橫條與圖示集會在遇到時被拒;重疊的條件式格式規則數量有上限
Date1904 轉換會在套用曆法偏移之前,先挑出適用的原始數值格式區段;不活動的曆法區段不改變普通數值顯示,布林值仍是布林
被選中的 Date1904 曆法區段若搭配格式條件或經過時間結構會被拒;加引號或跳脫的區段分隔符同樣被拒,而這條邊界不會只因為另一個區段是曆法格式,就擋住被選中的普通數值區段
Rich text 與有序繪圖場景
TXLSPortableCell.RichText 是 TXLSPortableTextRun 記錄的陣列,包含 Text、FontFamily、FontSizePoints、FontStyles、ColorRGB 與 BaselineShiftPoints;串接後的 run 文字必須與儲存格顯示文字完全相等
XLSX run 從生效的擷取儲存格字型繼承省略的屬性,包括受支援的資料表與條件式格式;明確指派為 false 的旗標與明確的 none/baseline/automatic 色彩值會覆寫繼承
原生共用字串與內嵌字串保留 run 邊界與空白;不受支援的原生字型子元素、屬性、命名空間、佈景主題/索引 rich 色彩與注音標註會被拒,而不是默默丟失可見外觀
傳統 run 把儲存的 BIFF 字型索引解析成完整的生效 run 字型;注音中繼資料與不受支援的 run 字型會被拒,擷取則保留活頁簿世代與樣式池
傳統文字圖形讀取既有的 OfficeArt 屬性與 TXO 字型 run,不建立繪圖包裝也不改變活頁簿;錨點使用實際的列欄尺寸與偏移,受支援的實心填滿與外框保留其色彩與寬度,內嵌的 PNG/JPEG 位元組在傳輸前已分離
矩形文字使用原生 7.2pt 水準與 3.6pt 垂直邊距;橢圓文字另外使用其內接文字矩形,在兩套活頁簿外觀層中都讓普通文字留在圖形外框內
已匯入的傳統矩形與橢圓容器保留其具型別文字與格式;有已解析足跡卻被跳過的原生圖形或群組中繼資料會明確拒絕擷取,而未知物件尾端記錄、繪圖擴充、旋轉、非實心填滿與不受支援的線條樣式會拒絕相交的物件
已匯入的 XLSX 雙儲存格矩形與橢圓錨點支援帶 alpha 的明確 RGB 實心填滿、實線或虛線/點線外框、實體錨點偏移與單一普通 rich text 段落;每個 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 圖片在標頭、像素尺寸與位元組前置檢查之後原生解碼;受支援的浮動圖片保留透明度與拉伸幾何,儲存格圖片則在保持長寬比的前提下塞進儲存格或完整合併矩形
裁切、旋轉、陰影、亮度/伽瑪調整、並排、SVG 伴隨檔與即時相機綁定仍不支援;保留的圖片 XML 會對照受支援的外觀驗證,因此隱藏圖片、未知巢狀中繼資料、外部命名空間屬性、非矩形圖片幾何與未建模的轉換,只在其足跡與擷取重疊時被拒
布林儲存格核取方塊使用不依賴佈景主題的向量方框與選用的勾選記號,包括從列欄格式繼承的生效控制項;要求的儲存格走訪在遍歷前有上限,其他控制項種類與空白或非布林的核取方塊值會被拒,受支援的儲存格場景則抑制純量布林或圖片錯誤的後備文字
核取方塊預設值是插入用中繼資料,不會為缺席的儲存格製造布林;明確的直接儲存格控制項清除會蓋掉繼承的控制項,而擷取讀取保留稀疏缺席與活頁簿世代
XLSReadPortableImageDimensions 驗證有界的 PNG IHDR 或受支援的八位循序/漸進 JPEG 影格,並回傳其宣告的寬高;解碼仍由渲染器負責
IXLSPortableSceneCaptureSource.ReadPortableSceneObjects 使用 1 為基底的活頁簿座標與相對範圍、以點為基準的場景座標,驗證範圍與合作上限,並回傳消耗的位元組、文字與項目數;HasPortableCellScene 識別其純量顯示被擷取場景取代的儲存格
原生版面的 CellCount 計數格線儲存格,LineCount 還包含文字場景物件;文字物件的行 CellIndex 是 CellCount 加上它在文字場景物件中以零為基底的序號,GetCellGeometry 則仍限於格線儲存格
純量快照繼續序列化為 HXRSNP01;含 run 或場景物件的快照序列化為 HXRSNP02,載入器以同樣的不可變擁有權與輸入位置回復契約接受兩種版本
合計的項目預算計入已儲存儲存格、rich 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 | 初始化單一儲存格跨度,使用 11 點 Calibri 與預設的零值外觀;建構前先設定位置與想要的外觀 |
CreateXLSPortableRenderSnapshot | 驗證並複製世代、列高、欄寬與已儲存儲存格到分離的不可變介面;儲存格必須唯一、按列主序、在邊界內且跨度不重疊 |
IXLSPortableRenderSnapshot | 唯讀的 Generation、RowCount、ColumnCount、CellCount、以零為基底的 RowHeightPoints、ColumnWidthPoints 與複製的 Cells 記錄 |
| 快照 getter 方法 | GetGeneration、GetRowCount、GetColumnCount、GetCellCount、GetRowHeight、GetColumnWidth 與 GetCell 公開相同的值;無效的索引存取會擲出例外 |
SaveXLSPortableRenderSnapshot | 驗證並把一個快照序列化到有界的私有緩衝,再把完整的 HXRSNP01 或 HXRSNP02 承載複製到提供的串流目前位置 |
LoadXLSPortableRenderSnapshot | 讀取版本化的小端序快照,使用嚴格的 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 檔案;沒有系統字型探索,也沒有合成的粗體/斜體替代,缺少檔案、樣式映射或字形涵蓋都會被拒
字型位元組在 shaping 之前擷取,因此改檔案影響的是之後的版面,既有版面保留其擷取的位元組;FaceIndex 選擇字型檔或字型集合中非負的 face
原生操作為了 FreeType face 安全而序列化;不可變快照與版面檢視準備不需要現用活頁簿
Fonts[0].FamilyName := 'Calibri'; Fonts[0].FileName := '/srv/fonts/Regular.ttf'; Fonts[0].FaceIndex := 0; Fonts[0].Bold := False; Fonts[0].Italic := False;
這裡的 Calibri 是所選檔案的明確家族別名,讓應用程式可控字型映射;映射到不同字型時請檢查輸出指標
渲染器支援硬換行、四空白 tab 展開、段落雙向排序、造形連字與組合符號、貪婪換列與縮小以適當大小;換列優先於縮小
換列保留已實作的組合符號、變體選擇子、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,加上頁面、字形、行、版面、輸出、字型、shaping 與繪製上限 |
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 個 shaped 字形與 200000 條文字行 |
MaxLayoutBytes | 268435456 位元組,用於有界的版面工作與點陣表面檢查 |
MaxOutputBytes | 每個渲染輸出緩衝 268435456 位元組,涵蓋完整 PDF 或單一 SVG/PNG 頁,而非多個頁面檔案的總和 |
MaxFontBytes | 單一版面的明確字型輸入檔合計 134217728 位元組 |
MaxShapedCharacters, MaxDrawOperations | 各 16000000,約束 shaping 工作與逐儲存格的頁面繪製工作 |
無效或非有限的幾何與非正的工作預算會被拒;頁面尺寸上限 100000 點,點陣 DPI 上限 1200,渲染前還有額外的位元組、數量與點陣面積檢查
處理序層級的原生字型位元組池另外限制最多 256 個相異緩衝與 256 MiB;完全相同的位元組可共用儲存,容量只在實際由 Cairo 持有的字型 face 釋放其緩衝時才釋放
用完每個版面請記得釋放;程式庫不會重設共用的 Cairo 快取,邏輯上已完成的版面可能讓字型位元組持續駐留,因為原生 Cairo 仍持有 face
寫出輸出與處理失敗
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 文字,每個映射四個以 tab 分隔的欄位:家族別名、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 並省略數值軸,普通單數列區域圖則保留圍繞零基準線的填充多邊形
折線與散佈數列支援獨立的線條可見性、明確 RGB 色彩與點寬,透過 LineVisible、LineColorRGB 與 LineWidthPoints;LineStyleSet、LineColorSet 與 LineWidthSet 區分明確設定與繼承預設,EffectiveLineVisible 則解析既有的僅填滿數列慣例
資料標記支援自動圓形、明確圓形或無標記;明確的 MarkerSize 從 2 到 72 設定其點直徑,MarkerFillSet 與 MarkerBorderSet 區分明確的黑色 RGB 零值與自動色彩選擇;連接線段繪製在不透明的資料標記之前
沒有儲存寬度的明確標記外框使用普通的 0.75 點線條,圖例範例的圓形直徑上限 6 點;要求的標題字型同時寫在實際的 rich text run 與其預設文字屬性上,Excel 匯出圖表時保留其可見的大小、色彩與強調
不受支援的圖表家族、堆疊或多數列區域圖、多數列圓形圖、圖庫樣式、圓角、次要或合併繪圖群組、日期軸、自訂數字格式、對數軸、自訂交叉行為、旋轉文字、趨勢線、誤差線、階層類別、資料標籤、其他標記形狀與缺失的數值快取,都會在渲染前擲出 EXLSPortableRender
自訂數值軸刻度字型、次要格線、明確的主/次單位、無效的明確數列色彩與不受支援的軸位置會被拒;橫條圖例目前要求普通的右側放置,圓形圖則要求有限且非零的快取總計,以及幾何有界並為弧形暫存空間預留早一步的保守空間
回傳的陣列保留原始繪製順序、明確色彩、字型、文字對齊、不透明度與圖表裁剪邊界;項目、位元組與文字計帳包含保守的渲染器暫存預留,合作式的快取檢查則在暫存陣列配置之前
XLSValidateCachedChartSceneModel 對模型執行同樣的有界快取與外觀前置檢查,而不解析工作表儲存格;XLSX 擷取橋在複製前使用這項檢查,並記錄帶本機一維 A1 參照、實體原生錨點偏移、範圍裁剪與繪製順序的受支援撰寫圖表模型
平台中立的記錄器位於 lxPortableChart;既有的 lxPagination 進入點共用同一套版面與原始元素記錄本體,保留 Windows 渲染器的行為,並對每個受支援家族比對不可變的場景位元組與預算計帳
原生 Linux 與 macOS 的活頁簿擷取使用下述明確幾何多載;已匯入的數列 RGB 填滿、繪圖區背景、圖表背景與圖表外框從各自的命名空間解析圖形屬性還原,因此巢狀的數列色彩不會蓋掉繪圖區背景
已匯入的保留 ChartML 只有在其展開命名空間的元素、屬性與重要文字流都符合受支援的具型別重建時才被接受;命名空間別名與屬性順序會正規化,而未建模的原生擴充、外部屬性與不受支援的外觀則保守地拒絕
原始 XML 與重建的暫存預算在複製與投影工作之前檢查;只有分離副本會清掉其驗證過的保留 XML,來源保留原生中繼資料、儲存格儲存、快取內容與世代
擷取會走訪底層 OfficeArt 繪製順序,包括公開 Shapes 包裝中缺席的圖表框,並拒絕相交的不受支援框,而不是默默略過
宣告外觀的傳統快取圖表
傳統 BIFF8 擷取支援上述七個普通圖表家族,前提是其核心記錄、本機儲存值、明確線性縮放與外觀皆可表達;它讀取保留的記錄與可用的公式快取,不評估公式、不展開稀疏儲存,也不複製已編譯的公式樹
使用 TXLSWorkbook.CreateReadOnlyViewWithChartAppearance(Source, Limits, Geometry) 建立獨立的唯讀檢視,附帶由 IXLSClassicChartAppearanceSource 提供的凍結 TXLSClassicChartAppearanceDeclaration 值組;Geometry 在 Windows 上可省略,在 Linux 或 macOS 上提供明確的原生字型量測
TXLSClassicChartAppearanceDeclarations 是原始宣告的動態陣列,應用程式可用它實作該來源
把設定好的檢視傳給 CaptureXLSPortableViewRenderSnapshot(View, SheetIndex, Row1, Col1, Row2, Col2, Limits);座標為 1 為基底,擷取完成或被拒時配接器會還原呼叫端目前的工作表
普通擷取進入點仍拒絕未解析的有效傳統版面或圖例字型;這個獨立檢視進入點則使用已凍結的宣告與幾何提供者
| 宣告成員 | 契約 |
|---|---|
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 版面或推導的字型縮放;請從獨立檢查過的來源或應用程式自訂版面取得,並用渲染時的明確原生字型映射審視輸出
明確的框尺寸與內部繪圖邊界必須為驗證過的軸標籤字型留下足夠空間;標籤空間不足會被拒,而不是裁切文字或套用貼合的縮放係數
應用程式要讓活頁簿擁有者存活到檢視釋放為止;借用的檢視持有讀取租約並保留宣告來源,而產生的不可變快照既不保留活頁簿也不保留提供者
受支援的核心投影包括字面實心填滿、可見實線、圓形標記、標題與圖例文字、類別放置與有界的明確數值刻度;自動縮放、未解析的自動標記外觀、平滑化、未知的 rich 擴充、外部或非線性的數列參照,以及未表達的點樣式都會在輸出前被拒
宣告幾何或圖例尺寸並不授權忽略未知的圖表擴充或未驗證的樣式;位元組、文字、已儲存儲存格與場景上限對保留的來源資料、宣告、分離快取與記錄暫存空間仍然有效
另一組 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 與文字 shaping 為後盾的 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 擷取可以透過同樣的範圍化多載使用其既有幾何工廠
實際的原生擷取支援上述模型化的純量、rich text、受支援點陣、普通圖形與七個快取圖表家族;圖表擷取保留原始已匯入的 ChartML、快取點、稀疏儲存格儲存、緊密儲存與活頁簿世代
不可變的列印範圍、邊距、貼合或百分比縮放、重複標題、手動分頁,以及整儲存格或合併儲存格分頁,請見可攜式列印計畫
進階擷取橋
lxSemanticSnapshot 中的 IXLSRenderCaptureSource 是由受支援唯讀活頁簿檢視實作的內部協調介面;普通應用程式應呼叫以擁有者為基礎的擷取多載
TXLSClassicReadOnlyWorkbookView 與 TXLSXReadOnlyWorkbookView 實作 IXLSRenderCaptureSource,包括以下八個渲染方法;這些類別透過唯讀檢視協調擷取,配接器管理其生命週期,應用程式則保留活頁簿擁有者介面並呼叫 CaptureXLSPortableRenderSnapshot
它們既有的 TryReadCell 方法透過唯讀檢視提供已儲存儲存格快照;渲染方法則加上供可攜擷取使用的分離外觀與幾何
| 成員或輔助 | 用途 |
|---|---|
ValidateRenderRange | 在擷取前檢查 1 為基底的矩形邊界與不受支援的外觀足跡 |
ReadRenderStyle | 為 1 為基底的儲存格回傳分離的 TXLSSemanticCellStyle 中繼資料與 rich text 存在旗標 |
IXLSRenderRichTextCaptureSource, ReadRenderRichText | 選用的檢視擴充,回傳有界的分離 TXLSRenderTextRuns;每個 TXLSRenderTextRun 含 Text 與生效的語意 Style,使用提供的基本樣式與正數的 run/位元組配額,不具體化儲存格也不修改樣式池 |
RenderRowHeightPoints, RenderColumnWidthPoints | 回傳實體幾何,把隱藏維度折疊為零 |
IXLSRenderGeometryCaptureSource, SetRenderCaptureGeometry | 選用的檢視擴充,只有在世代與校正驗證通過後才保留明確提供者;無效的提供者讓已保留的檢視提供者不變 |
ReadRenderMerge | 回報包含某儲存格的完整含端 1 為基底合併矩形 |
ResolveRenderColor | 把語意的佈景主題/索引/RGB 外觀解析成可攜 RGB 色彩,受支援處使用提供的預設值 |
RenderDate1904, RenderRightToLeft | 公開活頁簿日期系統與工作表閱讀順序內容 |
XLSRenderCaptureLiteral | 識別受支援的字面布林、有限數值或簡單加引號文字子集,供免評估的擷取使用 |
XLSRenderCaptureIntersects | 以空白分隔的本機 A1 範圍對 1 為基底矩形做相交測試,未解析的範圍語法會被拒 |
XLSRenderCaptureCondition | 對既有純量評估受支援的條件子集;比較運算子代碼 1 到 8 分別代表 between、not-between、equal、not-equal、greater、less、greater-or-equal 與 less-or-equal |
XLSRenderCaptureApplyDxf | 使用 AppliedSlots 遮罩套用受支援的分離差異外觀,以保留優先權較高的格式 |
TXLSDxfStyle._MarkRenderUnsupportedAppearance, TXLSDxfStyle._HasRenderUnsupportedAppearance | 內部前綴的匯入協調方法,記錄並檢視具型別差異模型無法安全渲染的外觀;Assign 保留標記,擷取則拒絕被標記且相符的樣式 |
這些橋接輔助可能擲出 EXLSSemanticSnapshot;公開的擷取配接器會把該例外轉成 EXLSPortableRender