///Version:V1.03 ///Create by Tinysoft. ///自动生成 TSDocxFile 帮助文件 mtic; //SetProfiler(7); docx := new TSDocxFile(); [err, errmsg] := docx.NewFile(); if err then return println( 'Create NewFile Fail:{}.', errmsg); //多级项目编号 sysparams['numId'] := docx.NumberingObject().NumberId('multilevel', 'decimal'); ///Test 0: 文档标题 paragraphTitle := _0_AddTitle(docx); ///Test 1: 文档说明 _1_HelpInfo(docx); ///Test 2: 文档API _2_DocumentApi(docx); ///Test 3: TParagraph对象 _3_Paragraph(docx); ///Test 4: TTable对象 _4_Table(docx); ///Test 5: TPicture对象 _5_Picture(docx); ///Test 6: TComments对象 _6_Comments(docx); ///Test 7: TRevision对象 _7_Revision(docx); ///文档属性 _8_CoreProperties(docx); ///章节、页脚、页眉 _9_TDocSection(docx); ///文本框 _10_TTextBox(docx); ///TRange _11_TRange(docx); ///TDocxStyles _12_TDocxStyles(docx); ///TNumbering _13_TNumbering(docx); ///TDocxChart _14_TDocxChart(docx); ///TOfficeApi _15_TOfficeApi(docx); ///ExecInnerTSL _16_Template(docx); ///附注 _Annotation(docx); ///Faq _Faq(docx); ///目录 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); //info := GetProfilerInfo(true); //exportfile(ftstream(),'','\\temp\\ProfilerInfo.stm',info); /////////////////////////////////////////////////////////////////////////////////////////////// ///子函数 ///Test 1: 文档标题 Function _0_AddTitle(docx); Begin _PrintMsg('AddTitle'); p := _AddTitle(docx, '天软DOCX文档操作接口帮助文档', 0);//添加文档标题 p.Font.Size := 24; p.Apply(); for i:=0 to 16 do docx.AddLineBreak(-1);//换行符 r := array(('文档编号','TS-XXXXXX-XXX'),('文档版本','Version 1.0'),('修订日期',datetimetostr(Now())),('保密级别','')); tbl := docx.CreateTable(r); tbl.Format.Indent := 500; tbl.format.IndentType := 'dxa'; //设置列宽 tbl.ColumnWidth(1, 2000); tbl.ColumnWidth(2, 6000); tbl := docx.InsertTable(tbl, -1); for i:=1 to 4 do Begin //第1列底纹设置 cell := tbl.Cell(i, 1); cell.Format.Shading.Val := 'clear'; cell.Format.Shading.Color := 'auto'; cell.Format.Shading.Fill := 'D9D9D9'; cell.Apply(); //第2列,据中对齐 c2 := tbl.Cell(i, 2); c2.Format.vAlign := 'center'; c2.pFormat.Alignment := 'center'; c2.Apply(); End; tbl.Apply(); p := docx.AddPageBreak(-1);//换页符 println(' >>OK\n'); return p; End; ///Test 1: 前言 Function _1_HelpInfo(docx); Begin paragraph := sysparams['Test']; _PrintMsg('前言'); _AddTitle(docx, '前言', 1); //第一段标题 //添加段落 preface := TOfficeObj('TParagraph'); preface.Run.SetText( '本文档由word_help.tsl脚本,调用本文档中描述的接口自动生成!' ); preface.Format.FirstLineIndent := 220; //指定段落第一行缩进的相对差异的值 preface.Format.LeftIndent := 440;//段落左边距 preface.Font.Name := '宋体'; preface.Font.Color := 'FF0000'; preface.Font.Bold := true; preface.Font.Size := 16; p1 := docx.AddParagraph(preface, -1, nil); println(' >>OK\n'); End; ///Test 2: 文档API Function _2_DocumentApi(docx); Begin paragraph := sysparams['Test']; _PrintMsg('Document Api'); _AddTitle(docx, '文档接口(TSDocFile)', 1); //第二段标题 _AddTitle(docx, 'TSDocFile方法', 2); conf := _LoadClassInfo(docx.GetPath() + '\\funcext\\TSOffice\\TSDocxFile.tsf', 'TSDocxFile'); _AddFunctionHelpInfo(docx, paragraph $ '.1.', conf, 3); println(' >>OK\n'); End; ///Test 3: TParagraph对象 Function _3_Paragraph(docx); Begin paragraph := sysparams['Test']; _PrintMsg('TParagraph对象'); _AddTitle(docx, 'TParagraph对象(段落)', 1); //第三段标题 ///TParagraph属性 _AddTitle(docx, 'TParagraph属性(段落属性TwpPr对象、字体属性TwrPr对象)', 2); //第二级标题 attrs := array(('类别':'缺省w:r元素', '接口':'Run', '说明':'TRun对象'), ('类别':'段落属性', '接口':'Format', '说明':'TwpPr对象'), ('类别':'字体属性', '接口':'Font', '说明':'TwrPr对象')); _AddClassHelpTable(docx, attrs);//添加表格:TParagraph属性 ///TParagraph方法 _AddTitle(docx, 'TParagraph方法', 2); conf := _LoadClassInfo(docx.GetPath() + '\\funcext\\TSOffice\\TOfficeObj.tsf', 'TParagraph'); conf union= _LoadClassInfo(docx.GetPath() + '\\funcext\\TSOffice\\TOfficeObj.tsf', 'DocObject'); _AddFunctionHelpInfo(docx, '' $ paragraph $ '.2.', conf, 3); ///TRun方法 _AddTitle(docx, 'TRun方法(段落中w:r元素)', 2); conf := _LoadClassInfo(docx.GetPath() + '\\funcext\\TSOffice\\TOfficeObj.tsf', 'TRun'); conf union= _LoadClassInfo(docx.GetPath() + '\\funcext\\TSOffice\\TOfficeObj.tsf', 'DocObject'); _AddFunctionHelpInfo(docx, '' $ paragraph $ '.3.', conf, 3); ///TTabStops对象 _AddTitle(docx, 'TTabStops对象', 2); conf := _LoadClassInfo(docx.GetPath() + '\\funcext\\TSOffice\\TOfficeObj.tsf', 'TTabStops'); _AddFunctionHelpInfo(docx, '' $ paragraph $ '.4.', conf, 3); ///TabStop属性 _AddTitle(docx, 'TTabStop属性', 2); //第二级标题 attrs := array(); formatObj := new TOfficeObj('TTabStop'); _LoadObjectAttributes(formatObj, attrs, 'TTabStop属性', ''); _AddClassHelpTable(docx, attrs); println(' >>OK\n'); End; ///Test 4: TTable对象 Function _4_Table(docx); Begin paragraph := sysparams['Test']; _PrintMsg('TTable对象'); _AddTitle(docx, 'TTable对象(表格)', 1); //第四段标题 ///TTable对象 _AddTitle(docx, 'TTable对象属性', 2); //第二级标题 tbl := new TOfficeObj('TTable'); attrs := array(('类别':'单元格属性', '接口':'Paragraph', '说明':'TParagrap对象:设置单元格段落格式、字体格式')); _LoadObjectAttributes(tbl.Format, attrs, '表格样式', 'Format'); _LoadObjectAttributes(tbl.FormatEx, attrs, '浮动表设置', 'FormatEx'); _AddClassHelpTable(docx, attrs);//添加表格:TTable属性 ///TTable方法 _AddTitle(docx, 'TTable方法', 2); conf := _LoadClassInfo(docx.GetPath() + '\\funcext\\TSOffice\\TOfficeObj.tsf', 'TTable'); _AddFunctionHelpInfo(docx, '' $ paragraph $ '.2.', conf, 3); ///TCell对象 _AddTitle(docx, 'TCell对象属性', 2); attrs := array(); formatObj := new TOfficeObj('TwTcPr'); _LoadObjectAttributes(formatObj, attrs, '单元格属性', 'Format'); _AddClassHelpTable(docx, attrs);//添加表格:TCell属性 ///TCell方法 _AddTitle(docx, 'TCell方法', 2); conf := _LoadClassInfo(docx.GetPath() + '\\funcext\\TSOffice\\TOfficeObj.tsf', 'TCell'); conf union= _LoadClassInfo(docx.GetPath() + '\\funcext\\TSOffice\\TOfficeObj.tsf', 'TDocumentBody'); conf union= _LoadClassInfo(docx.GetPath() + '\\funcext\\TSOffice\\TOfficeObj.tsf', 'DocObject'); _AddFunctionHelpInfo(docx, '' $ paragraph $ '.4.', conf, 3); println(' >>OK\n'); End; ///Test 5: TPicture对象 Function _5_Picture(docx); Begin paragraph := sysparams['Test']; _PrintMsg('TPicture对象'); _AddTitle(docx, 'TPicture对象(图像)', 1); //第五段标题 ///TPicture对象属性 _AddTitle(docx, 'TPicture对象属性', 2); attrs := array(('类别':'图片信息', '接口':'Image', '说明':'二进制内容'), ('类别':'图片信息', '接口':'Descr', '说明':'图像描述'), ('类别':'图片信息', '接口':'Width', '说明':'图像宽度(cm)'), ('类别':'图片信息', '接口':'Height', '说明':'图像高度(cm)') ); //pPr := new TOfficeObj('TpicsPpr'); //_LoadObjectAttributes(pPr, attrs, '图像属性', 'Format'); _AddClassHelpTable(docx, attrs);//添加表格:TPicture对象 ///TPicture方法 _AddTitle(docx, 'TPicture方法', 2); conf := _LoadClassInfo(docx.GetPath() + '\\funcext\\TSOffice\\TOfficeObj.tsf', 'TPicture'); _AddFunctionHelpInfo(docx, '' $ paragraph $ '.2.', conf, 3); ///插入图像案例 _AddTitle(docx, '插入图像案例', 2); picture := TOfficeObj('TPicture'); picture.Descr := '插入图像案例'; picture.Image := TOfficeTemplate('tinysoft.gif',true); if ifnil(picture.Image) then return; p := docx.AddPicture(picture, -1); //添加图像外边框 p.Format.Ln.SolidFill.SchemeClr.Val := 'accent1'; p.Apply(); println(' >>OK\n'); End; ///Test 6: TDocComments对象 Function _6_Comments(docx); Begin paragraph := sysparams['Test']; _PrintMsg('TDocComments对象'); _AddTitle(docx, 'TDocComments对象(批注集合)', 1); //第六段标题 ///TDocComments方法 _AddTitle(docx, 'TDocComments方法', 2); conf := _LoadClassInfo(docx.GetPath() + '\\funcext\\TSOffice\\TOfficeObj.tsf', 'TDocComments'); _AddFunctionHelpInfo(docx, '' $ paragraph $ '.1.', conf, 3); ///TDocComment对象属性 _AddTitle(docx, 'TDocComment对象属性', 2); attrs := array( ('类别':'属性', '接口':'sPos', '说明':'被标注文字在文档中的位置'), ('类别':'属性', '接口':'SelectLength', '说明':'选择文字的长度,汉字当一个字符,不计算换行符号') ); pPr := new TOfficeObj('TDocComment'); _LoadObjectAttributes(pPr, attrs, '属性', 'Format'); _AddClassHelpTable(docx, attrs);//添加表格:TDocComment对象 ///TDocComment方法 _AddTitle(docx, 'TDocComment方法', 2); conf := _LoadClassInfo(docx.GetPath() + '\\funcext\\TSOffice\\TOfficeObj.tsf', 'TDocComment'); _AddFunctionHelpInfo(docx, '' $ paragraph $ '.2.', conf, 3); //插入批注案例 _AddTitle(docx, '插入批注案例', 2); //添加测试段落文字 p1 := TOfficeObj('TParagraph'); p1.Format.FirstLineIndent := 220; //指定段落第一行缩进的相对差异的值 p1.Format.LeftIndent := 440;//段落左边距 p1.Run.SetText('本文档由天软科技制作。'); p1.Run.rPr.Name := '宋体'; p1.Run.rPr.Bold := true; p1.Run.rPr.Size := 16; p1.Run.rPr.Color := 'FF0000'; p2 := docx.AddParagraph(p1, -1, nil); //插入批注 comment := docx.NewComment('Tinysoft', '深圳市天软科技开发有限公司'); comment.sPos := 4; comment.SelectLength := 4; p2.AddComment(comment); //嵌套批注 comment := docx.NewComment('Tinysoft', '嵌套批注:Tinysoft'); comment.sPos := 4; comment.SelectLength := 2; p2.AddComment(comment); //2层嵌套批注 comment := docx.NewComment('Tinysoft', '2层嵌套批注Tiny'); comment.sPos := 4; comment.SelectLength := 1; p2.AddComment(comment); //2层嵌套批注 comment := docx.NewComment('Tinysoft', '2层嵌套批注Software'); comment.sPos := 5; comment.SelectLength := 1; p2.AddComment(comment); //读取批注案例 _AddTitle(docx, '读取批注案例', 2); r := array(); commentObjs := docx.Comments(); for i:=0 to commentObjs.Count()-1 do Begin comment := commentObjs.Comment(i); r[i]['批注ID'] := comment.CommentID; r[i]['批注文字范围'] := comment.Text(); End; tbl := docx.CreateTable(r, true, true); tbl.Format.Indent := 500; tbl.format.IndentType := 'dxa'; tbl := docx.InsertTable(tbl, -1); //删除批注案例 _AddTitle(docx, '删除批注案例(执行docx.Comments().Comment(3).Delete();)', 2); //删除批注 docx.Comments().Comment(3).Delete(); r := array(); commentObjs := docx.Comments(); for i:=0 to commentObjs.Count()-1 do Begin comment := commentObjs.Comment(i); r[i]['批注ID'] := comment.CommentID; r[i]['批注文字范围'] := comment.Text(); End; tbl := docx.CreateTable(r, true, true); tbl.Format.Indent := 500; tbl.format.IndentType := 'dxa'; tbl := docx.InsertTable(tbl, -1); println(' >>OK\n'); End; ///Test 7: TRevision对象 Function _7_Revision(docx); Begin paragraph := sysparams['Test']; _PrintMsg('TRevision对象'); _AddTitle(docx, 'TRevision对象(修订)', 1); //第七段标题 ///TRevision对象 _AddTitle(docx, 'TRevision属性', 2); attrs := array( ('类别':'属性', '接口':'sPos', '说明':'被标注文字在文档中的位置'), ('类别':'属性', '接口':'SelectLength', '说明':'选择文字的长度,汉字当一个字符,不计算换行符号') ); formatObj := new TOfficeObj('TRevision'); _LoadObjectAttributes(formatObj, attrs, '属性', ''); _AddClassHelpTable(docx, attrs);//添加表格:TRevision属性 ///TRevision方法 _AddTitle(docx, 'TRevision方法', 2); conf := _LoadClassInfo(docx.GetPath() + '\\funcext\\TSOffice\\TOfficeObj.tsf', 'TRevision'); _AddFunctionHelpInfo(docx, '' $ paragraph $ '.2.', conf, 3); //插入修订案例 _AddTitle(docx, '插入修订案例', 2); //添加测试段落文字 p1 := TOfficeObj('TParagraph'); p1.Format.FirstLineIndent := 220; //指定段落第一行缩进的相对差异的值 p1.Format.LeftIndent := 440;//段落左边距 p1.Run.SetText( '插入案例。' ); p1.Run.rPr.Name := '宋体'; p1.Run.rPr.Bold := true; p1.Run.rPr.Size := 16; p1.Run.rPr.Color := 'FF0000'; pAddRevision := docx.AddParagraph(p1, -1, nil); //插入修订 revision := TOfficeObj('TRevision'); revision.Author := '修订者'; revision.sPos := 2; revision.InsText := '修订'; pAddRevision.AddRevision(revision); //删除修订案例 _AddTitle(docx, '删除修订案例', 2); //添加测试段落文字 p1 := TOfficeObj('TParagraph'); p1.Format.FirstLineIndent := 220; //指定段落第一行缩进的相对差异的值 p1.Format.LeftIndent := 440;//段落左边距 p1.Run.SetText( '删除修订案例。' ); p1.Run.rPr.Name := '宋体'; p1.Run.rPr.Bold := true; p1.Run.rPr.Size := 16; p1.Run.rPr.Color := 'FF0000'; pDelRevision := docx.AddParagraph(p1, -1, nil); //删除修订 revision := TOfficeObj('TRevision'); revision.Author := '修订者'; revision.sPos := 4; revision.SelectLength := 2; pDelRevision.DelRevision(revision); //读取修订案例 _AddTitle(docx, '读取修订案例', 2); revisions := pAddRevision.Revisions(); revisions union= pDelRevision.Revisions(); r := array(); for i:=0 to length(revisions)-1 do Begin r[i]['Act'] := revisions[i].Act(); r[i]['Text'] := revisions[i].Text(); //if i=1 then // revisions[i].Accept(); //接受修订 // revisions[i].Reject(); //拒绝修订 End; tbl := docx.CreateTable(r, true, true); tbl.Format.Indent := 500; tbl.format.IndentType := 'dxa'; tbl := docx.InsertTable(tbl, -1); println(' >>OK\n'); End; ///文档属性 Function _8_CoreProperties(docx); Begin paragraph := sysparams['Test']; _PrintMsg('TCoreProperties对象'); _AddTitle(docx, 'TCoreProperties对象(文档属性)', 1); //第八段标题 ///TCoreProperties对象 _AddTitle(docx, 'TCoreProperties对象', 2); attrs := array( ('类别':'属性', '接口':'Author', '说明':'读写属性:作者'), ('类别':'属性', '接口':'Category', '说明':'读写属性:此包内容的分类。示例值可能包括:简历、信函、财务预测、提案或技术演示。'), ('类别':'属性', '接口':'Description', '说明':'读写属性:文档描述'), ('类别':'属性', '接口':'Subject', '说明':'读写属性:文档主题'), ('类别':'属性', '接口':'Title', '说明':'读写属性:文档名称'), ('类别':'属性', '接口':'Version', '说明':'读写属性:自由格式版本字符串'), ('类别':'属性', '接口':'Rversion', '说明':'读写属性:此修订的编号,每次保存文档时按Word递增。'), ('类别':'属性', '接口':'KeyWords', '说明':'读写属性:可能用作本文档搜索词的描述性词或短短语'), ('类别':'属性', '接口':'Created', '说明':'读写属性:创建日期'), ('类别':'属性', '接口':'Modified', '说明':'读写属性:上次修改文档的时间'), ('类别':'属性', '接口':'LastModifiedBy', '说明':'读写属性:上次修改文档的人的姓名或其他标识符(如电子邮件地址)'), ); _AddClassHelpTable(docx, attrs);//添加表格:TCoreProperties属性 println(' >>OK\n'); End; ///章节、页脚、页眉 Function _9_TDocSection(docx); Begin paragraph := sysparams['Test']; _PrintMsg('TDocSection对象'); _AddTitle(docx, 'TDocSection对象(章节)', 1); //第九段标题 ///TDocSection对象 _AddTitle(docx, 'TDocSection对象(章节)', 2); formatObj := new TOfficeObj('TDocSection'); _LoadObjectAttributes(formatObj, attrs, '属性', ''); _AddClassHelpTable(docx, attrs);//添加表格:TDocSection属性 ///TDocSection方法 _AddTitle(docx, 'TDocSection方法', 2); conf := _LoadClassInfo(docx.GetPath() + '\\funcext\\TSOffice\\TOfficeObj.tsf', 'TDocSection'); _AddFunctionHelpInfo(docx, '' $ paragraph $ '.2.', conf, 3); ///THeaderFooter方法 _AddTitle(docx, 'THeaderFooter方法', 2); conf := _LoadClassInfo(docx.GetPath() + '\\funcext\\TSOffice\\TOfficeObj.tsf', 'TDocHeaderFooter'); conf union= _LoadClassInfo(docx.GetPath() + '\\funcext\\TSOffice\\TOfficeObj.tsf', 'TDocumentBody'); _AddFunctionHelpInfo(docx, '' $ paragraph $ '.3.', conf, 3); ///添加页眉、页脚案例 _AddTitle(docx, '添加页眉、页脚案例', 2); help := TOfficeObj('TParagraph'); help.Run.SetText( '参考word_help.tsl脚本(TDocxFile::Sections, TDocSection::AddHeader, TDocSection::AddFooter)!' ); help.Format.FirstLineIndent := 220; //指定段落第一行缩进的相对差异的值 help.Format.LeftIndent := 440;//段落左边距 help.Font.Name := '宋体'; help.Font.Color := 'FF0000'; help.Font.Bold := true; help.Font.Size := 15; p1 := docx.AddParagraph(help, -1, nil); section := docx.Sections(-1);//获取缺省章节 footer := section.AddFooter('');//添加缺省页脚 //页脚内容 p := TOfficeObj('TParagraph'); p.Run.SetText( '电 话:0755-83937039' ); p.AddRun('网 址:http://www.tinysoft.com.cn', true); p.AddRun('公司地址:深圳市福田区莲花街道梅岭社区新闻路59号深茂商业中心19F', true); p.Format.Bdr.Top.val := 'single';//页脚横线 p.Format.SpaceAfter := 0; p.Font.Name := '宋体'; p.Font.Color := 'FF0000'; p.Font.Size := 8; p2 := footer.AddParagraph(p, -1, nil); p.Font.Size := 8; pgno := footer.AddPageNumber('第 {-3} 页,共 {1} 页', p.Font); //添加页码 pgno.Format.Alignment := 'center'; //据中对齐 pgno.Format.SpaceAfter := 0; pgno.Apply(); //添加页眉 header := section.AddHeader('');//添加缺省页眉 p := TOfficeObj('TParagraph'); p.Run.SetText( '深圳市天软科技开发有限公司' ); p.Format.Alignment := 'right'; //据右对齐 //p.Format.Bdr.Bottom.val := 'single';//页眉横线 p.Font.Name := '宋体'; p.Font.Color := 'FF0000'; p.Font.Size := 8; p1 := header.AddParagraph(p, -1, nil); println(' >>OK\n'); End; ///文本框 Function _10_TTextBox(docx); Begin paragraph := sysparams['Test']; _PrintMsg('TTextBox对象'); _AddTitle(docx, 'TTextBox对象(文本框)', 1); //第十段标题 ///TTextBox方法 _AddTitle(docx, 'TTextBox方法', 2); conf := _LoadClassInfo(docx.GetPath() + '\\funcext\\TSOffice\\TOfficeObj.tsf', 'TDocumentBody'); conf := select * from conf where leftstr(['funcname'],10) <> 'AddPicture' end; _AddFunctionHelpInfo(docx, '' $ paragraph $ '.1.', conf, 3); println(' >>OK\n'); End; ///TRange Function _11_TRange(docx); Begin paragraph := sysparams['Test']; _PrintMsg('TRange对象'); _AddTitle(docx, 'TRange对象', 1); //第11段标题 ///TRange对象 _AddTitle(docx, 'TRange对象', 2); attrs := array( ('类别':'属性', '接口':'Font', '说明':'字体属性,参考段落字体属性'), ('类别':'属性', '接口':'Text', '说明':'读写属性:文字内容') ); _AddClassHelpTable(docx, attrs);//添加表格:TRange属性 ///TRange方法 _AddTitle(docx, 'TRange方法', 2); conf := _LoadClassInfo(docx.GetPath() + '\\funcext\\TSOffice\\TOfficeObj.tsf', 'TRange'); _AddFunctionHelpInfo(docx, '' $ paragraph $ '.2.', conf, 3); //修改字体属性案例 _AddTitle(docx, '字体属性设置案例', 2); //添加测试段落文字 p1 := TOfficeObj('TParagraph'); p1.Format.FirstLineIndent := 220; //指定段落第一行缩进的相对差异的值 p1.Format.LeftIndent := 440;//段落左边距 p1.Run.SetText( '深圳市天软公司' ); p1.Run.rPr.Name := '宋体'; pTest := docx.AddParagraph(p1, -1, nil); //修改部分文字字体 range := pTest.Range(3,2); range.Font.Size := 16; range.Font.Color := 'FF0000'; range.Font.Bold := true; range.Apply(); //添加文字1 range1 := pTest.AddText(5, '科技开发有限'); range1.Font.Size := 14; range1.Font.Color := '00FF00'; range1.Font.Bold := true; range1.Apply(); //添加文字2 range2 := pTest.AddText(0, '广东省'); range2.Font.Size := 14; range2.Font.Color := '0000FF'; range2.Font.Bold := true; range2.Apply(); //r := pTest.Range(2,10); //r.Text := 'Tinysoft'; r := pTest.AddText(-1, ':www.tinysoft.com.cn');//段落后追加 r.Font.Size := 10; r.Font.Color := '0000FF'; r.Font.Bold := true; r.Apply(); println(' >>OK\n'); End; ///TDocxStyles Function _12_TDocxStyles(docx); Begin paragraph := sysparams['Test']; _PrintMsg('TDocxStyles对象'); _AddTitle(docx, 'TDocxStyles对象', 1); //第12段标题 ///TDocxStyles方法 _AddTitle(docx, 'TDocxStyles方法', 2); conf := _LoadClassInfo(docx.GetPath() + '\\funcext\\TSOffice\\document\\TDocxStyles.tsf', 'TDocxStyles'); _AddFunctionHelpInfo(docx, '' $ paragraph $ '.1.', conf, 3); _AddTitle(docx, '样式(TDocxStyle)', 2); //第二级标题 attrs := array(); formatObj := new TOfficeObj('TDocxStyle'); _LoadObjectAttributes(formatObj, attrs, '样式', ''); _AddClassHelpTable(docx, attrs); println(' >>OK\n'); End; ///TNumbering Function _13_TNumbering(docx); Begin paragraph := sysparams['Test']; _PrintMsg('TNumbering对象'); _AddTitle(docx, 'TNumbering对象', 1); //第13段标题 ///TNumbering方法 _AddTitle(docx, 'TNumbering方法', 2); conf := _LoadClassInfo(docx.GetPath() + '\\funcext\\TSOffice\\document\\TNumbering.tsf', 'TNumbering'); _AddFunctionHelpInfo(docx, '' $ paragraph $ '.1.', conf, 3); ///TNumStyle对象 _AddTitle(docx, 'TNumStyle属性', 2); formatObj := new TOfficeObj('TNumStyle'); _LoadObjectAttributes(formatObj, attrs, '属性', ''); _AddClassHelpTable(docx, attrs);//添加表格:TNumStyle属性 //缺省项目符号 _AddTitle(docx, '缺省项目符号', 2); for i:=0 to 6 do Begin p := TOfficeObj('TParagraph'); p.Format.numPr.Level := 0;//项目编号 p.Format.numPr.numId := docx.NumberingObject().NumberId('bullet', i); //项目编号 p.Font.Size := 14; p.Font.Color := 'FF0000'; p.Font.Bold := true; p.Format.LeftIndent := 700;//段落左边距 p.Run.SetText( 'NumberId("bullet", ' $ i $ ')' ); docx.AddParagraph(p, -1, nil); End; println(' >>OK\n'); End; ///TDocxChart Function _14_TDocxChart(docx); Begin paragraph := sysparams['Test']; _PrintMsg('TChart对象'); _AddTitle(docx, 'TChart对象', 1); //第14段标题 ///TDocxChart方法 _AddTitle(docx, 'TChart方法', 2); conf := _LoadClassInfo(docx.GetPath() + '\\funcext\\TSOffice\\TOfficeObj.tsf', 'TChart'); _AddFunctionHelpInfo(docx, '' $ paragraph $ '.1.', conf, 3); ///TChart对象 _AddTitle(docx, 'TChart属性', 2); formatObj := new TOfficeObj('TChart'); _LoadObjectAttributes(formatObj, attrs, '属性', ''); _AddClassHelpTable(docx, attrs);//添加表格:TChart属性 data := array( ('年度':2019, '深圳':26927, '广州':23628, '佛山':10751, '东莞':9482, '惠州':4177, '其它':32706), ('年度':2020, '深圳':27670, '广州':25019, '佛山':10816, '东莞':9650, '惠州':4222, '其它':33383.92), ('年度':2021, '深圳':30665, '广州':28232, '佛山':12157, '东莞':10855, '惠州':4977, '其它':37483.7) ); tmpData := nils(3,7); tmpData[:,:] := data; _AddTitle(docx, '案例一:广东省2019——2021年GDP(柱状图)', 2); chart := TOfficeObj('TChart'); chart.Width := 15; chart.Height := 9; chart.Type := 'col'; chart.VaryColors := true; chart.Name := 'GD-GDP-1'; chart.Title := '广东省2019——2021年GDP(单位:亿元)'; names := FieldNames(data)[1:]; for i:=0 to length(data)-1 do chart.AddSeries('' $ data[i]['年度'], names, (tmpData[i])[1:]); chart.ShowLegendKey := false; chart.Legend.Position := 'bottom'; chart.ShowBubbleSize := true; chart.ShowCatName := false; chart.ShowPercent := true; chart.ShowSerName := false; chart.ShowVal := false; chart.ShowBlanksAs := 'zero'; chart.DataTable := true; docx.AddChart(chart, -1); _AddTitle(docx, '案例二:广东省2019——2021年GDP(折线图)', 2); chart.Name := 'GD-GDP-2'; chart.Type := 'line'; chart.ShowBubbleSize := false; chart.ShowPercent := false; chart.DataTable := false; chart.ClearSeries(); for i:=0 to length(names)-1 do begin k := names[i]; chart.AddSeries(names[i], array('2019','2020','2021'), sselect [k] from data end); End; docx.AddChart(chart, -1); _AddTitle(docx, '案例三:广东省2021年GDP(饼状图)', 2); chart.Name := 'GD-GDP-3'; chart.Title := '广东省2021年GDP(单位:亿元)'; chart.Type := 'pie'; chart.ShowCatName := true; chart.ClearSeries(); chart.AddSeries('广东省', names, (tmpData[2])[1:]); docx.AddChart(chart, -1); charts := array(("Type":"area","图表类型":"标准二维面积图"), ("Type":"areastacked","图表类型":"二维堆积面积图"), ("Type":"areapercentstacked","图表类型":"二维百分比堆积面积图"), ("Type":"area3d","图表类型":"标准三维面积图"), ("Type":"area3dstacked","图表类型":"三维堆积面积图"), ("Type":"area3dpercentstacked","图表类型":"三维百分比堆积面积图"), ("Type":"bar","图表类型":"二维簇状条形图"), ("Type":"barstacked","图表类型":"二维堆积条形图"), ("Type":"barpercentstacked","图表类型":"二维百分比堆积条形图"), ("Type":"bar3dclustered","图表类型":"三维簇状条形图"), ("Type":"bar3dstacked","图表类型":"三维堆积条形图"), ("Type":"bar3dpercentstacked","图表类型":"三维百分比堆积条形图"), ("Type":"bar3dconeclustered","图表类型":"三维簇状水平圆锥图"), ("Type":"bar3dconestacked","图表类型":"三维堆积水平圆锥图"), ("Type":"bar3dconepercentstacked","图表类型":"三维堆积百分比水平圆锥图"), ("Type":"bar3dpyramidclustered","图表类型":"三维簇状水平棱锥图"), ("Type":"bar3dpyramidstacked","图表类型":"三维堆积水平棱锥图"), ("Type":"bar3dpyramidpercentstacked","图表类型":"三维堆积百分比水平棱锥图"), ("Type":"bar3dcylinderclustered","图表类型":"三维簇状水平圆柱图"), ("Type":"bar3dcylinderstacked","图表类型":"三维堆积水平圆柱图"), ("Type":"bar3dcylinderpercentstacked","图表类型":"三维堆积百分比水平圆柱图"), ("Type":"col","图表类型":"二维簇状柱形图"), ("Type":"colstacked","图表类型":"二维堆积柱形图"), ("Type":"colpercentstacked","图表类型":"二维百分比堆积柱形图"), ("Type":"col3d","图表类型":"三维簇状柱形图"), ("Type":"col3dclustered","图表类型":"三维柱形图"), ("Type":"col3dstacked","图表类型":"三维堆积柱形图"), ("Type":"col3dpercentstacked","图表类型":"三维百分比堆积柱形图"), ("Type":"col3dcone","图表类型":"三维圆锥图"), ("Type":"col3dconeclustered","图表类型":"三维簇状圆锥图"), ("Type":"col3dconestacked","图表类型":"三维堆积圆锥图"), ("Type":"col3dconepercentstacked","图表类型":"三维百分比堆积圆锥图"), ("Type":"col3dpyramid","图表类型":"三维棱锥图"), ("Type":"col3dpyramidclustered","图表类型":"三维簇状棱锥图"), ("Type":"col3dpyramidstacked","图表类型":"三维堆积棱锥图"), ("Type":"col3dpyramidpercentstacked","图表类型":"三维百分比堆积棱锥图"), ("Type":"col3dcylinder","图表类型":"三维圆柱图"), ("Type":"col3dcylinderclustered","图表类型":"三维簇状圆柱图"), ("Type":"col3dcylinderstacked","图表类型":"三维堆积圆柱图"), ("Type":"col3dcylinderpercentstacked","图表类型":"三维百分比堆积圆柱图"), ("Type":"bubble","图表类型":"气泡图"), ("Type":"bubble3d","图表类型":"3D气泡图"), ("Type":"doughnut","图表类型":"圆环图"), ("Type":"line","图表类型":"折线图"), ("Type":"pie3d","图表类型":"三维饼图"), ("Type":"pie","图表类型":"饼图"), ("Type":"radar","图表类型":"雷达图"), ("Type":"scatter","图表类型":"散点图"), ("Type":"surface3d","图表类型":"三维曲面图"), ("Type":"wireframesurface3d","图表类型":"三维曲面图(框架图)"), ("Type":"contour","图表类型":"曲面图"), ("Type":"wireframecontour","图表类型":"曲面图(俯视框架图)")); _AddTitle(docx, '系统支持的图表类型', 2); tbl := docx.CreateTable(charts, true, true); tbl.Format.Indent := 500; tbl.format.IndentType := 'dxa'; //设置列宽 tbl.ColumnWidth(1, 2000); tbl.ColumnWidth(2, 6000); tbl.ColumnWidth(3, 8000); tbl := docx.InsertTable(tbl, -1); println(' >>OK\n'); End; ///TOfficeApi Function _15_TOfficeApi(docx); Begin paragraph := sysparams['Test']; _PrintMsg('TOfficeApi接口'); _AddTitle(docx, 'TOfficeApi', 1); _AddTitle(docx, 'TOfficeApi接口', 2); conf := _LoadClassInfo(docx.GetPath() + '\\funcext\\TSOffice\\TSUtils\\TOfficeApi.tsf', 'TOffice'); _AddFunctionHelpInfo(docx, '' $ paragraph $ '.1.', conf, 3); println(' >>OK\n'); End; Function _16_Template(docx); Begin paragraph := sysparams['Test']; _PrintMsg('报告模板(ExecInnerTSL)'); _AddTitle(docx, '报告模板(docx.ExecInnerTSL())', 1); //添加段落 p := TOfficeObj('TParagraph'); p.Run.SetText( '系统提供docx.ExecInnerTSL()接口,用户可以制作自定义的报告模板,参考文档:' + 'template.docx。'); p.Format.FirstLineIndent := 220; //指定段落第一行缩进的相对差异的值 p.Format.LeftIndent := 440;//段落左边距 p.Font.Name := '宋体'; p.Font.Color := 'FF0000'; p.Font.Bold := true; p.Font.Size := 15; p1 := docx.AddParagraph(p, -1, nil); println(' >>OK\n'); End; Function _AddTitle(docx, subject, level); Begin leftIndent := array((0,0), (425,425), (453,850), (708,1508)); p := docx.AddHeading(subject, -1, level);//标题 if level then Begin p.Format.FirstLineChars := 0; p.Format.LeftChars := 0; p.Format.Hanging := leftIndent[level][0]; p.Format.LeftIndent := leftIndent[level][1];//段落左边距 End else //标题 p.Format.Alignment := 'center'; //据中对齐 //p.Font.Name := '宋体'; p.Font.rFont.hint := 'eastAsia'; p.Font.Bold := true; if level then Begin p.Format.numPr.Level := level - 1; //项目级别 p.Format.numPr.numId := sysparams['numId']; //项目编号 End; p.Apply(); return p; End; ///添加函数帮助信息 Function _AddFunctionHelpInfo(docx, head, conf, level); Begin ind := 1; hash := array(); for i:=0 to length(conf)-1 do Begin if not ifString(conf[i]['comment']) or conf[i]['comment'] = '' then continue; arr := str2array(conf[i]['funcname'], '('); k := lowercase(arr[0]); if hash[k]=1 and not (k in array('create')) then continue; hash[k] := 1; subject := head $ ind++ $ ' ' $ conf[i]['funcname']; _AddTitle(docx, conf[i]['funcname'], level); //添加函数声明段落 pFun := TOfficeObj('TParagraph'); pFun.Format.Hanging := 660; //悬挂缩进 pFun.Format.LeftIndent := 1760;//段落左边距 pFun.Font.Name := '宋体'; println(' Subject:{}', subject); pFun.Run.SetText( 'Function ' + conf[i]['funcname'] ); p1 := docx.AddParagraph(pFun, -1, nil);//函数方法 //设置首行字体颜色、黑体 firstRun := p1.GetRun(0); firstRun.Font.Color := 'FF0000'; firstRun.Font.Bold := true; firstRun.Apply(); //添加函数帮助信息段落 arr := str2array(conf[i]['comment'], '\n'); for j:=0 to length(arr)-1 do Begin pFun.Run.SetText('///' + arr[j]); p2 := docx.AddParagraph(pFun, -1, nil); End; End; End; ///从对象中加载属性 Function _LoadObjectAttributes(obj, r, itemType, api); Begin if not ifArray(r) then r := array(); attrs := obj.GetAttrs(); ind := length(r); for i:=0 to length(attrs)-1 do Begin if attrs[i, 3] = 'disable' then continue; r[ind]['类别'] := itemType; r[ind]['接口'] := ifthen(api='','',api + '.') + attrs[i, 0]; r[ind]['说明'] := attrs[i, 3]; ind++; End; children := obj.GetChildren(); for i:=0 to length(children)-1 do Begin descText := children[i]['desc']; if descText = 'disable' then continue; if ifObj(children[i]['obj']) then Begin if descText = '' then Begin _LoadObjectAttributes(children[i]['obj'], r, itemType, ifthen(api='','',api + '.') $ children[i]['field']); ind := length(r); continue; End else Begin if not ifArray(sysParams['objs']) then sysParams['objs'] := array(); cnt := length(sysParams['objs']); sysParams['objs'][cnt] := array('name':children[i]['field'], 'obj':children[i]['obj'], 'desc':children[i]['desc'], 'class':children[i]['class']); descText := descText $ '(' $ children[i]['class'] $ '对象)'; End; End r[ind]['类别'] := itemType; r[ind]['接口'] := ifthen(api='','',api + '.') + children[i]['field']; r[ind]['说明'] := descText; ind++; End; End; ///添加对象属性表格 Function _AddClassHelpTable(docx, data); Begin //设置边框属性 tbl := docx.CreateTable(data, true, true); tbl.Format.Borders.Top.Size := 12; tbl.Format.Borders.Left.Size := 12; tbl.Format.Borders.Bottom.Size := 12; tbl.Format.Borders.Right.Size := 12; tbl.Format.Borders.Top.Val := 'thinThickThinMediumGap'; tbl.Format.Borders.Left.Val := 'thinThickThinMediumGap'; tbl.Format.Borders.Bottom.Val := 'thinThickThinMediumGap'; tbl.Format.Borders.Right.Val := 'thinThickThinMediumGap'; tbl.Format.Borders.InsideH.Val := 'single'; tbl.Format.Borders.InsideV.Val := 'single'; tbl.Format.Borders.Top.color := 'D0D0D0'; tbl.Format.Borders.Left.color := 'D0D0D0'; tbl.Format.Borders.Bottom.color := 'D0D0D0'; tbl.Format.Borders.Right.color := 'D0D0D0'; tbl.Format.Borders.Top.themeColor := 'accent3'; tbl.Format.Borders.Left.themeColor := 'accent3'; tbl.Format.Borders.Bottom.themeColor := 'accent3'; tbl.Format.Borders.Right.themeColor := 'accent3'; tbl.Format.Borders.Top.themeTint := '99'; tbl.Format.Borders.Left.themeTint := '99'; tbl.Format.Borders.Bottom.themeTint := '99'; tbl.Format.Borders.Right.themeTint := '99'; //设置列宽 tbl.ColumnWidth(1, 600); tbl.ColumnWidth(2, 2100); tbl.ColumnWidth(3, 2100); tbl.ColumnWidth(4, 6000); //设置表格左边距 tbl.Format.Indent := 500; tbl.format.IndentType := 'dxa'; //tbl.TblPr.Style := 1; tbl := docx.InsertTable(tbl, -1); //设置表头底纹 rows := tbl.Rows(); cols := tbl.Cols(); for i:=1 to cols do Begin cell := tbl.Cell(1, i); cell.Format.Shading.ThemeFillTint := 32; cell.Format.Shading.ThemeFill := 'accent5'; cell.Format.Shading.Fill := 'DBEEF3'; cell.Apply(); End; //设置第1列底纹 for i:=1 to rows do Begin cell := tbl.Cell(i, 1); cell.Format.Shading.ThemeFillTint := 32; cell.Format.Shading.ThemeFill := 'accent5'; cell.Format.Shading.Fill := 'DBEEF3'; cell.Apply(); End; //合并单元格 fields := select distinct [1] as 'type' from data where thisrowindex > 0 end; for i:=0 to length(fields)-1 do begin key := fields[i]['type']; r := select thisrowindex+1 as 'row' from data where [1] = key end; begRow := r[0]['row']; endRow := r[length(r)-1]['row']; [err, begCell] := CoordinatesToCellName(2, begRow); [err, endCell] := CoordinatesToCellName(2, endRow); tbl.Merge(begCell, endCell, true); //设置合并单元格据中对齐 cell := tbl.Cell(begRow, 2); cell.Format.vAlign := 'center'; cell.Apply(); End; End; ///打印信息 Function _PrintMsg(msg); Begin if ifNil(sysparams['Test']) then sysParams['Test'] := 0; println('This is test {}: {}.',sysParams['Test'],msg); sysParams['Test'] := sysParams['Test'] + 1; End; ///从TSDocxFile.tsf文件加载API function _LoadClassInfo(f, className); Begin _ReplaceFileName(f); if istable(sysparams[f]) then Begin return sysParams[f, className]; End; [err,fh] := io_open(f); if err then return array(); [err, data] := io_read(fh); io_close(fh); if err then return array(); sysparams[f] := array(); comment := ''; cName := ''; funcname := ''; t := array(); lines := str2array(string(data), '\n'); for i:=0 to length(lines)-1 do begin line := lines[i]; if leftstr(line, 5) = 'Type ' then Begin a := str2array(line, ' '); cName := a[1]; continue; End; if lowercase(leftstr(line, 3)) = 'end' then Begin if cName <> '' then Begin sysParams[f, cName] := t; End; cName := ''; t := array(); continue; End; if cName = '' then continue; str := ' End;'; if leftstr(line, length(str)) = str then Begin comment := ''; name := ''; continue; End; func := ' Function '; if leftstr(line, length(func)) = func then Begin funcname := rightstr(line, length(line)-length(func)); if funcname <> '' then Begin n := length(t); t[n]['funcname'] := funcname; t[n]['comment'] := comment; t[n]['name'] := name; End; comment := ''; name := ''; continue; End; if ParseRegExpr('\/\/\/(.*)$',line,'',result,MPos,Mlen) and length(result) then Begin str := result[0][1]; comment := comment + (comment = '' ? '' : '\n') + str; if name='' then begin name := str; end; End; End; return sysParams[f, className]; End; ///附注 Function _Annotation(docx); Begin r := sysParams['objs']; if not istable(r) then return; sysParams['objs'] := array(); paragraph := sysparams['Test']; _PrintMsg('附注'); _AddTitle(docx, '附注一:内置对象', 1); //附注标题 ind := 1; hash := array(); while i < length(r) do Begin attrs := array(); _LoadObjectAttributes(r[i]['obj'], attrs, '属性', ''); classname := r[i]['class']; if istable(attrs) and ifnil(hash[classname]) then Begin _AddTitle(docx, classname $ '对象:' $ r[i]['desc'], 2); attrs := array(); _LoadObjectAttributes(r[i]['obj'], attrs, '属性', ''); _AddClassHelpTable(docx, attrs);//添加表格 if istable(sysParams['objs']) then Begin r union= sysParams['objs']; sysParams['objs'] := array(); End; hash[classname] := 1; End; i++; End; println(' >>OK\n'); End; Function _Faq(docx); Begin paragraph := sysparams['Test']; _PrintMsg('FAQ'); _AddTitle(docx, '附注二:FAQ', 1); //附注FAQ标题 data := TOfficeTemplate('faq.txt'); if ifnil(data) then return; lines := str2array(string(data), '\n'); numId := docx.NumberingObject().NumberId('bullet', 1); //项目编号 for i:=0 to length(lines)-1 do Begin title := flase; str := lines[i]; p := TOfficeObj('TParagraph'); if str <> '' then Begin if str[1] = '*' then Begin title := true; str := str[2:]; println(' FAQ: {}', str); End; p.Run.SetText( str ); End; if title then Begin p.Format.numPr.Level := 0;//项目编号 p.Format.numPr.numId := numId; p.Font.Size := 14; p.Font.Color := 'FF0000'; p.Font.Bold := true; p.Format.LeftIndent := 500;//段落左边距 End else Begin p.Format.Hanging := 300; //悬挂缩进 p.Format.LeftIndent := 880;//段落左边距 End; docx.AddParagraph(p, -1, nil); End; println(' >>OK\n'); End; Function _ReplaceFileName(f); Begin if f[1] = '/' then f := ReplaceStr(f, '\\', '/'); return f; End;