This commit is contained in:
csh 2023-09-22 09:15:38 +08:00
parent 5f1064794d
commit db71b8cd2c
5 changed files with 82 additions and 45 deletions

View File

@ -1,4 +1,4 @@
// Version 1.4.6
// Version 1.4.7
Function TOfficeObj(n);
Begin
@ -13922,25 +13922,21 @@ Type TDocumentBody = Class(DocObject)
p := new TParagraph(pNode);
//统计数字项目编号
numArr := array();
ilvl := -1;
numId := '';
numId := getNumPr('numId', docx, p);
ilvl := getNumPr('Level', docx, p);
if not ilvl then ilvl := 0;
if ifarray(numIds) then Begin
sectPr.Append(p);
numId := p.Format.NumPr.Value('numId');
lvlStr := p.Format.NumPr.Value('Level');
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
numIds[numId] := array(0,0,0,0,0,0,0,0,0,0);
prev := numIds[numId, ilvl];
if prev then Begin
for i:=ilvl+1 to 9 do
numIds[numId, i] := 0;
End;
numIds[numId, ilvl]++;
numArr := numIds[numId];
if ilvl >= 0 and ilvl < 10 then Begin
if not istable(numIds[numId]) then
numIds[numId] := array(0,0,0,0,0,0,0,0,0,0);
prev := numIds[numId, ilvl];
if prev then Begin
for i:=ilvl+1 to 9 do
numIds[numId, i] := 0;
End;
numIds[numId, ilvl]++;
numArr := numIds[numId];
End;
End;
if bHeadList then Begin //统计大纲显示(目录)
@ -13948,7 +13944,7 @@ Type TDocumentBody = Class(DocObject)
if styleId <> '' then Begin
obj := docx.StyleObject().GetStyleById(styleId);
if ifObj(obj) then Begin
level := obj.HeadingLevel();
level := getHeadingLevel(docx, obj);
iLevel := Class(TSXml).SafeStrToIntDef(level, -1);
if p.Text() <> "" and iLevel+1 >= UpperHeadingLevel and iLevel+1 <= LowerHeadingLevel then Begin
r[ind]['Level'] := strtoint(level);
@ -13988,6 +13984,40 @@ Type TDocumentBody = Class(DocObject)
End;
return r;
End;
Function getNumPr(field, docx, p);
Begin
value := p.Format.NumPr.Value(field);
if value then return value;
styleId := p.Format.Value('StyleId', 1);
return getFieldByStyle(field, docx, docx.StyleObject().GetStyleById(styleid));
End;
Function getFieldByStyle(field, docx, obj);
Begin
if not ifObj(obj) then return '';
numId := obj.pPr.numPr.Value(field);
if numId = '' then
begin
id := o.Value('BasedOn');
return getNumIdByStyle(docx, docx.StyleObject().GetStyleById(id));
end
return numId;
End;
Function getHeadingLevel(docx, obj);
Begin
if not ifObj(obj) then return '';
o := obj;
level := obj.HeadingLevel();
if level = '' then
begin
id := o.Value('BasedOn');
return getHeadingLevel(docx, docx.StyleObject().GetStyleById(id));
end
return level;
End;
Function getPictureMaxId();
Begin
@ -14661,7 +14691,7 @@ Type TTable = Class(DocObject, TTableImpl)
cellObj.mergeSpan_ := c[1];
return cellObj;
End;
///设置列宽
Function ColumnWidth(n, wth);
Begin

View File

@ -1,4 +1,4 @@
// Version 1.4.6
// Version 1.4.7
Type TSDocxFile = Class
///Version: V1.0 2022-09-20

View File

@ -1,4 +1,4 @@
// Version 1.4.6
// Version 1.4.7
Type TSExcelFile = Class
///Version: V1.0 2022-08-08

View File

@ -4,7 +4,7 @@ Type TTableContent = class
Begin
Create(docx, nil);
End;
Function Create(docx, node);overload;
Begin
node_ := node;
@ -15,7 +15,7 @@ Type TTableContent = class
//contentType := docx.Zip().Get('[Content_Types].xml');
//class(TSXml).AddOverrideContentType(contentType, 'wmf', 'image/x-wmf');
End;
Function SetDefaultFormat();
Begin
defultFont := impl_.sdtPr.rPr;
@ -39,7 +39,7 @@ Type TTableContent = class
//impl_.sdtEndPr.rPr.SzCs := 22;
impl_.sdtEndPr.rPr.Bold := true;
End;
///应用目录样式
Function Apply(); override;
Begin
@ -50,7 +50,7 @@ Type TTableContent = class
arr := tmp_impl.Marshal();
class(TSXml).UpdateNode(node_, arr['attributes'], arr['children']);
End;
///添加目录条目
///UpperHeadingLevel标题最高级别
///LowerHeadingLevel标题最低级别
@ -79,26 +79,26 @@ Type TTableContent = class
//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();
@ -107,7 +107,7 @@ Type TTableContent = class
run.fldCharType := 'end';
_AddStdContent(p2);
End;
Function _AddItem(UpperHeadingLevel, LowerHeadingLevel, level, first);
Begin
p := TOfficeObj('TParagraph');
@ -162,7 +162,7 @@ Type TTableContent = class
End
if numStr <> '' then run_t := numStr + ' ' + r[i]['Text'];
else run_t := r[i]['Text'];
r1.SetText(run_t);
r1.SetText(run_t, 1);
r2 := h.AddRun();
r2.rPr.noProof := true;
@ -203,7 +203,6 @@ Type TTableContent = class
r8.fldCharType := 'end';
_AddStdContent(p);
End;
p2 := TOfficeObj('TParagraph');
@ -215,7 +214,7 @@ Type TTableContent = class
_AddStdContent(p2);
End;
///更新目录
Function UpdatePageNumbers();
Begin
@ -240,24 +239,24 @@ Type TTableContent = class
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
@ -268,7 +267,7 @@ Type TTableContent = class
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);
@ -278,30 +277,30 @@ Type TTableContent = class
End;
return style.StyleId;
End;
Function _GetBookMarkId(p);
Begin
node := p.node_.FirstChildElement('w:bookmarkStart');
if ifObj(node) then
if ifObj(node) then
return node.GetAttribute('w:name');
bookMarkID := docx_.Document().GetBookMarkID();
return p.AddBookMark();
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
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');
@ -314,7 +313,7 @@ Type TTableContent = class
End;
End;
End;
docx_;
node_;
impl_;

View File

@ -1,5 +1,13 @@
# 更新日志
## 2023-9-22
### V1.4.7
#### word
1. 修复项目符号属于样式时,生成目录无法识别出项目符号问题
## 2023-9-19
### V1.4.6