宏_wps_宏修改word中所有excel表格的格式_设置字体对齐格式_删除空行等

需求:

将word中所有excel表格的格式进行统一化,修改其中的数字类型为"宋体, 五号,右对齐, 不加粗,不倾斜",其中的中文为"宋体, 五号, 不加粗,不倾斜"

数字类型有:范围型的比如 10-20, 百分比类型的 6%, 整型的 1, 5, 浮点型的 -124,430.00, 124,430.00

宏实现:

启用宏设置: 文件-》选项-》新建选项卡-》新建分组-》搜索开发工具命令,添加到新建分组

在界面中即可看到开发工具按钮,点击,即可看到宏的相关按钮:

输入一个宏的名字 ,点击创建 宏,然后,点击编辑 ,输入如下宏代码,点击运行即可

wps中默认使用JavaScript作为宏的默认语言,示例如下

javascript 复制代码
function FormatExcel() {

	// 匹配一个数值范围字符串 "10-12"  "10.3 -20.3 "   "-10.4 - 20" "-10.4--20.4" 
	// const rangeRegex = /^-?\d+(\.\d+)?( *)?-( *)?(-?\d+(\.\d+)?)( *)?.[\s\S]*$/;
    const rangeRegex = /^-?\d+(\.\d+)?( *)?-( *)?(-?\d+(\.\d+)?)( *)?([\s\S]*)?$/;
   
    var doc = Application.ActiveDocument;
    for (var tableIndex = 1; tableIndex <= doc.Tables.Count; tableIndex++) {
        var table = doc.Tables.Item(tableIndex);
        var rows = table.Rows.Count;
        var cols = table.Columns.Count;

        // 遍历表格
        for (var r = 1; r <= rows; r++) {
            for (var c = 1; c <= cols; c++) {
                if (r > table.Rows.Count || c > table.Columns.Count) {
                    continue;
                }
                
                //可选,跳过所有表格的第一列 //需求:属性列不需要修改
                if(c === 1){
                	continue;
                }
                
                try {
                	// console.log( "r,c = " + r +","+ c)
                    var cell = table.Cell(r, c); //合并单元格不能被这样访问所以try-catch下
	                var cellRange = cell.Range;
	                var textContent_src = cellRange.Text.replace(/[\r\n]/g, "");       // 去掉段落标记
	                textContent_src = textContent_src.replace(/[\x00-\x1F\x7F]/g, ''); // 去除BEL字符或其他不可见控制字符
	                console.log("textContent_src: [" + textContent_src +"]" + ", Chin?: " + containsChinese(textContent_src))              
	                	                	
	                if (!containsChinese(textContent_src)){	
	                    // 是数字:处理带逗号的数字,格式化并右对齐
	                    textContent = textContent_src.replace(/,/g, ""); // 去掉逗号
	                    textContent =  parseFloat(textContent)
	                    //console.log("toFloat:[" + parseFloat(textContent)+"]")
	                    if (!isNaN(textContent)) {
	                    	
	                    	// 去除前后的空格
	                    	textContent_src_trimmed = textContent_src.trim().trimEnd();

	                    	// such as "3%  ", "5%、7%  "
	                    	if (textContent_src_trimmed.includes('%')){
	                    		textContent_out = textContent_src_trimmed; 
	                    	}
	                    	// 范围数值,such as "12-20 ", "4.50-10.00 ", "-4.50 - -10.00"
	                    	else if (rangeRegex.test(textContent_src_trimmed)){
	                    		textContent_out = textContent_src_trimmed;
	                    	}
	                    	// 整型数值,such as " -5", "1 ", "  66  " //可以去除前后的空格
	                    	else if (!textContent_src.includes('.')){
	                    		textContent_out = textContent;
	                    	}
	                    	// 浮点数值,such as " 5.00 ", " -915,507.02 ", "915,507.02 "
	                    	else {
		                    	textContent_out =textContent.toLocaleString("en-US", {
		                            minimumFractionDigits: 2,
		                            maximumFractionDigits: 2
		                        });
	                    	}
	                    	
		                    cellRange.Text = textContent_out;
		                    cellRange.Font.Name = "宋体";
		                    cellRange.Font.Size = 10.5; //五号
		                    cellRange.ParagraphFormat.Alignment = wdAlignParagraphRight; //右对齐
		                    cellRange.Font.Italic = false; //不倾斜
		                    cellRange.Font.Bold = false;   //不加粗
	                    }
	                } else {
	                    // 含有中文的单元格,移除前面空格并居中//不支持移除后面的空格
	                    // textContent_src = textContent_src.trim(); //TBD
	                    cellRange.Text = textContent_src;
	                    cellRange.Font.Name = "宋体";
	                    cellRange.Font.Size = 10.5;    //五号
	                    cellRange.Font.Italic = false; //不倾斜
	                    cellRange.Font.Bold = false;   //不加粗
	                    // cellRange.ParagraphFormat.Alignment = wdAlignParagraphCenter;  //居中对齐
	                }
                } catch (error) {
                    // console.log('获取单元格时出错(可能是合并单元格/不处理):', error.message);
                }
            }
        }
    }
}

function containsChinese(str) {
    const chineseRegex = /[\u4e00-\u9fff]/;
    return chineseRegex.test(str);
}

效果:

右侧为原始数据,左侧为修改后的数据

进行空行的删除

接下来,进行空行的删除,若是没有合并行的单元格比较容易删除,使用

table.Rows.Item(rowsToDelete[l]).Delete();

先找到满足条件的需要删除的行,然后删除行,即可。

若是合并的行,则不能使用table.Rows.Item(rowsToDelete[l]).Delete();进行删除,需要使用cell一个一个删除:

table.Cell(rowsToDelete[l], c).Delete();

整体代码如下:

javascript 复制代码
function FormatExcelLZ() {

	// 匹配一个数值范围字符串 "10-12"  "10.3 -20.3 "   "-10.4 - 20" "-10.4--20.4" 
	// const rangeRegex = /^-?\d+(\.\d+)?( *)?-( *)?(-?\d+(\.\d+)?)( *)?.[\s\S]*$/;
    const rangeRegex = /^-?\d+(\.\d+)?( *)?-( *)?(-?\d+(\.\d+)?)( *)?([\s\S]*)?$/;

    var doc = Application.ActiveDocument;
    for (var tableIndex = 1; tableIndex <= doc.Tables.Count; tableIndex++) {
        var table = doc.Tables.Item(tableIndex);
        var rows = table.Rows.Count;
        var cols = table.Columns.Count;

		var rowsToDelete = [];
        // 遍历表格
        for (var r = 1; r <= rows; r++) {
        	
        	var shouldDeleteCounter = 0;
            for (var c = 1; c <= cols; c++) {
                if (r > table.Rows.Count || c > table.Columns.Count) {
                    continue;
                }
                
                //可选,跳过所有表格的第一列 //需求:属性列不需要修改
                if(c === 1){
                	continue;
                }
                
                try {
                	// console.log( "r,c = " + r +","+ c)
                    var cell = table.Cell(r, c); //合并单元格不能被这样访问所以try-catch下
	                var cellRange = cell.Range;
	                var textContent_src = cellRange.Text.replace(/[\r\n]/g, "");       // 去掉段落标记
	                textContent_src = textContent_src.replace(/[\x00-\x1F\x7F]/g, ''); // 去除BEL字符或其他不可见控制字符
	                console.log("textContent_src: [" + textContent_src +"]" + ", Chin?: " + containsChinese(textContent_src))              
    
		            cellText = textContent_src.trim().trimEnd();
		            console.log("cellText: [" + cellText + "]");
		            // 如果单元格内容不为空、不为0.00、不为"--",则该行不应删除
	                if (cellText === ""
	                	|| cellText === "0.00" || cellText === "0.0" || cellText === "0" 
	                	|| cellText === "--"|| cellText === "-"
	                	|| cellText === "------" || cellText === "---"
	                	|| cellText === "-") // 不同与字符 "-"
	                {
	                    shouldDeleteCounter += 1;
	                } 	         
	                	         
	                	                	
	                if (!containsChinese(textContent_src)){	
	                    // 是数字:处理带逗号的数字,格式化并右对齐
	                    textContent = textContent_src.replace(/,/g, ""); // 去掉逗号
	                    textContent =  parseFloat(textContent)
	                    //console.log("toFloat:[" + parseFloat(textContent)+"]")
	                    if (!isNaN(textContent)) {
	                    	
	                    	// 去除前后的空格
	                    	textContent_src_trimmed = textContent_src.trim().trimEnd();

	                    	// such as "3%  ", "5%、7%  "
	                    	if (textContent_src_trimmed.includes('%')){
	                    		textContent_out = textContent_src_trimmed; 
	                    	}
	                    	// 范围数值,such as "12-20 ", "4.50-10.00 ", "-4.50 - -10.00"
	                    	else if (rangeRegex.test(textContent_src_trimmed)){
	                    		textContent_out = textContent_src_trimmed;
	                    	}
	                    	// 整型数值,such as " -5", "1 ", "  66  " //可以去除前后的空格
	                    	else if (!textContent_src.includes('.')){
	                    		textContent_out = textContent;
	                    	}
	                    	// 浮点数值,such as " 5.00 ", " -915,507.02 ", "915,507.02 "
	                    	else {
		                    	textContent_out =textContent.toLocaleString("en-US", {
		                            minimumFractionDigits: 2,
		                            maximumFractionDigits: 2
		                        });
	                    	}
	                    	
		                    cellRange.Text = textContent_out;
		                    cellRange.Font.Name = "宋体";
		                    cellRange.Font.Size = 10.5; //五号
		                    cellRange.ParagraphFormat.Alignment = wdAlignParagraphRight; //右对齐
		                    cellRange.Font.Italic = false; //不倾斜
		                    cellRange.Font.Bold = false;   //不加粗
	                    }
	                } else {
	                    // 含有中文的单元格,移除前面空格并居中//不支持移除后面的空格
	                    // textContent_src = textContent_src.trim(); //TBD
	                    cellRange.Text = textContent_src;
	                    cellRange.Font.Name = "宋体";
	                    cellRange.Font.Size = 10.5;    //五号
	                    cellRange.Font.Italic = false; //不倾斜
	                    cellRange.Font.Bold = false;   //不加粗
	                    // cellRange.ParagraphFormat.Alignment = wdAlignParagraphCenter;  //居中对齐
	                }
                } catch (error) {
                    console.log('1获取单元格时出错(可能是合并单元格/不处理):', error.message);
                }
            }
            
            // 跳过了第一列,所以这里-1
            if (shouldDeleteCounter === cols -1 ) {
                rowsToDelete.push(r);
            }

        }
        // 从后往前删除行
	    for (var l = rowsToDelete.length - 1; l >= 0; l--) {
	    	try{
	           table.Rows.Item(rowsToDelete[l]).Delete();
	    	} 
	    	catch (error){
		    	console.log('无法通过table.Rows.Item访问行,可能因为有合并的行:', error.message);
		    	// 从后往前删除列元素
		    	for (var c = cols; c > 0; c--) {
		    		var cell_cur = table.Cell(rowsToDelete[l], c);
		            cell_cur.Delete();
		    	}
	    	}
	    }
    }
    console.log('======done=====');
}

function containsChinese(str) {
    const chineseRegex = /[\u4e00-\u9fff]/;
    return chineseRegex.test(str);
}

使用时,可以将 console.log行注释掉,提供处理速度,不注释也不影响功能。

删除空行效果:

没有合并行的删除:(为了方便检查,没有删除表头)

有合并行的删除:

相关网GPT网站:WPS 灵犀

相关推荐
CodeCraft Studio41 分钟前
国产化Word处理控件Spire.Doc教程:Python提取Word文档中的文本、图片、表格等
python·c#·word·国产化·spire.doc·word文档处理·文档开发控件
泉城老铁2 小时前
EasyPoi实现百万级数据导出的性能优化方案
java·后端·excel
泉城老铁3 小时前
Spring Boot 整合 EasyPoi 实现复杂多级表头 Excel 导出的完整方案
java·后端·excel
sql2008help3 小时前
数据分页异步后台导出excel
java·excel
小灰灰搞电子5 小时前
Qt 使用QtXlsx库处理Excel文件
qt·excel
爱编码的程序员5 小时前
python 处理json、excel、然后将内容转化为DSL语句,适用于数据处理(实用版)
人工智能·python·ai·json·excel·数据处理·dsl
ashcn20015 小时前
vim 组件 使用pysocket进行sock连接
python·vim·excel
家有狸花5 小时前
EXCEL删除数据透视表
excel
wtsolutions8 小时前
免费MCP: JSON 转 Excel MCP
json·excel·api·csv·mcp·wtsolutions
Hygge-star20 小时前
【Excel】利用函数和Power Query进行数据分析
数据挖掘·数据分析·excel