diff --git a/Demo/DocxHelp.tsl b/Demo/DocxHelp.tsl new file mode 100644 index 0000000..12d1579 --- /dev/null +++ b/Demo/DocxHelp.tsl @@ -0,0 +1,1169 @@ +///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; diff --git a/funcext/TSOffice/TOfficeObj.tsf b/funcext/TSOffice/TOfficeObj.tsf index 5b7219d..c6fdbd5 100644 --- a/funcext/TSOffice/TOfficeObj.tsf +++ b/funcext/TSOffice/TOfficeObj.tsf @@ -14661,7 +14661,7 @@ Type TTable = Class(DocObject, TTableImpl) cellObj.mergeSpan_ := c[1]; return cellObj; End; - + ///设置列宽 Function ColumnWidth(n, wth); Begin diff --git a/funcext/TSOffice/document/TDocxCopy.tsf b/funcext/TSOffice/document/TDocxCopy.tsf index 994e409..089c01b 100644 --- a/funcext/TSOffice/document/TDocxCopy.tsf +++ b/funcext/TSOffice/document/TDocxCopy.tsf @@ -21,7 +21,7 @@ Type TDocxCopy = class Function Copy(posOpt); Begin // 复制所有的样式 - style_copy_obj_.CopyStyle(); + style_copy_obj_.CopyStyle(number_copy_obj_); parts := new_docx_obj_.Body().Parts(); pos := old_docx_obj_.GetPosNode(posOpt); @@ -222,7 +222,7 @@ private begin id := numpr.GetAttribute('w:val'); numberid := number_copy_obj_.CopyNumbering(id); - numpr.SetAttribute('w:val', id); + numpr.SetAttribute('w:val', numberid); end DeleteComment(paragraph); // 删除批注 End; @@ -326,11 +326,12 @@ Type TDocxStyleCopy = class end End; - Function CopyStyle(); + Function CopyStyle(numberobj); Begin for id, obj in id_map_ do begin SetBasedOn(obj); + SetNumId(obj, numberobj); SetLink(obj); old_style_obj_.CopyStyle(obj); end; @@ -382,11 +383,23 @@ private end End; + Function SetNumId(obj, numberobj); + Begin + if not ifObj(numberobj) then return; + numPr := class(TSXml).GetNode(obj.node_, 'w:pPr/w:numPr/w:numId'); + if ifObj(numPr) then + begin + id := numpr.GetAttribute('w:val'); + numberid := numberobj.CopyNumbering(id); + numpr.SetAttribute('w:val', numberid); + end + End; + Function GetNewName(name); Begin new_name := name; count := 0; - while ifObj(old_style_obj_.GetStyle(new_name)) or style_name_map2_[new_name] do + while ifObj(old_style_obj_.GetStyle(class(TSXml).Utf8ToCurCodePage(new_name))) or style_name_map2_[new_name] do new_name := new_name $ count++; return new_name; End; @@ -437,9 +450,9 @@ Type TDocxNumberCopy = class begin number_obj := old_number_obj_.CopyNumber(obj); id_map_[number] := number_obj; - return number_obj; end - end; + return id_map_[number]; + end End; private diff --git a/更新日志.md b/更新日志.md index d77d9e8..444338c 100644 --- a/更新日志.md +++ b/更新日志.md @@ -8,6 +8,7 @@ 1. 修复表格存在合并单元格,生成目录报错问题 2. 修复单元格添加run对象,设置样式不生效问题 +3. 修复插入word后,中文样式重复问题 ### excel