WPS Office JS宏实现批量处理Word中的标题和正文的样式

2023-12-13 03:38:09

? ? ? ? 该篇讲解下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

一、修改标题

1.1?Paragraphs 对象

? ? ? ? 在编写代码前,咱们先了解下Paragraphs对象的属性和方法。

方法:

名称说明
1Add返回一个 Paragraph 对象,该对象代表添加到文档中的新的空白段落。
2Indent为一个或多个段落增加一个级别的缩进。
3IndentFirstLineCharWidth将一个或多个段落的首行缩进指定的字符数。

属性:

名称说明
1AddSpaceBetweenFarEastAndAlpha如果 WPS 将自动在指定段落的日文和拉丁文文字之间添加空格,则该属性值为 True。如果仅对于某些指定段落将该属性设置为 True,则该属性会返回 wdUndefined。Long 类型,可读写。
2AddSpaceBetweenFarEastAndDigit如果 WPS 将自动在指定段落的日文文字和数字之间添加空格,则该属性值为 True。如果仅对于某些指定段落将该属性设置为 True,则该属性会返回 wdUndefined。Long 类型,可读写。
3Alignment?返回或设置一个 WdParagraphAlignment 常量,该常量代表指定段落的对齐方式,可读写。
4Application返回一个代表 WPS 应用程序的 Application 对象。
5AutoAdjustRightIndent如果 WPS 会根据您指定的每行字符数自动调整指定段落的右缩进,则该属性值为 True。如果只将某些指定段落的 AutoAdjustRightIndent 属性设置为 True,则该属性会返回 wdUndefined。Long 类型,可读写。
6BaseLineAlignment返回或设置一个 WdBaselineAlignment 常量,该常量代表行中字体的垂直位置,可读写。
7Borders返回一个 Borders 集合,该集合代表指定对象的所有边框。
8CharacterUnitFirstLineIndent返回或设置首行或悬挂缩进的值(以字符为单位)。用正值设置首行缩进,用负值设置悬挂缩进。Single 类型,可读写。
9CharacterUnitLeftIndent该属性返回或设置指定段落的左缩进量(以字符为单位)。Single 类型,可读写。
10CharacterUnitRightIndent该属性返回或设置指定段落的右缩进量(以字符为单位)。Single 类型,可读写。
11Count返回一个 Long 类型的值,该值代表集合中的段数。只读。
12Creator返回一个 32 位整数,该整数代表在其中创建特定对象的应用程序。只读 Long 类型。
13DisableLineHeightGrid如果该属性的值为 True,则当指定每页的行数时,WPS 会将指定段落中的字符与行网格对齐。如果只将某些指定段落的 DisableLineHeightGrid 属性设置为 True,则返回 wdUndefined。Long 类型,可读写。
14FarEastLineBreakControl如果为 True,则 WPS 会将东亚语言文字的换行规则应用于指定的段落。如果只将某些指定段落的 FarEastLineBreakControl 属性设定为 True,则返回 wdUndefined。Long 类型,可读写。
15First返回一个 Paragraph 对象,该对象代表在 Paragraphs 集合中的第一个项目。
16FirstLineIndent返回或设置首行缩进或悬挂缩进的大小(以磅值表示)。用正数设置首行缩进的尺寸,用负数设置悬挂缩进的尺寸。Single 类型,可读写。
17Format?返回或设置一个 ParagraphFormat 对象,该对象代表指定的一个或多个段落的格式。
18HalfWidthPunctuationOnTopOfLine如果为 True,则 WPS 会将指定段落行首的标点符号改为半角字符。如果仅将某些指定段落的该属性设置为 True,则此属性将返回 wdUndefined。Long 类型,可读写。
19HangingPunctuation?? ?如果为 True,则指定段落中的标点将可以溢出边界。如果仅将某些指定段落的该属性设置为 True,则返回 wdUndefined。Long 类型,可读写。
20Hyphenation如果指定的段落进行自动断字,则该属性值为 True。如果指定的段落不进行自动断字,则该属性值为 False。可读写 Long 类型。
21KeepTogether在 WPS 对文档重新分页时,如果指定段落中的所有行都位于同一页上,则该属性值为 True。可读写 Long 类型。
22KeepWithNext在 WPS 对文档重新分页时,如果指定段落与其下一段位于同一页上,则该属性值为 True。可读写 Long 类型。
23Last返回一个 Paragraph 对象,该对象代表段落集合中的最后一个项目。
24LeftIndent返回或设置一个 Single 类型的值,该值代表指定段落的左缩进值(以磅为单位)。可读写。
25LineSpacing返回或设置指定段落的行距(以磅为单位)。Single 类型,可读写。
26LineSpacingRule返回或设置指定段落的行距。可读写 WdLineSpacing 类型。
27LineUnitAfter返回或设置指定段落的段后间距(以网格线为单位)。可读写 Single 类型。
28LineUnitBefore返回或设置指定段落的段前间距(以网格线为单位)。可读写 Single 类型。
29NoLineNumber如果取消指定段的行号,则该属性值为 True。该属性值可以是 True、False 或 wdUndefined。可读写 Long 类型。
30OutlineLevel返回或设置指定段落的大纲级别。可读写 WdOutlineLevel 类型。
31PageBreakBefore如果在指定段落前插入了分页符,则该属性值为 True。该属性值可以是 True、False 或 wdUndefined。可读写 Long 类型。
32Parent返回一个 Object 类型值,该值代表指定 Paragraphs 对象的父对象。
33ReadingOrder返回或设置指定段落的读取次序而不改变其对齐方式。可读写 WdReadingOrder 类型。
34RightIndent返回或设置指定段落的右缩进量(以磅为单位)。可读写 Single 类型。
35Shading返回一个 Shading 对象,该对象代表指定段落的底纹格式。
36SpaceAfter返回或设置指定段落或文本栏后面的间距(以磅为单位)。可读/写 Single 类型。
37SpaceAfterAuto如果 WPS 自动设置指定段落的段后间距,则该属性为 True。可读/写 Long 类型。
38SpaceBefore返回或设置指定段落的段前间距(以磅为单位)。可读/写 Single 类型。
39SpaceBeforeAuto如果 WPS 自动设置指定段落的段前间距,则该属性为 True。可读/写 Long 类型。
40Style返回或设置指定段落的样式。可读写 Variant 类型。
41TabStops返回或设置一个 TabStops 集合,该集合代表指定段落中的所有自定义制表位。可读写。
42WidowControl在 WPS 对文档重新分页时,如果指定段落的首行和末行与段落的其他各行同页,则该属性值为 True。该属性值可以是 True、False 或 wdUndefined。可读写 Long 类型。
43WordWrap如果 WPS 在指定段落中的西文单词中间断字换行,则该属性值为 True。可读写 Long 类型。

1.2 获取内容段落数

? ? ? ? 上篇讲过表格获取数量是通过Count属性,这里同样是通过Count获取内容的段落数,代码如下:

/**
 * 修改标题和正文样式
 */
function 修改标题和正文样式(){
	console.log(ActiveDocument.Paragraphs.Count);
}

输出结果如下图:

1.3 获取段落样式

????????这里得到段落数后,我们则可以循环获取所有段落内容,并通过段落属性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);
	}
}

1.4 过滤出标题段落

? ? ? ? 现在通过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;
		}
	}
}

输出结果:

1.5 增加修改样式函数

? ? ? ? 这里增加一个修改样式的单独功能函数,这是因为减少代码冗余量,代码如下:

/**
 * 修改样式
 */
function editStyle(rangeObj, name, size){
	// 选择当前内容
	rangeObj.Select();
	// 设置字段样式
	(font => {
		font.Size = size;
		font.Name = name;
		font.Blod = true;
	})(Selection.Font);	
}

1.6 修改标题样式

? ? ? ? 前期准备工作做完后,现在则可以正式修改标题样式了,代码如下:

/**
 * 修改样式
 */
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;
		}
	}
}

运行结束后,标题和样式都根据代码中设定的样式,进行更新了,文档效果如下:

文章来源:https://blog.csdn.net/jiciqiang/article/details/134667010
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。