diff --git a/Demo/wordHelp.tsl b/Demo/wordHelp.tsl index 675b329..12d1579 100644 --- a/Demo/wordHelp.tsl +++ b/Demo/wordHelp.tsl @@ -69,7 +69,9 @@ _Annotation(docx); _Faq(docx); ///目录 -docx.AddTableContent(paragraphTitle, 1, 3); +content := docx.AddTableContent(paragraphTitle, 1, 3); +docx.AddPageBreak(content.node_); + v := docx.SaveAs('', TOfficeApi().CurCodePageToGBK('DocxFile使用帮助.docx')); println('Test Over!\n Save {}: {},time={}秒', file, v, mtoc); diff --git a/DocxFile使用帮助.docx b/DocxFile使用帮助.docx index 3482fc1..e622813 100644 Binary files a/DocxFile使用帮助.docx and b/DocxFile使用帮助.docx differ diff --git a/funcext/TSOffice/TOfficeObj.tsf b/funcext/TSOffice/TOfficeObj.tsf index 995bb33..5919a95 100644 --- a/funcext/TSOffice/TOfficeObj.tsf +++ b/funcext/TSOffice/TOfficeObj.tsf @@ -1,4 +1,4 @@ -// Version 1.3.9 +// Version 1.4.0 Function TOfficeObj(n); Begin @@ -167,6 +167,8 @@ Begin return new TNumPr(); "ttextbox": return new TTextBox(); + "twhyperlinkimpl": + return new TWHyperLinkImpl(); "twppr": return new TwpPr(); "tcnvgraphicframepr": @@ -285,10 +287,10 @@ Begin return new TDocxStyle(); "tdocpartobj": return new TDocPartObj(); - "tstdpr": - return new TStdPr(); - "tstdendpr": - return new TStdEndPr(); + "tsdtpr": + return new TSdtPr(); + "tsdtendpr": + return new TSdtEndPr(); "tsdtcontent": return new TSdtContent(); "ttablecontentimpl": @@ -5843,10 +5845,10 @@ type TwrPr=class(NodeInfo) Begin HandleChildren(); return array(("field":"rFont","name":rFont.NodeName,"obj":rFont,"attrEx":"","nodeType":"","attrName":"", "desc":"", "class":"TwFont") - ,("field":"Bold","name":"w:b","obj":Bold,"attrEx":"","nodeType":"empty","attrName":"", "desc":"黑体", "class":"") + ,("field":"Bold","name":"w:b","obj":Bold,"attrEx":"w:val","nodeType":"empty","attrName":"", "desc":"黑体", "class":"") ,("field":"noProof","name":"w:noProof","obj":noProof,"attrEx":"","nodeType":"empty","attrName":"", "desc":"不检查拼写或语法)", "class":"") ,("field":"Color","name":"w:color","obj":Color,"attrEx":"w:val","nodeType":"","attrName":"", "desc":"字体颜色", "class":"") - ,("field":"bCs","name":"w:bCs","obj":bCs,"attrEx":"","nodeType":"empty","attrName":"", "desc":"复杂脚本黑体", "class":"") + ,("field":"bCs","name":"w:bCs","obj":bCs,"attrEx":"w:val","nodeType":"empty","attrName":"", "desc":"复杂脚本黑体", "class":"") ,("field":"Italic","name":"w:i","obj":Italic,"attrEx":"","nodeType":"empty","attrName":"", "desc":"斜体", "class":"") ,("field":"Strike","name":"w:strike","obj":Strike,"attrEx":"","nodeType":"empty","attrName":"", "desc":"单个删除线", "class":"") ,("field":"dStrike","name":"w:dstrike","obj":dStrike,"attrEx":"w:val","nodeType":"","attrName":"", "desc":"两个删除线", "class":"") @@ -5859,6 +5861,8 @@ type TwrPr=class(NodeInfo) ,("field":"Lang","name":"w:lang","obj":Lang,"attrEx":"w:val","nodeType":"","attrName":"", "desc":"处理使用拉丁字符的本次运行内容时用于检查拼写和语法的语言.", "class":"") ,("field":"bidi","name":"w:lang","obj":bidi,"attrEx":"w:bidi","nodeType":"","attrName":"", "desc":"处理使用复杂脚本字符的运行内容时应使用的语言.", "class":"") ,("field":"Del","name":Del.NodeName,"obj":Del,"attrEx":"","nodeType":"","attrName":"", "desc":"disable", "class":"TOptInfo") + ,("field":"StyleId","name":"w:rStyle","obj":StyleId,"attrEx":"w:val","nodeType":"","attrName":"", "desc":"disable", "class":"") + ,("field":"WebHidden","name":"w:webHidden","obj":WebHidden,"attrEx":"w:val","nodeType":"empty","attrName":"", "desc":"disable", "class":"") ) union ExtNodes; End; @@ -5909,6 +5913,8 @@ type TwrPr=class(NodeInfo) Lang; bidi; Del; + StyleId; + WebHidden; End; /////////////////////////////////////////////////////////////// @@ -6003,6 +6009,50 @@ type TTextBoxImpl=class(NodeInfo) P; End; +/////////////////////////////////////////////////////////////// +/// TWHyperLinkImpl +/////////////////////////////////////////////////////////////// +type TWHyperLinkImpl=class(NodeInfo) + Function Create(); overload; + Begin + Create(nil, 'w:hyperlink'); + End; + + Function Create(p, name); overload; + Begin + Class(NodeInfo).Create(p, name); + Init(); + End; + + Function Init(); + Begin + //TODO... + End; + + Function InitRootNode(node); + Begin + RootObj := node; + End; + + Function GetAttrs(); override; + Begin + HandleAttrs(); + return array(("Anchor", "w:anchor", Anchor, ""),("History", "w:history", History, "")) union ExtAttr; + End; + + Function GetChildren(); override; + Begin + HandleChildren(); + return ExtNodes; + End; + + //Attributes + Anchor; + History; + + //Nodes +End; + /////////////////////////////////////////////////////////////// /// TwpPr /////////////////////////////////////////////////////////////// @@ -9320,9 +9370,9 @@ type TDocPartObj=class(NodeInfo) End; /////////////////////////////////////////////////////////////// -/// TStdPr +/// TSdtPr /////////////////////////////////////////////////////////////// -type TStdPr=class(NodeInfo) +type TSdtPr=class(NodeInfo) Function Create(); overload; Begin Create(nil, 'w:sdtPr'); @@ -9372,9 +9422,9 @@ type TStdPr=class(NodeInfo) End; /////////////////////////////////////////////////////////////// -/// TStdEndPr +/// TSdtEndPr /////////////////////////////////////////////////////////////// -type TStdEndPr=class(NodeInfo) +type TSdtEndPr=class(NodeInfo) Function Create(); overload; Begin Create(nil, 'w:sdtEndPr'); @@ -9476,18 +9526,18 @@ type TTableContentImpl=class(NodeInfo) Function Init(); Begin - stdPr := new TStdPr(self, 'w:sdtPr'); - stdEndPr := new TStdEndPr(self, 'w:sdtEndPr'); - SdtContent := new TSdtContent(self, 'w:sdtContent'); + sdtPr := new TSdtPr(self, 'w:sdtPr'); + sdtEndPr := new TSdtEndPr(self, 'w:sdtEndPr'); + sdtContent := new TSdtContent(self, 'w:sdtContent'); //TODO... End; Function InitRootNode(node); Begin RootObj := node; - stdPr.InitRootNode(node); - stdEndPr.InitRootNode(node); - SdtContent.InitRootNode(node); + sdtPr.InitRootNode(node); + sdtEndPr.InitRootNode(node); + sdtContent.InitRootNode(node); End; Function GetAttrs(); override; @@ -9499,18 +9549,18 @@ type TTableContentImpl=class(NodeInfo) Function GetChildren(); override; Begin HandleChildren(); - return array(("field":"stdPr","name":stdPr.NodeName,"obj":stdPr,"attrEx":"","nodeType":"","attrName":"", "desc":"", "class":"TStdPr") - ,("field":"stdEndPr","name":stdEndPr.NodeName,"obj":stdEndPr,"attrEx":"","nodeType":"","attrName":"", "desc":"", "class":"TStdEndPr") - ,("field":"SdtContent","name":SdtContent.NodeName,"obj":SdtContent,"attrEx":"","nodeType":"","attrName":"", "desc":"", "class":"TSdtContent") + return array(("field":"sdtPr","name":sdtPr.NodeName,"obj":sdtPr,"attrEx":"","nodeType":"","attrName":"", "desc":"", "class":"TSdtPr") + ,("field":"sdtEndPr","name":sdtEndPr.NodeName,"obj":sdtEndPr,"attrEx":"","nodeType":"","attrName":"", "desc":"", "class":"TSdtEndPr") + ,("field":"sdtContent","name":sdtContent.NodeName,"obj":sdtContent,"attrEx":"","nodeType":"","attrName":"", "desc":"", "class":"TSdtContent") ) union ExtNodes; End; //Attributes //Nodes - stdPr; - stdEndPr; - SdtContent; + sdtPr; + sdtEndPr; + sdtContent; End; /////////////////////////////////////////////////////////////// @@ -10782,6 +10832,20 @@ End; // 'w:rPr', 'w:sectPr', 'w:pPrChange' //w:p +Type TWHyperLink = Class(TWHyperLinkImpl) + Function AddRun(txt, newLine); + Begin + o := new TRun(); + //o.Parent := self; + NewChildNode( array("field":"", "name":"w:r", "obj":o, "attrEx":"", "nodeType":"") ); + if txt then + o.SetText(txt); + if newLine then + o.Br.Type := ''; + return o; + End; +End; + Type TParagraph = Class(DocObject, TParagraphImpl) Function Create();overload; Begin @@ -10916,6 +10980,15 @@ Type TParagraph = Class(DocObject, TParagraphImpl) o.Br.Type := ''; return o; End; + + ///段落添加 + ///返回:TWHyperLink + Function AddHyperLink(); + Begin + o := new TWHyperLink(); + NewChildNode( array("field":"", "name":"w:r", "obj":o, "attrEx":"", "nodeType":"") ); + return o; + End; ///在段落对象后面追加TRun对象 ///返回TRun对象 @@ -12783,7 +12856,7 @@ Type TSectPr = Class Function _Font2LineHeight(rPr, LineRatio); Begin - size := max(rPr.Size, rPr.szCs); + size := max(ifnil(rPr.Size) ? 0 : rPr.Size, ifnil(rPr.szCs) ? 0 : rPr.szCs); if size = 0 then size := 21;//缺省五号字 if rPr.rFont.hint in array('eastAsia', 'zh-CN') or rPr.rFont.eastAsia <> '' then Begin return ceil(size*10/(LinePitch*LineRatio-200/3)); @@ -13773,7 +13846,7 @@ Type TDocumentBody = Class(DocObject) sectPr.Append(p); numId := p.Format.NumPr.Value('numId'); lvlStr := p.Format.NumPr.Value('Level'); - if numId and lvlStr then Begin + if not ifnil(numId) and not ifnil(lvlStr) then Begin ilvl := Class(TSXml).SafeStrToIntDef(lvlStr, -1); if ilvl >= 0 and ilvl < 10 then Begin if not istable(numIds[numId]) then @@ -13799,7 +13872,7 @@ Type TDocumentBody = Class(DocObject) r[ind]['Level'] := strtoint(level); r[ind]['Paragraph'] := p; r[ind]['Text'] := p.Text(); - r[ind]['numId'] := numId; //数字项目编号 + r[ind]['numId'] := integer(numId); //数字项目编号 r[ind]['ilvl'] := ilvl; //级别 r[ind]['numArr'] := numArr; //累加数字编码 sectPr.Mark(ind);//标记段落 @@ -14927,6 +15000,11 @@ Type TDocxStyle = Class(TDocxStyleImpl) class(TSXml).UpdateNode(pPr_.Root(), arr['attributes'], arr['children']); End; End; + + arr := self.Marshal(); + if length(arr['attributes']) or length(arr['children']) then Begin + class(TSXml).UpdateNode(node_, arr['attributes'], arr['children']); + End; End; node_; diff --git a/funcext/TSOffice/TOfficeTemplate.tsf b/funcext/TSOffice/TOfficeTemplate.tsf index 0a34fbe..84b6de3 100644 --- a/funcext/TSOffice/TOfficeTemplate.tsf +++ b/funcext/TSOffice/TOfficeTemplate.tsf @@ -61,5 +61,9 @@ Type TTemplateObj = class map_["wstyle/heading9char.xml"] := array("base64":"PHc6c3R5bGUgdzp0eXBlPSJjaGFyYWN0ZXIiIHc6Y3VzdG9tU3R5bGU9IjEiIHc6c3R5bGVJZD0iSGVhZGluZzlDaGFyIj4NCgk8dzpuYW1lIHc6dmFsPSJIZWFkaW5nIDkgQ2hhciIgLz4NCgk8dzpiYXNlZE9uIHc6dmFsPSJEZWZhdWx0UGFyYWdyYXBoRm9udCIgLz4NCgk8dzpsaW5rIHc6dmFsPSJIZWFkaW5nOSIgLz4NCgk8dzp1aVByaW9yaXR5IHc6dmFsPSI5IiAvPg0KCTx3OnNlbWlIaWRkZW4gLz4NCgk8dzpyc2lkIHc6dmFsPSIwMEZDNjkzRiIgLz4NCgk8dzpyUHI+DQoJCTx3OnJGb250cyB3OmFzY2lpVGhlbWU9Im1ham9ySEFuc2kiIHc6ZWFzdEFzaWFUaGVtZT0ibWFqb3JFYXN0QXNpYSIgdzpoQW5zaVRoZW1lPSJtYWpvckhBbnNpIiB3OmNzdGhlbWU9Im1ham9yQmlkaSIgLz4NCgkJPHc6aSAvPg0KCQk8dzppQ3MgLz4NCgkJPHc6Y29sb3Igdzp2YWw9IjQwNDA0MCIgdzp0aGVtZUNvbG9yPSJ0ZXh0MSIgdzp0aGVtZVRpbnQ9IkJGIiAvPg0KCQk8dzpzeiB3OnZhbD0iMjAiIC8+DQoJCTx3OnN6Q3Mgdzp2YWw9IjIwIiAvPg0KCTwvdzpyUHI+DQo8L3c6c3R5bGU+DQo=","binary":nil); map_["wstyle/title.xml"] := array("base64":"PHc6c3R5bGUgdzp0eXBlPSJwYXJhZ3JhcGgiIHc6c3R5bGVJZD0iVGl0bGUiPg0KCTx3Om5hbWUgdzp2YWw9IlRpdGxlIiAvPg0KCTx3OmJhc2VkT24gdzp2YWw9Ik5vcm1hbCIgLz4NCgk8dzpuZXh0IHc6dmFsPSJOb3JtYWwiIC8+DQoJPHc6bGluayB3OnZhbD0iVGl0bGVDaGFyIiAvPg0KCTx3OnVpUHJpb3JpdHkgdzp2YWw9IjEwIiAvPg0KCTx3OnFGb3JtYXQgLz4NCgk8dzpyc2lkIHc6dmFsPSIwMEZDNjkzRiIgLz4NCgk8dzpwUHI+DQoJCTx3OnBCZHI+DQoJCQk8dzpib3R0b20gdzp2YWw9InNpbmdsZSIgdzpzej0iOCIgdzpzcGFjZT0iNCIgdzpjb2xvcj0iNEY4MUJEIiB3OnRoZW1lQ29sb3I9ImFjY2VudDEiIC8+DQoJCTwvdzpwQmRyPg0KCQk8dzpzcGFjaW5nIHc6YWZ0ZXI9IjMwMCIgdzpsaW5lPSIyNDAiIHc6bGluZVJ1bGU9ImF1dG8iIC8+DQoJCTx3OmNvbnRleHR1YWxTcGFjaW5nIC8+DQoJPC93OnBQcj4NCgk8dzpyUHI+DQoJCTx3OnJGb250cyB3OmFzY2lpVGhlbWU9Im1ham9ySEFuc2kiIHc6ZWFzdEFzaWFUaGVtZT0ibWFqb3JFYXN0QXNpYSIgdzpoQW5zaVRoZW1lPSJtYWpvckhBbnNpIiB3OmNzdGhlbWU9Im1ham9yQmlkaSIgLz4NCgkJPHc6Y29sb3Igdzp2YWw9IjE3MzY1RCIgdzp0aGVtZUNvbG9yPSJ0ZXh0MiIgdzp0aGVtZVNoYWRlPSJCRiIgLz4NCgkJPHc6c3BhY2luZyB3OnZhbD0iNSIgLz4NCgkJPHc6a2VybiB3OnZhbD0iMjgiIC8+DQoJCTx3OnN6IHc6dmFsPSI1MiIgLz4NCgkJPHc6c3pDcyB3OnZhbD0iNTIiIC8+DQoJPC93OnJQcj4NCjwvdzpzdHlsZT4NCg==","binary":nil); map_["wstyle/titlechar.xml"] := array("base64":"PHc6c3R5bGUgdzp0eXBlPSJjaGFyYWN0ZXIiIHc6Y3VzdG9tU3R5bGU9IjEiIHc6c3R5bGVJZD0iVGl0bGVDaGFyIj4NCgk8dzpuYW1lIHc6dmFsPSJUaXRsZSBDaGFyIiAvPg0KCTx3OmJhc2VkT24gdzp2YWw9IkRlZmF1bHRQYXJhZ3JhcGhGb250IiAvPg0KCTx3Omxpbmsgdzp2YWw9IlRpdGxlIiAvPg0KCTx3OnVpUHJpb3JpdHkgdzp2YWw9IjEwIiAvPg0KCTx3OnJzaWQgdzp2YWw9IjAwRkM2OTNGIiAvPg0KCTx3OnJQcj4NCgkJPHc6ckZvbnRzIHc6YXNjaWlUaGVtZT0ibWFqb3JIQW5zaSIgdzplYXN0QXNpYVRoZW1lPSJtYWpvckVhc3RBc2lhIiB3OmhBbnNpVGhlbWU9Im1ham9ySEFuc2kiIHc6Y3N0aGVtZT0ibWFqb3JCaWRpIiAvPg0KCQk8dzpjb2xvciB3OnZhbD0iMTczNjVEIiB3OnRoZW1lQ29sb3I9InRleHQyIiB3OnRoZW1lU2hhZGU9IkJGIiAvPg0KCQk8dzpzcGFjaW5nIHc6dmFsPSI1IiAvPg0KCQk8dzprZXJuIHc6dmFsPSIyOCIgLz4NCgkJPHc6c3ogdzp2YWw9IjUyIiAvPg0KCQk8dzpzekNzIHc6dmFsPSI1MiIgLz4NCgk8L3c6clByPg0KPC93OnN0eWxlPg0K","binary":nil); + map_["wstyle/toc.xml"] := array("base64":"PHc6c3R5bGUgdzp0eXBlPSJwYXJhZ3JhcGgiIHc6c3R5bGVJZD0iVE9DIj4NCiAgICA8dzpuYW1lIHc6dmFsPSJUT0MgSGVhZGluZyIgLz4NCiAgICA8dzpiYXNlZE9uIHc6dmFsPSIxIiAvPg0KICAgIDx3Om5leHQgdzp2YWw9ImEiIC8+DQogICAgPHc6dWlQcmlvcml0eSB3OnZhbD0iMzkiIC8+DQogICAgPHc6dW5oaWRlV2hlblVzZWQgLz4NCiAgICA8dzpxRm9ybWF0IC8+DQogICAgPHc6cnNpZCB3OnZhbD0iMDA4OTZGN0QiIC8+DQogICAgPHc6cFByPg0KICAgICAgICA8dzpzcGFjaW5nIHc6YmVmb3JlPSIyNDAiIHc6bGluZT0iMjU5IiB3OmxpbmVSdWxlPSJhdXRvIiAvPg0KICAgICAgICA8dzpvdXRsaW5lTHZsIHc6dmFsPSI5IiAvPg0KICAgIDwvdzpwUHI+DQogICAgPHc6clByPg0KICAgICAgICA8dzpiIHc6dmFsPSIwIiAvPg0KICAgICAgICA8dzpiQ3Mgdzp2YWw9IjAiIC8+DQogICAgICAgIDx3OnN6IHc6dmFsPSIzMiIgLz4NCiAgICAgICAgPHc6c3pDcyB3OnZhbD0iMzIiIC8+DQogICAgPC93OnJQcj4NCjwvdzpzdHlsZT4=","binary":nil); + map_["wstyle/toc1.xml"] := array("base64":"PHc6c3R5bGUgdzp0eXBlPSJwYXJhZ3JhcGgiIHc6c3R5bGVJZD0iVE9DMSI+DQoJPHc6bmFtZSB3OnZhbD0idG9jIDEiIC8+DQoJPHc6YmFzZWRPbiB3OnZhbD0iYSIgLz4NCgk8dzpuZXh0IHc6dmFsPSJhIiAvPg0KCTx3OmF1dG9SZWRlZmluZSAvPg0KCTx3OnVpUHJpb3JpdHkgdzp2YWw9IjM5IiAvPg0KCTx3OnVuaGlkZVdoZW5Vc2VkIC8+DQoJPHc6cnNpZCB3OnZhbD0iMDA4RDQ3NkQiIC8+DQogICAgPHc6cFByIC8+DQogICAgPHc6clByIC8+DQo8L3c6c3R5bGU+DQo=","binary":nil); + map_["wstyle/toc2.xml"] := array("base64":"PHc6c3R5bGUgdzp0eXBlPSJwYXJhZ3JhcGgiIHc6c3R5bGVJZD0iVE9DMiI+DQoJPHc6bmFtZSB3OnZhbD0idG9jIDIiIC8+DQoJPHc6YmFzZWRPbiB3OnZhbD0iYSIgLz4NCgk8dzpuZXh0IHc6dmFsPSJhIiAvPg0KCTx3OmF1dG9SZWRlZmluZSAvPg0KCTx3OnVpUHJpb3JpdHkgdzp2YWw9IjM5IiAvPg0KCTx3OnVuaGlkZVdoZW5Vc2VkIC8+DQoJPHc6cnNpZCB3OnZhbD0iMDA4RDQ3NkQiIC8+DQoJPHc6cFByPg0KCQk8dzppbmQgdzpsZWZ0Q2hhcnM9IjIwMCIgdzpsZWZ0PSI0MjAiIC8+DQoJPC93OnBQcj4NCiAgICA8dzpyUHIgLz4NCjwvdzpzdHlsZT4NCg==","binary":nil); + map_["wstyle/toc3.xml"] := array("base64":"PHc6c3R5bGUgdzp0eXBlPSJwYXJhZ3JhcGgiIHc6c3R5bGVJZD0iVE9DMyI+DQoJPHc6bmFtZSB3OnZhbD0idG9jIDMiIC8+DQoJPHc6YmFzZWRPbiB3OnZhbD0iYSIgLz4NCgk8dzpuZXh0IHc6dmFsPSJhIiAvPg0KCTx3OmF1dG9SZWRlZmluZSAvPg0KCTx3OnVpUHJpb3JpdHkgdzp2YWw9IjM5IiAvPg0KCTx3OnVuaGlkZVdoZW5Vc2VkIC8+DQoJPHc6cnNpZCB3OnZhbD0iMDA4RDQ3NkQiIC8+DQoJPHc6cFByPg0KCQk8dzppbmQgdzpsZWZ0Q2hhcnM9IjQwMCIgdzpsZWZ0PSI4NDAiIC8+DQoJPC93OnBQcj4NCiAgICA8dzpyUHIgLz4NCjwvdzpzdHlsZT4NCg==","binary":nil); End; End; diff --git a/funcext/TSOffice/TSDocxFile.tsf b/funcext/TSOffice/TSDocxFile.tsf index 55f3ec6..7be7774 100644 --- a/funcext/TSOffice/TSDocxFile.tsf +++ b/funcext/TSOffice/TSDocxFile.tsf @@ -1,4 +1,4 @@ -// Version 1.3.9 +// Version 1.4.0 Type TSDocxFile = Class ///Version: V1.0 2022-09-20 @@ -482,7 +482,7 @@ Type TSDocxFile = Class content.node_ := document_.Body().node_.InsertAfterChild(node, content.Marshal()); else content.node_ := document_.Body().node_.InsertFirstChild(content.Marshal()); - AddPageBreak(content.node_); + //AddPageBreak(content.node_); return content; End; diff --git a/funcext/TSOffice/TSExcelFile.tsf b/funcext/TSOffice/TSExcelFile.tsf index 2f3f39b..91496d5 100644 --- a/funcext/TSOffice/TSExcelFile.tsf +++ b/funcext/TSOffice/TSExcelFile.tsf @@ -1,4 +1,4 @@ -// Version 1.3.9 +// Version 1.4.0 Type TSExcelFile = Class ///Version: V1.0 2022-08-08 diff --git a/funcext/TSOffice/TSUtils/TSXml.tsf b/funcext/TSOffice/TSUtils/TSXml.tsf index 8218d22..326849a 100644 --- a/funcext/TSOffice/TSUtils/TSXml.tsf +++ b/funcext/TSOffice/TSUtils/TSXml.tsf @@ -408,6 +408,7 @@ Type TSXml = Class class Function SafeStrToIntDef(s, defaultV); Begin + if ifnumber(s) then return integer(s); if not ifstring(s) then return defaultV; return StrToIntDef(s, defaultV); diff --git a/funcext/TSOffice/document/TTableContent.tsf b/funcext/TSOffice/document/TTableContent.tsf index 7dac361..4fbe47f 100644 --- a/funcext/TSOffice/document/TTableContent.tsf +++ b/funcext/TSOffice/document/TTableContent.tsf @@ -18,32 +18,36 @@ Type TTableContent = class Function SetDefaultFormat(); Begin - defultFont := impl_.stdPr.rPr; + defultFont := impl_.sdtPr.rPr; defultFont.rFont.cstheme := 'minorBidi'; defultFont.rFont.XMLeastAsia := '宋体'; defultFont.rFont.XMLhAnsi := '宋体'; defultFont.rFont.XMLascii := '宋体'; //defultFont.kern := 2; - defultFont.Size := 21; + defultFont.Size := 21/2; defultFont.SzCs := 24; defultFont.Lang := 'en-US'; defultFont.bidi := 'ar-SA'; defultFont.eastAsia := 'zh-CN'; defultFont.Color := 'DBDBDB'; - defultFormat := impl_.stdPr; + defultFormat := impl_.sdtPr; defultFormat.ID := integer(time()*24*3600); //defultFormat.Color := 'DBDBDB'; defultFormat.docPartObj.docPartGallery := 'Table of Contents'; defultFormat.docPartObj.docPartUnique := 1; - //impl_.stdEndPr.rPr.Size := 20; - //impl_.stdEndPr.rPr.SzCs := 20; - impl_.stdEndPr.rPr.Bold := true; + //impl_.sdtEndPr.rPr.Size := 21; + //impl_.sdtEndPr.rPr.SzCs := 22; + impl_.sdtEndPr.rPr.Bold := true; End; ///应用目录样式 Function Apply(); override; Begin - arr := impl_.Marshal(); + // sdtContent 不应该updateNode + tmp_impl := TOfficeObj('TTableContentImpl'); + tmp_impl.sdtPr := impl_.sdtPr; + tmp_impl.sdtEndPr := impl_.sdtEndPr; + arr := tmp_impl.Marshal(); class(TSXml).UpdateNode(node_, arr['attributes'], arr['children']); End; @@ -68,10 +72,12 @@ Type TTableContent = class mParagraph.pPr.RightIndent := 0; mParagraph.pPr.LeftChars := 0; mParagraph.pPr.LeftIndent := 0; + mParagraph.pPr.StyleID := _GetStyle('TOC'); mParagraph.Run.T := '目录'; - mParagraph.Run.rPr.SetName('宋体', true); - mParagraph.Run.rPr.Size := 21; - mParagraph.Run.rPr.Bold := true; + mParagraph.Run.rPr.Lang := 'zh-CN'; + //mParagraph.Run.rPr.SetName('宋体', true); + //mParagraph.Run.rPr.Size := 21/2; + //mParagraph.Run.rPr.Bold := true; _AddStdContent(mParagraph); goback := TOfficeObj('TParagraph'); @@ -79,13 +85,13 @@ Type TTableContent = class goback.MarkStart.Name := '_GoBack'; goback.MarkStart.ID := id; goback.MarkEnd.ID := id; - _AddStdContent(goback); + //_AddStdContent(goback); //缺省目录,需要word或wps打开后,更新目录 - _AddDefaultTableContent(UpperHeadingLevel, LowerHeadingLevel); + //_AddDefaultTableContent(UpperHeadingLevel, LowerHeadingLevel); //自定义页码计算与word、wps有差异,不推荐使用 - //_AddTableContent(posOpt, UpperHeadingLevel, LowerHeadingLevel); + _AddTableContent(posOpt, UpperHeadingLevel, LowerHeadingLevel); End; Function _AddDefaultTableContent(UpperHeadingLevel, LowerHeadingLevel); @@ -123,7 +129,7 @@ Type TTableContent = class //instrText r2 := p.AddRun(); r2.instrTextSpace := 'preserve'; - r2.instrText := 'TOC \\o \"' $ UpperHeadingLevel $ '-' $ LowerHeadingLevel $ '\" \\h \\u '; + r2.instrText := 'TOC \\o \"' $ UpperHeadingLevel $ '-' $ LowerHeadingLevel $ '\" \\h \\z \\u '; //fldCharType r3 := p.AddRun(); @@ -140,75 +146,73 @@ Type TTableContent = class for i:=0 to length(r)-1 do Begin p := _AddItem(UpperHeadingLevel, LowerHeadingLevel, r[i]['Level'], i = 0 ? true: false); //fldCharType - r4 := p.AddRun(); - r4.fldCharType := 'begin'; - - //instrText + h := p.AddHyperLink(); bookmarke := _GetBookMarkId(r[i]['Paragraph']); - r5 := p.AddRun(); - r5.instrTextSpace := 'preserve'; - r5.instrText := ' HYPERLINK \\l ' $ bookmarke $ ' '; - - //fldCharType - r6 := p.AddRun(); - r6.fldCharType := 'separate'; - - //目录条目文字内容 - r7 := p.AddRun(); - r7.Font.SetName('宋体', true); + h.Anchor := bookmarke; + h.history := 1; + + r1 := h.AddRun(); + r1.rPr.StyleId := _GetStyle(level); + r1.rPr.noProof := true; numStr := ''; //数字项目编号 if r[i]['numId'] then Begin style := docx_.NumberingObject().NumberStyle(r[i]['numId']);//支持数字、字符串StyleId if ifObj(style) then numStr := style.GetText(r[i]['ilvl'], r[i]['numArr']); End - r7.T := numStr + r[i]['Text']; - - //Tab - r8 := p.AddRun(); - r8.Tab := true; - - //fldCharType - r9 := p.AddRun(); - r9.fldCharType := 'begin'; - + if numStr <> '' then r1.T := numStr + ' ' + r[i]['Text']; + else r1.T := r[i]['Text']; + + r2 := h.AddRun(); + r2.rPr.noProof := true; + r2.rPr.WebHidden := true; + r2.Tab := true; + + r3 := h.AddRun(); + r3.rPr.noProof := true; + r3.rPr.WebHidden := true; + r3.fldCharType := 'begin'; + //instrText - r10 := p.AddRun(); - r10.instrTextSpace := 'preserve'; - r10.instrText := ' PAGEREF ' $ bookmarke $ ' \\h '; - + r4 := h.AddRun(); + r4.rPr.noProof := true; + r4.rPr.WebHidden := true; + r4.instrTextSpace := 'preserve'; + r4.instrText := ' PAGEREF ' $ bookmarke $ ' \\h '; + + r5 := h.AddRun(); + r5.rPr.noProof := true; + r5.rPr.WebHidden := true; + r5.Tab := true; + //fldCharType - r11 := p.AddRun(); - r11.fldCharType := 'separate'; - + r6 := h.AddRun(); + r6.rPr.noProof := true; + r6.rPr.WebHidden := true; + r6.fldCharType := 'separate'; + //页码 - r12 := p.AddRun(); - r12.T := '' $ r[i]['pageNo']; - + r7 := h.AddRun(); + r7.T := 0;//'' $ r[i]['pageNo']; + //fldCharType - r13 := p.AddRun(); - r13.fldCharType := 'end'; - - //fldCharType - r14 := p.AddRun(); - r14.fldCharType := 'end'; - - if r[i]['Level']+1 = UpperHeadingLevel then Begin //第一级标题,设置为粗体 - p.Format.rPr.Bold := true; - r4.rPr.Bold := true; - r5.rPr.Bold := true; - r6.rPr.Bold := true; - r7.rPr.Bold := true; - r8.rPr.Bold := true; - //r9.rPr.Bold := true; - r10.rPr.Bold := true; - //r11.rPr.Bold := true; - r12.Font.Bold := true; - //r13.rPr.Bold := true; - r14.rPr.Bold := true; - End; + r8 := h.AddRun(); + r8.rPr.noProof := true; + r8.rPr.WebHidden := true; + r8.fldCharType := 'end'; + _AddStdContent(p); + End; + + p2 := TOfficeObj('TParagraph'); + //p2.Format.SpaceAfter := 0; + run := p2.AddRun(); + run.rPr.Bold := true; + run.rPr.noProof := true; + run.fldCharType := 'end'; + _AddStdContent(p2); + End; ///更新目录 @@ -224,21 +228,21 @@ Type TTableContent = class Property Format read readFormat; Function readFormat(); Begin - return impl_.stdPr; + return impl_.sdtPr; End; Property EndFormat read readEndFormat; Function readEndFormat(); Begin - return impl_.stdEndPr; + return impl_.sdtEndPr; End; Property Font read readFont; Function readFont(); Begin - return impl_.stdPr.rPr; + return impl_.sdtPr.rPr; End; - + Function _AddStdContent(o); Begin impl_.SdtContent.NewChildNode( array("field":"", "name":"w:p", "obj":o, "attrEx":"", "nodeType":"") ); @@ -246,18 +250,10 @@ Type TTableContent = class Function _GetStyle(level); Begin - styleName := 'Tinysoft目录 ' $ (level + 1); - style := docx_.StyleObject().GetStyle(styleName); + styleName := ifstring(level) ? level : 'TOC' $ (level + 1); + style := docx_.StyleObject().GetStyleById(styleName); if not ifObj(style) then Begin - style := TOfficeObj('TDocxStyle'); - style.wType := 'paragraph'; - style.CustomStyle := 1; - style.Name := styleName; - style.uiPriority := 0; - style.pPr.LeftChars := 200 * level; - style.rPr.Size := 20; - style.rPr.SzCs := 20; - docx_.StyleObject().AddStyle(style, 'TsToc' $ (level + 1)); + style := docx_.StyleObject().AddDefaultStyle(styleName); End; return style.StyleId; End; @@ -301,4 +297,4 @@ Type TTableContent = class docx_; node_; impl_; -End; \ No newline at end of file +End;