该篇讲解下word文档中的标题和正文批量修改样式,如下图:
前面一篇已讲解了WPS Office宏编辑器操作方法,这里不细讲了,如有不清楚可以查看该篇:https://blog.csdn.net/jiciqiang/article/details/134653657?spm=1001.2014.3001.5501文章浏览阅读363次。WPS Office JS宏,实现Word表格样式批量修改。 由于本职工作原因,经常会用到office办公软件,经常很多内容审批后,需要统一修改内容或样式,如果Word文档中有上百页或上千页,则一个一个修改太麻烦了。在接触到WPSJS宏后,发现工作效率大大提升;如果你会前端开发,有JS基础上手会非常快;如果有VBA基础,就更得心应手了,因为对象和函数定义,基础是沿用office的VBA。其他不多说了,先和大家分享下如果统一修改表格样式。https://blog.csdn.net/jiciqiang/article/details/134653657?spm=1001.2014.3001.5501
在编写代码前,咱们先了解下Paragraphs对象的属性和方法。
方法:
名称 | 说明 | |
---|---|---|
1 | Add | 返回一个 Paragraph 对象,该对象代表添加到文档中的新的空白段落。 |
2 | Indent | 为一个或多个段落增加一个级别的缩进。 |
3 | IndentFirstLineCharWidth | 将一个或多个段落的首行缩进指定的字符数。 |
属性:
名称 | 说明 | |
---|---|---|
1 | AddSpaceBetweenFarEastAndAlpha | 如果 WPS 将自动在指定段落的日文和拉丁文文字之间添加空格,则该属性值为 True。如果仅对于某些指定段落将该属性设置为 True,则该属性会返回 wdUndefined。Long 类型,可读写。 |
2 | AddSpaceBetweenFarEastAndDigit | 如果 WPS 将自动在指定段落的日文文字和数字之间添加空格,则该属性值为 True。如果仅对于某些指定段落将该属性设置为 True,则该属性会返回 wdUndefined。Long 类型,可读写。 |
3 | Alignment | 返回或设置一个 WdParagraphAlignment 常量,该常量代表指定段落的对齐方式,可读写。 |
4 | Application | 返回一个代表 WPS 应用程序的 Application 对象。 |
5 | AutoAdjustRightIndent | 如果 WPS 会根据您指定的每行字符数自动调整指定段落的右缩进,则该属性值为 True。如果只将某些指定段落的 AutoAdjustRightIndent 属性设置为 True,则该属性会返回 wdUndefined。Long 类型,可读写。 |
6 | BaseLineAlignment | 返回或设置一个 WdBaselineAlignment 常量,该常量代表行中字体的垂直位置,可读写。 |
7 | Borders | 返回一个 Borders 集合,该集合代表指定对象的所有边框。 |
8 | CharacterUnitFirstLineIndent | 返回或设置首行或悬挂缩进的值(以字符为单位)。用正值设置首行缩进,用负值设置悬挂缩进。Single 类型,可读写。 |
9 | CharacterUnitLeftIndent | 该属性返回或设置指定段落的左缩进量(以字符为单位)。Single 类型,可读写。 |
10 | CharacterUnitRightIndent | 该属性返回或设置指定段落的右缩进量(以字符为单位)。Single 类型,可读写。 |
11 | Count | 返回一个 Long 类型的值,该值代表集合中的段数。只读。 |
12 | Creator | 返回一个 32 位整数,该整数代表在其中创建特定对象的应用程序。只读 Long 类型。 |
13 | DisableLineHeightGrid | 如果该属性的值为 True,则当指定每页的行数时,WPS 会将指定段落中的字符与行网格对齐。如果只将某些指定段落的 DisableLineHeightGrid 属性设置为 True,则返回 wdUndefined。Long 类型,可读写。 |
14 | FarEastLineBreakControl | 如果为 True,则 WPS 会将东亚语言文字的换行规则应用于指定的段落。如果只将某些指定段落的 FarEastLineBreakControl 属性设定为 True,则返回 wdUndefined。Long 类型,可读写。 |
15 | First | 返回一个 Paragraph 对象,该对象代表在 Paragraphs 集合中的第一个项目。 |
16 | FirstLineIndent | 返回或设置首行缩进或悬挂缩进的大小(以磅值表示)。用正数设置首行缩进的尺寸,用负数设置悬挂缩进的尺寸。Single 类型,可读写。 |
17 | Format | 返回或设置一个 ParagraphFormat 对象,该对象代表指定的一个或多个段落的格式。 |
18 | HalfWidthPunctuationOnTopOfLine | 如果为 True,则 WPS 会将指定段落行首的标点符号改为半角字符。如果仅将某些指定段落的该属性设置为 True,则此属性将返回 wdUndefined。Long 类型,可读写。 |
19 | HangingPunctuation | 如果为 True,则指定段落中的标点将可以溢出边界。如果仅将某些指定段落的该属性设置为 True,则返回 wdUndefined。Long 类型,可读写。 |
20 | Hyphenation | 如果指定的段落进行自动断字,则该属性值为 True。如果指定的段落不进行自动断字,则该属性值为 False。可读写 Long 类型。 |
21 | KeepTogether | 在 WPS 对文档重新分页时,如果指定段落中的所有行都位于同一页上,则该属性值为 True。可读写 Long 类型。 |
22 | KeepWithNext | 在 WPS 对文档重新分页时,如果指定段落与其下一段位于同一页上,则该属性值为 True。可读写 Long 类型。 |
23 | Last | 返回一个 Paragraph 对象,该对象代表段落集合中的最后一个项目。 |
24 | LeftIndent | 返回或设置一个 Single 类型的值,该值代表指定段落的左缩进值(以磅为单位)。可读写。 |
25 | LineSpacing | 返回或设置指定段落的行距(以磅为单位)。Single 类型,可读写。 |
26 | LineSpacingRule | 返回或设置指定段落的行距。可读写 WdLineSpacing 类型。 |
27 | LineUnitAfter | 返回或设置指定段落的段后间距(以网格线为单位)。可读写 Single 类型。 |
28 | LineUnitBefore | 返回或设置指定段落的段前间距(以网格线为单位)。可读写 Single 类型。 |
29 | NoLineNumber | 如果取消指定段的行号,则该属性值为 True。该属性值可以是 True、False 或 wdUndefined。可读写 Long 类型。 |
30 | OutlineLevel | 返回或设置指定段落的大纲级别。可读写 WdOutlineLevel 类型。 |
31 | PageBreakBefore | 如果在指定段落前插入了分页符,则该属性值为 True。该属性值可以是 True、False 或 wdUndefined。可读写 Long 类型。 |
32 | Parent | 返回一个 Object 类型值,该值代表指定 Paragraphs 对象的父对象。 |
33 | ReadingOrder | 返回或设置指定段落的读取次序而不改变其对齐方式。可读写 WdReadingOrder 类型。 |
34 | RightIndent | 返回或设置指定段落的右缩进量(以磅为单位)。可读写 Single 类型。 |
35 | Shading | 返回一个 Shading 对象,该对象代表指定段落的底纹格式。 |
36 | SpaceAfter | 返回或设置指定段落或文本栏后面的间距(以磅为单位)。可读/写 Single 类型。 |
37 | SpaceAfterAuto | 如果 WPS 自动设置指定段落的段后间距,则该属性为 True。可读/写 Long 类型。 |
38 | SpaceBefore | 返回或设置指定段落的段前间距(以磅为单位)。可读/写 Single 类型。 |
39 | SpaceBeforeAuto | 如果 WPS 自动设置指定段落的段前间距,则该属性为 True。可读/写 Long 类型。 |
40 | Style | 返回或设置指定段落的样式。可读写 Variant 类型。 |
41 | TabStops | 返回或设置一个 TabStops 集合,该集合代表指定段落中的所有自定义制表位。可读写。 |
42 | WidowControl | 在 WPS 对文档重新分页时,如果指定段落的首行和末行与段落的其他各行同页,则该属性值为 True。该属性值可以是 True、False 或 wdUndefined。可读写 Long 类型。 |
43 | WordWrap | 如果 WPS 在指定段落中的西文单词中间断字换行,则该属性值为 True。可读写 Long 类型。 |
上篇讲过表格获取数量是通过Count属性,这里同样是通过Count获取内容的段落数,代码如下:
/**
* 修改标题和正文样式
*/
function 修改标题和正文样式(){
console.log(ActiveDocument.Paragraphs.Count);
}
输出结果如下图:
这里得到段落数后,我们则可以循环获取所有段落内容,并通过段落属性Style判断出标题部分,进行样式调整。代码如下:
/**
* 修改标题和正文样式
*/
function 修改标题和正文样式(){
// 循环获取段落信息
for(var i = 1; i <= ActiveDocument.Paragraphs.Count; i++){
// 获取每个段落范围的内容
var rangeObj = ActiveDocument.Paragraphs.Item(i).Range;
//
console.log(rangeObj.Style.toString());
}
}
输出结果:
如上图所示,很容易判断出哪些范围为标题,哪些为正文。当然,有时会出现返回样式值为空情况,这里则需要做下容错处理,代码如下:
/**
* 修改标题和正文样式
*/
function 修改标题和正文样式(){
// 循环获取段落信息
for(var i = 1; i <= ActiveDocument.Paragraphs.Count; i++){
// 获取每个段落范围的内容
var rangeObj = ActiveDocument.Paragraphs.Item(i).Range;
// 获取范围样式
var styleName = rangeObj.Style;
// 如果样式返回结果为空,则继续循环下一个
if(!styleName) continue;
styleName = styleName.toString();
console.log(styleName);
}
}
现在通过switch来过滤出对应的标题段落内容,另外不同文档中标题样式名不一定叫“标题 1”、“标题 2” 等,根据分析出的数据,作对应调整即可。这里只到2级标题,所以不作过深层次筛选,代码如下:
/**
* 修改标题和正文样式
*/
function 修改标题和正文样式(){
// 循环获取段落信息
for(var i = 1; i <= ActiveDocument.Paragraphs.Count; i++){
// 获取每个段落范围的内容
var rangeObj = ActiveDocument.Paragraphs.Item(i).Range;
// 获取范围样式
var styleName = rangeObj.Style;
// 如果样式返回结果为空,则继续循环下一个
if(!styleName) continue;
styleName = styleName.toString();
// 过滤出标题段落
switch(styleName){
case '标题 1':
console.log(styleName);
break;
case '标题 2':
console.log(styleName);
break;
case '标题 3':
console.log(styleName);
break;
}
}
}
输出结果:
这里增加一个修改样式的单独功能函数,这是因为减少代码冗余量,代码如下:
/**
* 修改样式
*/
function editStyle(rangeObj, name, size){
// 选择当前内容
rangeObj.Select();
// 设置字段样式
(font => {
font.Size = size;
font.Name = name;
font.Blod = true;
})(Selection.Font);
}
前期准备工作做完后,现在则可以正式修改标题样式了,代码如下:
/**
* 修改样式
*/
function editStyle(rangeObj, name, size){
// 选择当前内容
rangeObj.Select();
// 设置字段样式
(font => {
font.Size = size;
font.Name = name;
font.Blod = true;
})(Selection.Font);
}
/**
* 修改标题和正文样式
*/
function 修改标题和正文样式(){
// 循环获取段落信息
for(var i = 1; i <= ActiveDocument.Paragraphs.Count; i++){
// 获取每个段落范围的内容
var rangeObj = ActiveDocument.Paragraphs.Item(i).Range;
// 获取范围样式
var styleName = rangeObj.Style;
// 如果样式返回结果为空,则继续循环下一个
if(!styleName) continue;
//
styleName = styleName.toString();
// 过滤出标题段落
switch(styleName){
case '标题 1':
editStyle(rangeObj, "黑体", 16);
break;
case '标题 2':
editStyle(rangeObj, "楷体", 16);
break;
case '标题 3':
editStyle(rangeObj, "仿宋", 14);
break;
}
}
}
点击运行宏,如下图:
运行结束后,查看文档,则标题根据设置样式修改完成了,如下图:
这里细心朋友可能就发现了,修改“正文”内容就很简单了,直接在switch中增加一个case判断即可,代码如下:
/**
* 修改标题和正文样式
*/
function 修改标题和正文样式(){
// 循环获取段落信息
for(var i = 1; i <= ActiveDocument.Paragraphs.Count; i++){
// 获取每个段落范围的内容
var rangeObj = ActiveDocument.Paragraphs.Item(i).Range;
// 获取范围样式
var styleName = rangeObj.Style;
// 如果样式返回结果为空,则继续循环下一个
if(!styleName) continue;
//
styleName = styleName.toString();
// 过滤出标题段落
switch(styleName){
case '标题 1':
editStyle(rangeObj, "黑体", 16);
break;
case '标题 2':
editStyle(rangeObj, "楷体", 16);
break;
case '标题 3':
editStyle(rangeObj, "仿宋", 14);
break;
case '正文':
editStyle(rangeObj, "宋体", 12);
break;
}
}
}
运行结束后,标题和样式都根据代码中设定的样式,进行更新了,文档效果如下: