TSOffice/funcext/TSOffice/document/TTableContent.tsf

322 lines
9.0 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

Type TTableContent = class
//目录
Function Create(docx);overload;
Begin
Create(docx, nil);
End;
Function Create(docx, node);overload;
Begin
node_ := node;
docx_ := docx;
impl_ := TOfficeObj('TTableContentImpl');
//_CheckNodes('endnotes.xml');
//_CheckNodes('footnotes.xml');
//contentType := docx.Zip().Get('[Content_Types].xml');
//class(TSXml).AddOverrideContentType(contentType, 'wmf', 'image/x-wmf');
End;
Function SetDefaultFormat();
Begin
defultFont := impl_.sdtPr.rPr;
defultFont.rFont.cstheme := 'minorBidi';
defultFont.rFont.XMLeastAsia := '宋体';
defultFont.rFont.XMLhAnsi := '宋体';
defultFont.rFont.XMLascii := '宋体';
//defultFont.kern := 2;
defultFont.Size := 21/2;
defultFont.SzCs := 24;
defultFont.Lang := 'en-US';
defultFont.bidi := 'ar-SA';
defultFont.eastAsia := 'zh-CN';
defultFont.Color := 'DBDBDB';
defultFormat := impl_.sdtPr;
defultFormat.ID := integer(time()*24*3600);
//defultFormat.Color := 'DBDBDB';
defultFormat.docPartObj.docPartGallery := 'Table of Contents';
defultFormat.docPartObj.docPartUnique := 1;
//impl_.sdtEndPr.rPr.Size := 21;
//impl_.sdtEndPr.rPr.SzCs := 22;
impl_.sdtEndPr.rPr.Bold := true;
End;
///应用目录样式
Function Apply(); override;
Begin
// 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;
///添加目录条目
///UpperHeadingLevel标题最高级别
///LowerHeadingLevel标题最低级别
/// 使用 UpperHeadingLevel 属性可设置起始标题级别(最高)。例如,若要设置 TOC 域语法 {TOC \o "1-3"},可将 LowerHeadingLevel 属性设为 3并将 UpperHeadingLevel 属性设为 1。
Function Add(posOpt, UpperHeadingLevel, LowerHeadingLevel);
Begin
///目录
mParagraph := TOfficeObj('TParagraph');
mParagraph.pPr.LineSpacingRule := 'auto';
mParagraph.pPr.LineSpacing := 240;
mParagraph.pPr.AfterLines := 0;
mParagraph.pPr.SpaceAfter := 0;
mParagraph.pPr.BeforeLines := 0;
mParagraph.pPr.SpaceBefore := 0;
mParagraph.pPr.Alignment := 'center';
mParagraph.pPr.FirstLineChars := 0;
mParagraph.pPr.FirstLineIndent := 0;
mParagraph.pPr.RightChars := 0;
mParagraph.pPr.RightIndent := 0;
mParagraph.pPr.LeftChars := 0;
mParagraph.pPr.LeftIndent := 0;
mParagraph.pPr.StyleID := _GetStyle('TOC');
mParagraph.Run.T := '目录';
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');
id := docx_.Document().GetBookMarkID();
goback.MarkStart.Name := '_GoBack';
goback.MarkStart.ID := id;
goback.MarkEnd.ID := id;
//_AddStdContent(goback);
//缺省目录需要word或wps打开后更新目录
//_AddDefaultTableContent(UpperHeadingLevel, LowerHeadingLevel);
//自定义页码计算与word、wps有差异不推荐使用
_AddTableContent(posOpt, UpperHeadingLevel, LowerHeadingLevel);
End;
Function _AddDefaultTableContent(UpperHeadingLevel, LowerHeadingLevel);
Begin
p := _AddItem(UpperHeadingLevel, LowerHeadingLevel, UpperHeadingLevel - 1, true);
_AddStdContent(p);
p2 := TOfficeObj('TParagraph');
//p2.Format.SpaceAfter := 0;
run := p2.AddRun();
run.rPr.Bold := true;
run.rPr.noProof := true;
run.fldCharType := 'end';
_AddStdContent(p2);
End;
Function _AddItem(UpperHeadingLevel, LowerHeadingLevel, level, first);
Begin
p := TOfficeObj('TParagraph');
//标题段落属性
p.Format.StyleId := _GetStyle(level);
//p.Format.SpaceAfter := 0;
p.Format.rPr.noProof := true;
tab := TOfficeObj('TTabStop');
tab.Val := 'right';
tab.leader := 'dot';
tab.Position := 8306;
p.Format.Tabs.Add(0, tab);
if first then Begin
//fldCharType
r1 := p.AddRun();
r1.fldCharType := 'begin';
r1.Dirty := 0;
//instrText
r2 := p.AddRun();
r2.instrTextSpace := 'preserve';
r2.instrText := 'TOC \\o \"' $ UpperHeadingLevel $ '-' $ LowerHeadingLevel $ '\" \\h \\z \\u ';
//fldCharType
r3 := p.AddRun();
r3.fldCharType := 'separate';
End;
return p;
End;
Function _AddTableContent(posOpt, UpperHeadingLevel, LowerHeadingLevel);
Begin
///获取标题列表 array((("Level":level,"Paragraph":"object","Text":title,"numId":,"ilvl":,"numArr":));
numMap := array();
r := docx_.Document().Body().GetHeadingListImpl(docx_, nil, UpperHeadingLevel, LowerHeadingLevel, numMap);
for i:=0 to length(r)-1 do Begin
p := _AddItem(UpperHeadingLevel, LowerHeadingLevel, r[i]['Level'], i = 0 ? true: false);
//fldCharType
h := p.AddHyperLink();
bookmarke := _GetBookMarkId(r[i]['Paragraph']);
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
run_t := class(TSXml).CurCodePageToUtf8(r[i]['Text']);
if numStr <> '' then run_t := numStr + ' ' + run_t;
r1.SetText(run_t, 1);
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
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
r6 := h.AddRun();
r6.rPr.noProof := true;
r6.rPr.WebHidden := true;
r6.fldCharType := 'separate';
//页码
r7 := h.AddRun();
r7.T := 0;//'' $ r[i]['pageNo'];
//fldCharType
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;
///更新目录
Function UpdatePageNumbers();
Begin
End;
Function Paragraphs();
Begin
node := class(TSXml).GetNode(docx_.Document().Body().Node(), 'w:sdt/w:sdtContent');
r := array();
if ifObj(node) then
begin
twbody := TOfficeObj('TwBody');
twbody.Create(nil, 'w:sdtContent');
twbody.InitRootNode(node);
twbody.InitNode(node);
parts := twbody.Paragraphs();
for i:=0 to length(parts)-1 do
begin
r[i] := TOfficeObj('TParagraph');
r[i].Init(parts[i].node_);
end
end
return r;
End;
Function Marshal();
Begin
return impl_.Marshal();
End;
Property Format read readFormat;
Function readFormat();
Begin
return impl_.sdtPr;
End;
Property EndFormat read readEndFormat;
Function readEndFormat();
Begin
return impl_.sdtEndPr;
End;
Property Font read readFont;
Function readFont();
Begin
return impl_.sdtPr.rPr;
End;
Function _AddStdContent(o);
Begin
impl_.SdtContent.NewChildNode( array("field":"", "name":"w:p", "obj":o, "attrEx":"", "nodeType":"") );
End;
Function _GetStyle(level);
Begin
styleName := ifstring(level) ? level : 'TOC' $ (level + 1);
style := docx_.StyleObject().GetStyleById(styleName);
if not ifObj(style) then Begin
style := docx_.StyleObject().AddDefaultStyle(styleName);
End;
return style.StyleId;
End;
Function _GetBookMarkId(p);
Begin
node := p.node_.FirstChildElement('w:bookmarkStart');
if ifObj(node) then
return node.GetAttribute('w:name');
bookMarkID := docx_.Document().GetBookMarkID();
return p.AddBookMark(bookMarkID);
End;
Function _CheckNodes(name);
Begin
z := docx_.Zip();
xml := z.Get('word/' + name);
if not ifObj(xml) then Begin
xmlData := TOfficeTemplate(name);
if not ifString(xmlData) then
return ;
z.Add('word/' + name, xmlData);
rels := 'word/_rels/document.xml.rels';
relsObj := z.Get(rels);
[rId, target] := class(TSXml).FindRelationshipRid(relsObj, '');
rId ++;
if name = 'endnotes.xml' then Begin
class(TSXml).AddRelationshipRid(relsObj, name, 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/endnotes', 'rId' $ rId);
contentType := z.Get('[Content_Types].xml');
class(TSXml).AddOverrideContentType(contentType, '/word/' + name, 'application/vnd.openxmlformats-officedocument.wordprocessingml.endnotes+xml');
End
else if name = 'footnotes.xml' then Begin
class(TSXml).AddRelationshipRid(relsObj, name, 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/footnotes', 'rId' $ rId);
contentType := z.Get('[Content_Types].xml');
class(TSXml).AddOverrideContentType(contentType, '/word/' + name, 'application/vnd.openxmlformats-officedocument.wordprocessingml.footnotes+xml');
End;
End;
End;
docx_;
node_;
impl_;
End;