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