From d57631a19a07f86fd1874f3afe87889f57553afe Mon Sep 17 00:00:00 2001 From: csh Date: Mon, 23 Jun 2025 10:50:55 +0800 Subject: [PATCH] v1.8.0 --- funcext/TSOffice/TOfficeObj.tsf | 31 ++++++++++++++++++--- funcext/TSOffice/TSDocxFile.tsf | 21 +++++++++++++- funcext/TSOffice/TSXlsxFile.tsf | 2 +- funcext/TSOffice/document/TTableContent.tsf | 10 +++++++ 更新日志.md | 9 ++++++ 5 files changed, 67 insertions(+), 6 deletions(-) diff --git a/funcext/TSOffice/TOfficeObj.tsf b/funcext/TSOffice/TOfficeObj.tsf index 6ed9714..48184de 100644 --- a/funcext/TSOffice/TOfficeObj.tsf +++ b/funcext/TSOffice/TOfficeObj.tsf @@ -1,4 +1,4 @@ -// Version 1.7.9 +// Version 1.8.0 Function TOfficeObj(n); Begin case lowercase(n) of @@ -5511,7 +5511,7 @@ type TBr=class(NodeInfo) Function GetAttrs(); override; Begin - return array(("Type", "w:type", Type, ""),("Clear", "w:left", Clear, "")) union ExtAttr; + return array(("Type", "w:type", Type, ""),("Val", "w:val", Val, ""),("Clear", "w:left", Clear, "")) union ExtAttr; End; Function GetChildren(); override; @@ -5521,6 +5521,7 @@ type TBr=class(NodeInfo) //Attributes Type; + Val; Clear; //Nodes @@ -13244,8 +13245,30 @@ Type TDocumentBody = Class(DocObject) para.PPr.RPr := customCell[i, j, 2]; else para.PPr.RPr := defaultParagraph.pPr.rpr; - para.Run.SetText(ifstring(tbl.Data_[i, j]) ? tbl.Data_[i, j] : ''); - para.Run.RPr := para.PPr.RPr; + str := tbl.Data_[i, j]; + AdjustLineBreaks(str, 0); + if not class(TSXml).IsUtf8() then + str := class(TSXml).CurCodePageToUtf8(str); + lines := str2array(str,'\n'); + if lines[0] <> '' then + begin + para.Run.T := lines[0]; + para.Run.RPr := para.PPr.RPr; + end + for i:=1 to length(lines)-1 do Begin + r := para.AddRun(); + r.Br.Val := 1; + r.RPr := para.PPr.RPr; + r := para.AddRun(); + r.T := lines[i]; + r.RPr := para.PPr.RPr; + if _preserve(lines[i]) then + begin + r := para.AddRun(); + r.Space := "preserve"; + r.RPr := para.PPr.RPr; + end + End; tcNode.InsertEndChild(para.Marshal()); End else Begin diff --git a/funcext/TSOffice/TSDocxFile.tsf b/funcext/TSOffice/TSDocxFile.tsf index eaaefab..8ee56a0 100644 --- a/funcext/TSOffice/TSDocxFile.tsf +++ b/funcext/TSOffice/TSDocxFile.tsf @@ -1,4 +1,4 @@ -// Version 1.7.9 +// Version 1.8.0 Type TSDocxFile = Class ///Version: V1.0 2022-09-20 ///适用于 Microsoft Word docx格式文件 @@ -536,6 +536,25 @@ Type TSDocxFile = Class //AddPageBreak(content.node_); return content; End; + + ///添加自定义目录 + ///[posOpt: 段落位置],在posOpt之后新添加目录(否则在首页添加) + ///UpperHeadingLevel:标题最高级别 + ///LowerHeadingLevel:标题最低级别 + /// 使用 UpperHeadingLevel 属性可设置起始标题级别(最高)。例如,若要设置 TOC 域语法 {TOC \o "1-3"},可将 LowerHeadingLevel 属性设为 3,并将 UpperHeadingLevel 属性设为 1。 + ///因为word、wps、openoffice等软件对于页码的计算各不相同,本功能不直接设置页码,需要用相关客户端软件打开文件后,更新目录域。 + Function AddCustomTableContent(posOpt, UpperHeadingLevel, LowerHeadingLevel); + Begin + content := new TTableContent(self); + node := getPosNode(posOpt); + content.CustomAdd(node, UpperHeadingLevel, LowerHeadingLevel); //标题级别 + if ifObj(node) then + content.node_ := document_.Body().node_.InsertAfterChild(node, content.Marshal()); + else + content.node_ := document_.Body().node_.InsertFirstChild(content.Marshal()); + //AddPageBreak(content.node_); + return content; + End; ///获取全部标题列表 ///UpperHeadingLevel:标题最高级别 diff --git a/funcext/TSOffice/TSXlsxFile.tsf b/funcext/TSOffice/TSXlsxFile.tsf index 3d0d21f..17dff27 100644 --- a/funcext/TSOffice/TSXlsxFile.tsf +++ b/funcext/TSOffice/TSXlsxFile.tsf @@ -1,4 +1,4 @@ -// Version 1.7.9 +// Version 1.8.0 Type TSXlsxFile = Class ///Version: V1.0 2022-08-08 ///适用于 Microsoft Excel? 2007 及以上版本创建的电子表格文档。支持 XLSX / XLSM / XLTM / XLTX 等多种文档格式。 diff --git a/funcext/TSOffice/document/TTableContent.tsf b/funcext/TSOffice/document/TTableContent.tsf index 530664a..c4be09b 100644 --- a/funcext/TSOffice/document/TTableContent.tsf +++ b/funcext/TSOffice/document/TTableContent.tsf @@ -94,6 +94,16 @@ Type TTableContent = class _AddTableContent(posOpt, UpperHeadingLevel, LowerHeadingLevel); End; + ///添加目录条目 + ///UpperHeadingLevel:标题最高级别 + ///LowerHeadingLevel:标题最低级别 + /// 使用 UpperHeadingLevel 属性可设置起始标题级别(最高)。例如,若要设置 TOC 域语法 {TOC \o "1-3"},可将 LowerHeadingLevel 属性设为 3,并将 UpperHeadingLevel 属性设为 1。 + Function CustomAdd(posOpt, UpperHeadingLevel, LowerHeadingLevel); + Begin + //自定义页码计算与word、wps有差异,不推荐使用 + _AddTableContent(posOpt, UpperHeadingLevel, LowerHeadingLevel); + End; + Function _AddDefaultTableContent(UpperHeadingLevel, LowerHeadingLevel); Begin p := _AddItem(UpperHeadingLevel, LowerHeadingLevel, UpperHeadingLevel - 1, true); diff --git a/更新日志.md b/更新日志.md index f14f6ff..b7d6c35 100644 --- a/更新日志.md +++ b/更新日志.md @@ -1,5 +1,14 @@ # 更新日志 +## 2025-6-23 + +### V1.8.0 + +#### word + +1. **feat**: 支持添加自定目录`TSDocxFile.AddCustomTableContent` +2. **fix**: 修复单元格内容换行,自定义属性失效问题 + ## 2025-2-28 ### V1.7.9