207 lines
5.3 KiB
Plaintext
207 lines
5.3 KiB
Plaintext
Type TDocxStyles = Class
|
||
//段落格式
|
||
Function Create(docx);
|
||
Begin
|
||
docx_ := docx;
|
||
stylesXml_ := docx.Zip().Get('word/styles.xml');
|
||
idMap_ := array();
|
||
nameMap_ := array();
|
||
maxStyleId_ := 1;
|
||
|
||
if ifObj(stylesXml_) then Begin
|
||
stylesNode := stylesXml_.FirstChildElement('w:styles');
|
||
if ifObj(stylesNode) then Begin
|
||
node := stylesNode.FirstChildElement('w:style');
|
||
while ifObj(node) do Begin
|
||
o := TOfficeObj('TDocxStyle');
|
||
o.Init(node);
|
||
id := StrToIntDef(o.StyleId, 0);
|
||
if id > 0 and maxStyleId_ <= id then
|
||
maxStyleId_ := id + 1;
|
||
_addStyle(o);
|
||
node := node.NextElement('w:style');
|
||
End;
|
||
pNode := class(TSXml).GetNode(stylesNode, 'w:docDefaults/w:pPrDefault');
|
||
if ifObj(pNode) then
|
||
defaultPpr_ := Class(TSXml).ReadPprFormat(pNode);
|
||
|
||
rNode := class(TSXml).GetNode(stylesNode, 'w:docDefaults/w:rPrDefault');
|
||
if ifObj(rNode) then
|
||
defaultRpr_ := Class(TSXml).ReadRprFormat(rNode);
|
||
End;
|
||
End;
|
||
End;
|
||
|
||
///缺省样式
|
||
///styleType:样式类型(paragraph、character、table)
|
||
///返回:TDocxStyle对象
|
||
Function Default(styleType);
|
||
Begin
|
||
for k, obj in idMap_ do Begin
|
||
if obj.wType = styleType then Begin
|
||
v := obj.node_.GetAttribute('w:default');
|
||
if v <> '1' then
|
||
return obj;
|
||
End;
|
||
End
|
||
return nil;
|
||
End;
|
||
|
||
///返回指定名称的TDocxStyle
|
||
///name:样式名称
|
||
///返回:TDocxStyle对象
|
||
Function GetStyle(name);
|
||
Begin
|
||
return nameMap_[ class(TSXml).CurCodePageToUtf8(lowercase(name)) ];
|
||
End;
|
||
|
||
///返回指定StyleId名称的TDocxStyle
|
||
///id:StyleID号(数字ID号或名称字符串)
|
||
///返回:TDocxStyle对象
|
||
Function GetStyleById(id);
|
||
Begin
|
||
newid := ifnumber(id) ? tostring(id) : id;
|
||
return idMap_[ newid ];
|
||
End;
|
||
|
||
//返回全部LatentStyles对象列表
|
||
//返回:TDocxStyle对象列表
|
||
Function LatentStyles();
|
||
Begin
|
||
r := array();
|
||
node := stylesXml_.FirstChildElement('w:styles');
|
||
if ifObj(node) then
|
||
node := node.FirstChildElement('w:latentStyles');
|
||
if ifObj(node) then Begin
|
||
node := node.FirstChildElement('w:lsdException');
|
||
while ifObj(node) do Begin
|
||
o := TOfficeObj('TDocxStyle');
|
||
o.Init(node);
|
||
r[ length(r) ] := o;
|
||
node := node.NextElement('w:lsdException');
|
||
End;
|
||
End;
|
||
return r;
|
||
End;
|
||
|
||
///返回全部Styles对象列表
|
||
///返回:TDocxStyle对象列表
|
||
Function Styles();
|
||
Begin
|
||
return idMap_;
|
||
End;
|
||
|
||
///插入新的段落样式
|
||
///styleId:样式ID,可以是自定义名称
|
||
///xmlStr:InnerXml串
|
||
///返回:TDocxStyle对象
|
||
Function AddStyleByInnerXml(styleId, xmlStr);
|
||
Begin
|
||
if ifstring(styleId) and styleId <> '' then Begin
|
||
style := GetStyle(styleId);
|
||
if ifObj(style) then
|
||
return style;
|
||
node := stylesXml_.FirstChildElement('w:styles').InsertEndChild(xmlStr);
|
||
node.SetAttribute('w:styleId', styleId);
|
||
End
|
||
else Begin
|
||
node := stylesXml_.FirstChildElement('w:styles').InsertEndChild(xmlStr);
|
||
node.SetAttribute('w:styleId', maxStyleId_++);
|
||
End;
|
||
o := TOfficeObj('TDocxStyle');
|
||
o.Init(node);
|
||
_addStyle(o);
|
||
return o;
|
||
End;
|
||
|
||
///插入新的段落样式
|
||
///o:TDocxStyle对象
|
||
///StyleId:样式ID,可以是自定义名称
|
||
///返回:TDocxStyle对象
|
||
Function AddStyle(o, StyleId);
|
||
Begin
|
||
if ifObj(o) then Begin
|
||
if ifString(StyleId) and StyleId <> '' and not ifObj(idMap_[ StyleId ]) then
|
||
o.StyleId := StyleId;
|
||
else
|
||
o.StyleId := maxStyleId_++;
|
||
node := stylesXml_.FirstChildElement('w:styles').InsertEndChild(o.Marshal());
|
||
obj := TOfficeObj('TDocxStyle');
|
||
obj.Init(node);
|
||
_addStyle(obj);
|
||
return obj;
|
||
End;
|
||
return nil;
|
||
End;
|
||
|
||
///复制样式
|
||
///newstyle:样式节点TDocxStyle对象
|
||
///返回:TDocxStyle对象
|
||
Function CopyStyle(newstyle);
|
||
Begin
|
||
if ifObj(newstyle) and ifObj(newstyle.node_) then Begin
|
||
node := stylesXml_.FirstChildElement('w:styles').InsertEndChild(newstyle.node_.Marshal()[0]);
|
||
obj := TOfficeObj('TDocxStyle');
|
||
obj.StyleId := node.GetAttribute('w:styleId');
|
||
obj.Name := node.FirstChildElement('w:name').GetAttribute('w:val');
|
||
obj.Init(node);
|
||
_addStyle(obj);
|
||
return obj;
|
||
End;
|
||
return nil;
|
||
End;
|
||
|
||
///插入新的LatentStyle段落样式
|
||
///o:TDocxStyle对象
|
||
///返回:TDocxStyle对象
|
||
Function AddLatentStyle(o);
|
||
Begin
|
||
if ifObj(o) then Begin
|
||
latentStyles := stylesXml_.FirstChildElement('w:styles').InsertEndChild('w:latentStyles');
|
||
node := latentStyles.InsertEndChild('lsdException');
|
||
node.UnMarshal(o);
|
||
latentStyles.SetAttribute('w:count', length(LatentStyles()));
|
||
return node;
|
||
End;
|
||
return nil;
|
||
End;
|
||
|
||
///插入缺省的段落样式(Title、Heading1-9)
|
||
///返回:TDocxStyle对象
|
||
Function AddDefaultStyle(Name);
|
||
Begin
|
||
styleId := AnsiReplaceText(Name, ' ', '');
|
||
charId := StyleId + 'Char';
|
||
styleFname := 'wStyle/' + styleId + '.xml';
|
||
cStyleFname := 'wStyle/' + charId + '.xml';
|
||
xmlData := TOfficeTemplate(styleFname);
|
||
if ifnil(xmlData) then
|
||
return xmlData;
|
||
o := AddStyleByInnerXml(styleId, xmlData);
|
||
|
||
charStyle := idMap_[charId];
|
||
if not ifObj(charStyle) then Begin
|
||
xmlData := TOfficeTemplate(cStyleFname);
|
||
if ifstring(xmlData) then Begin
|
||
AddStyleByInnerXml(charId, xmlData);
|
||
End;
|
||
End;
|
||
return o;
|
||
End;
|
||
|
||
Function _addStyle(o);
|
||
Begin
|
||
idMap_[ o.StyleId ] := o;
|
||
nameMap_[ lowercase(o.Name) ] := o;
|
||
End;
|
||
|
||
defaultPpr_;
|
||
defaultRpr_;
|
||
private
|
||
docx_;
|
||
stylesXml_;
|
||
idMap_;
|
||
nameMap_;
|
||
maxStyleId_:integer;
|
||
End;
|