宏_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 灵犀

相关推荐
疯狂小羊啊1 小时前
WPS数据分析000008
数据分析·wps
浩浩kids1 小时前
WPS计算机二级•幻灯片的页面布局
wps
朴拙数科2 小时前
PDF2WORD万能方法,如何控制Adobe dc pro,自动实现PDF转word
adobe·pdf·word
朴拙数科6 小时前
pyautogui操控Acrobat DC pro万能PDF转Word,不丢任何PDF格式样式
pdf·c#·word
KpLn_HJL6 小时前
leetcode - 127. Word Ladder
leetcode·c#·word
测试199813 小时前
Pytest+Allure+Excel接口自动化测试框架实战
自动化测试·软件测试·python·测试工具·职场和发展·excel·pytest
lxlyhwl14 小时前
【Paper Tips】随记2-word版快速删除某字符
开发语言·word
唐棣棣19 小时前
【28】Word:石油化工设备技术❗
word·ms
斐夷所非19 小时前
Word 中实现方框内点击自动打 √ ☑
word
唐棣棣19 小时前
【29】Word:李楠-学术期刊❗
word·ms