@@ -1,206 +1,207 @@
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:s tyleId ');
obj.Name := node.FirstChildElement('w:name'). GetAttribute('w:val ');
obj.Init(node );
_addStyle(obj );
return obj;
End ;
return nil ;
End ;
///插入新的LatentStyle段落样式
///o: TDocx Style对象
///返回 : TDocxStyle对象
Function AddLatent Style(o);
Begin
if ifObj(o) then Begin
latentStyles := stylesXml_.FirstChildElement('w:styles').InsertEndChild('w:latentStyles');
node := latentS tyles.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, ' ', '');
char Id := StyleId + 'Char' ;
styleFname := 'w Style/' + style Id + '.xml ';
cS tyleFname := 'wStyle/' + char Id + '.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;
name Map_[ lowercase(o.Name) ] := o;
End ;
defaultPpr_;
defaultR pr_;
private
[weakref]docx_;
stylesXml _;
idMap _;
name Map_;
maxStyleId_:integer ;
End ;
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]);
node.DeleteAttribute('w:default ');
obj := TOfficeObj('TDocxS tyle');
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;
///插入新的Latent Style段落样式
///o : TDocxStyle对象
///返回:TDocx Style对象
Function AddLatentStyle(o);
Begin
if ifObj(o) then Begin
latentStyles := stylesXml_.FirstChildElement('w:s tyles') .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
style Id := AnsiReplaceText(Name, ' ', '') ;
charId := StyleId + 'Char ';
s tyleFname := 'wStyle/' + style Id + '.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
id Map_[ o.StyleId ] := o;
nameMap_[ lowercase(o.Name) ] := o ;
End;
defaultP pr_;
defaultRpr_;
private
[weakref]docx _;
stylesXml _;
id Map_;
nameMap_ ;
maxStyleId_:integer ;
End;