在我们系统中,套红后的正文格式是不会按照模板里的正文格式来显示的,而是保留了之前在金格编辑框中编写的草稿格式,因此就产生了一个需求,就是套红后需要对草稿做跟模板正文格式一样的格式化处理,这个也符合正常逻辑。
格式化套红的思路主要是在要套红的模板里的正文前后加上开始和结束标签,然后再套红后选择开始和结束标签之间的文本,再进行格式化处理,有了这个思路就有两种做法:
1、手动在套红模板上为正文前后加上开始和结束标签。
2、程序自动处理,在加载了模板后开始套红前,自动找到模板正文的位置,并在正文前后的位置增加开始和结束标签。
然后程序再根据前后标签做套红操作,第一种手动在模板加前后标签的方法比较简单,但是对制作模板的人有要求,本着程序自动化处理的思路,减少运维成本,因此本文采取了第二种方式来进行正文格式化处理。
本套红处理总体的套红逻辑如下:
1、获取“正文”书签,如果有书签,则走第3步,没有则继续下一步骤。
2、没有“正文书签”的情况下,获取文档中的所有段落,并遍历每一段段落的文本,直到找到“正文”二字,并为包括该正文的段落增加名为 “正文”的书签。
3、在正文书签的上一行的末尾增加“开始”书签,在下一行的行头增加“结束”书签,便于后续的对开始-结束书签之间的正文做格式化处理。
4、在套红操作成功后,对开始到结束标签的文本进行格式化处理,此时的格式为套红替换前正文的格式。
经过测试支持wps2016专业版文档、word 2013文档, word 2010文档,在这本机安装着几种类型的文档的情况下能运行正常。测试的模板类型覆盖了如下几种:
l 正文在中间的,已将 “正文”加为书签的模板
l 正文在中间的,“正文”文字的模板
l 正文在尾行的,已将 “正文”加为书签的模板
l 正文在尾行的,“正文”文字的模板
l 正文在首行的, 已将 “正文”加为书签的模板
l 正文在首行的,“正文”文字的模板
虽然做了详尽的测试,但是经过分析后,可能还会存在如下风险:
1、若文档中的正文书签或者“正文”文本不是独占一行时,除了那行除了“正文”二字的文本外,当前行的其他文本会被要套红的正文替换,这是由金格的接口决定,看实际的模板中是否有正文不独占一行的情况。
2、如果要在模板里自行为“正文”二字设置书签,书签名必须为“正文”。若不设置书签,则在文档中的正文字样可以为“maintext”或“正文”,必须要规范用户正文书签名,若用户不按此规范来设置书签,则会出现套红失败现象。以下是打开套红模板逻辑,实际的参考官方api
var iWebOffice = document.all("textOffice");
iWebOffice.WebSetMsgByName("DOCINSTID","1111");
iWebOffice.WebSetMsgByName("DOCTYPE","TEMPLATE");
iWebOffice.WebSetMsgByName("TEMPLATEID",templateId);
iWebOffice.WebSetMsgByName("EXT",ext);
iWebOffice.WebSetMsgByName("COMMAND","INSERTFILE"); //设置变量COMMAND="INSERTFILE",在WebLoadTemplate()时,一起提交到OfficeServer中
加载模板后的逻辑,敲黑板,本文的重点
if (iWebOffice.WebLoadTemplate()){ //交互OfficeServer的OPTION="LOADTEMPLATE"
//不存在正文书签则查找是否有“正文”两字,有则添加书签,再插入文件
if(iWebOffice.WebGetBookMarks("正文")==null||iWebOffice.WebGetBookMarks("正文")==""){
try{
var Selection = iWebOffice.WebObject.Application.Selection;
var result=Selection.Find.Execute("正文");
if(!result){
Selection.Find.Execute("maintext");
}
iWebOffice.WebObject.Bookmarks.Add("正文");
} catch (e) {
alert("增加正文书签出错");
}
}else{
hasContentBookmark=true;
}
if(iWebOffice.WebGetBookMarks("正文")){//存在正文书签才插入文件
var BookmarkContent = iWebOffice.WebObject.Bookmarks("正文");
var font=BookmarkContent.Range.Font;
var fontResult=saveFont(font);
//在正文前后插入书签,做格式化正式使用
WebInsertBookmarks();
iWebOffice.WebSetMsgByName("FILEID",'<%=fileId%>');
iWebOffice.WebSetMsgByName("DOCINSTID",parent.getCurrWorkItemInfo("docInstId"));
iWebOffice.Language="CH";
if (iWebOffice.WebInsertFile()){ //填充公文正文 交互OfficeServer的OPTION="INSERTFILE"
//statusMsg("模板套红成功");
//格式化正文(by liuyd 20170824)
WebContentformatChange(fontResult);
return true;
}else{
//StatusMsg(iWebOffice.Status);
return false;
}
}else {}
}else{
//StatusMsg(iWebOffice.Status);
return false;
}
//为正文增加前后两个书签,用于格式化正文
function WebInsertBookmarks(){
var iWebOffice = document.all("textOffice");
var Selection = iWebOffice.WebObject.Application.Selection;
//在正文书签的上一行末尾增加开始标志书签
Selection.GoTo(-1,0,0,"正文");//定位到正文书签,-1值表示书签
Selection.StartOf(5);//移动到本行最开始处
Selection.InsertParagraphBefore();//在前面插入段落
Selection.StartOf(5);
iWebOffice.WebObject.Bookmarks.Add("exoaStartMark");//增加开始书签
//在正文书签的下一行行头插入结束标志书签
Selection.GoTo(-1,0,0,"正文");
Selection.EndOf(5);//移动到本行末尾处
Selection.InsertParagraphAfter();//在后面插入段落
Selection.GoTo(-1,0,0,"正文");
Selection.MoveDown(5,1);//往下移动一行,5表示移动的类型为行,1表示移动的单位数
Selection.StartOf(5);
iWebOffice.WebObject.Bookmarks.Add("exoaEndMark"); //增加一个名称为"End"的书签
//重新设定正文的书签(必须,经过上述对正文前后设置标签后,正文书签的区域已经与开始、结束书签关联,因此此时需要断掉联系,从新设置正文区域)
if(!hasContentBookmark){//如果模板已有正文书签,则不设置(兼容已为正文加了书签的模板)
iWebOffice.WebObject.Bookmarks("正文").Delete();
Selection.HomeKey(6);//定位到文档的开始处
var result=Selection.Find.Execute("正文");//在文档中寻找正文二字
if(!result){
Selection.Find.Execute("maintext");
}
iWebOffice.WebObject.Bookmarks.Add("正文");
}
}
//格式化正文
function WebContentformatChange(font){
var iWebOffice = document.all("textOffice");
var BookmarkStart;
try{
BookmarkStart = iWebOffice.WebObject.Bookmarks("exoaStartMark").Start;//如果开始书签没插入成功,则表明是属于正文在首行情况,直接选择正文
}catch(e){
BookmarkStart=0;
}
var BookmarkEnd = iWebOffice.WebObject.Bookmarks("exoaEndMark").End;
//选择从exoaStartMark到exoaEndMark的区域文本进行字体设置。
var Selection = iWebOffice.WebObject.Application.Selection;
Selection.SetRange(BookmarkStart, BookmarkEnd); //选择正文信息
setSelectFont(font);//设置字体
/* Selection.GoTo(-1,0,0,"exoaEndMark");
Selection.MoveUp(5);
Selection.EndOf(5);
Selection.MoveDown(5,2,1);
Selection.EndOf(5,1); */
//Selection.Delete();
//删除换行,为了兼容wps与word,采取此种写法
Selection.GoTo(-1,0,0,"exoaEndMark");
Selection.MoveUp(5,1);
Selection.Paragraphs(1).Range.Delete();
Selection.GoTo(-1,0,0,"exoaEndMark");
Selection.Paragraphs(1).Range.Delete();
//删除开始标志行
if(!hasContentBookmark){//如果模板已有正文书签,则不删除开始书签(兼容已为正文加了书签的模板)
Selection.GoTo(-1,0,0,"exoaStartMark");
Selection.Paragraphs(1).Range.Delete();
}
}
//保存正文的字体格式
function saveFont(font){
var fontResult={
NameFarEast :font.NameFarEast,
NameAscii :font.NameAscii,
NameOther : font.NameOther,
Name : font.Name,
Size : font.Size,
Bold : font.Bold,
Italic : font.Italic,
Underline : font.Underline,
UnderlineColor : font.UnderlineColor,
StrikeThrough :font.StrikeThrough,//删除线
DoubleStrikeThrough : font.DoubleStrikeThrough,//双删除线
Outline :font.Outline,//空心
Emboss :font.Emboss,//阳文
Shadow : font.Shadow,//阴影
Hidden : font.Hidden,//隐藏文字
SmallCaps : font.SmallCaps,//小型大写字母
AllCaps : font.AllCaps,//全部大写字母
Color : font.Color,
Engrave : font.Engrave,//阴文
Superscript : font.Superscript,//上标
Subscript : font.Subscript,//下标
Spacing : font.Spacing,//字符间距
Scaling : font.Scaling,//字符缩放
Position : font.Position,//位置
Kerning : font.Kerning,//字体间距调整
Animation : font.Animation,//文字效果
DisableCharacterSpaceGrid :font.DisableCharacterSpaceGrid,
EmphasisMark : font.EmphasisMark
}
return fontResult;
}
//设置字体格式
function setSelectFont(font){
var iWebOffice = document.all("textOffice");
//选择从exoaStartMark到exoaEndMark的区域文本进行字体设置。
var Selection = iWebOffice.WebObject.Application.Selection;
Selection.Font.NameFarEast =font.NameFarEast;
Selection.Font.NameAscii =font.NameAscii;
Selection.Font.NameOther = font.NameOther;
Selection.Font.Name = font.Name;
Selection.Font.Size = font.Size;
Selection.Font.Bold = font.Bold;
Selection.Font.Italic = font.Italic;
Selection.Font.Underline = font.Underline;
Selection.Font.UnderlineColor = font.UnderlineColor;
Selection.Font.StrikeThrough =font.StrikeThrough;//删除线
Selection.Font.DoubleStrikeThrough = font.DoubleStrikeThrough;//双删除线
Selection.Font.Outline =font.Outline;//空心
Selection.Font.Emboss =font.Emboss;//阳文
Selection.Font.Shadow = font.Shadow;//阴影
Selection.Font.Hidden = font.Hidden;//隐藏文字
Selection.Font.SmallCaps = font.SmallCaps;//小型大写字母
Selection.Font.AllCaps = font.AllCaps;//全部大写字母
Selection.Font.Color = font.Color;
Selection.Font.Engrave = font.Engrave;//阴文
Selection.Font.Superscript = font.Superscript;//上标
Selection.Font.Subscript = font.Subscript;//下标
Selection.Font.Spacing = font.Spacing;//字符间距
Selection.Font.Scaling = font.Scaling;//字符缩放
Selection.Font.Position = font.Position;//位置
Selection.Font.Kerning = font.Kerning;//字体间距调整
Selection.Font.Animation = font.Animation;//文字效果
Selection.Font.DisableCharacterSpaceGrid =font.DisableCharacterSpaceGrid;
Selection.Font.EmphasisMark = font.EmphasisMark;
}