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

需求:

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

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

宏实现:

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

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

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

wps中默认使用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(); //TBDcellRange.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();

整体代码如下:

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(); //TBDcellRange.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);}}// 跳过了第一列,所以这里-1if (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 灵犀

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/69236.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ServletOutputStream failed to write: Broken pipe

案发现场 问题&#xff1a; org.springframework.web.context.request.async.AsyncRequestNotUsableException: ServletOutputStream failed to write: Broken pipe org.springframework.web.context.request.async.AsyncRequestNotUsableException: ServletOutputStream …

CNN-BiLSTM卷积双向长短期记忆神经网络时间序列预测(Matlab完整源码和数据)

CNN-BiLSTM卷积双向长短期记忆神经网络时间序列预测&#xff08;Matlab完整源码和数据&#xff09; 目录 CNN-BiLSTM卷积双向长短期记忆神经网络时间序列预测&#xff08;Matlab完整源码和数据&#xff09;预测效果基本介绍 CNN-BiLSTM卷积双向长短期记忆神经网络时间序列预测一…

14-6-2C++STL的list

(一&#xff09;list对象的带参数构造 1.list&#xff08;elem);//构造函数将n个elem拷贝给本身 #include <iostream> #include <list> using namespace std; int main() { list<int> lst(3,7); list<int>::iterator it; for(itlst.begi…

Docker 系列之 docker-compose 容器编排详解

文章目录 前言一、Docker-compose简介二、Docker-compose 的安装三、Docker-compose卸载四、Docker-compose常用命令4.1 Docker-compose命令格式4.2 docker-compose up4.3 docker-compose ps4.4 docker-compose stop4.5 docker-compose -h4.6 docker-compose down4.7 docker-co…

React第二十五章(受控组件/非受控组件)

React 受控组件理解和应用 React 受控组件 受控组件一般是指表单元素&#xff0c;表单的数据由React的 State 管理&#xff0c;更新数据时&#xff0c;需要手动调用setState()方法&#xff0c;更新数据。因为React没有类似于Vue的v-model&#xff0c;所以需要自己实现绑定事件…

转换算术表达式

文章目录 构造二叉树表示的算术表达式&#xff1a;按先序次序输入二叉树中结点的值(操作数及运算符均以一位字符表示&#xff0c;注意转换)&#xff0c; #字符表示空树&#xff0c;如上图的算术表达式 输入2##*3##4## 输入格式 第一行输入表示要计算的算术表达式的二叉树结点的…

[b01lers2020]Life on Mars1

打开题目页面如下 看了旁边的链接&#xff0c;也没有什么注入点&#xff0c;是正常的科普 利用burp suite抓包&#xff0c;发现传参 访问一下 http://5edaec92-dd87-4fec-b0e3-501ff24d3650.node5.buuoj.cn:81/query?searchtharsis_rise 接下来进行sql注入 方法一&#xf…

Linux的udev详解、安装和使用(dev下的设备每次开机的名称不固定怎么办?)

前言&#xff08;问题与需求&#xff09;&#xff1a; 在传统的devfs 1&#xff1a;设备映射的不确定&#xff1a;一个设备多次加载设备的设备文件可能不同&#xff0c;比如一个hub有可能是ttyUSB0或ttyUSB2或ttyUSB3 2&#xff1a;devfs没有足够的主辅设备号&#xff0c;当设…

Linux 内核中的 InfiniBand 核心模块:drivers/infiniband/core/device.c 分析

InfiniBand 是一种高性能、低延迟的网络互连技术,广泛应用于高性能计算(HPC)、数据中心和云计算等领域。Linux 内核中的 InfiniBand 子系统提供了对 InfiniBand 设备的支持,而 drivers/infiniband/core/device.c 文件则是 InfiniBand 核心模块的重要组成部分。本文将对 dev…

如何快速开发LabVIEW项目,成为LabVIEW开发的高手

发现了一篇多年前写的文章&#xff0c;转发到这里 如何快速开发LabVIEW项目&#xff0c;成为LabVIEW开发的高手。 如果您手里有LabVIEW项目&#xff0c;领导催的又很紧&#xff0c;该怎么办&#xff1f; 如果您公司规模小&#xff0c;就想把LabVIEW项目快速搞定&#xff0c;有什…

Zookeeper(27)Zookeeper的CAP理论是什么?

CAP 理论&#xff0c;又称为 Brewer 定理&#xff0c;是分布式系统设计中的一个基本定理。CAP 代表一致性&#xff08;Consistency&#xff09;、可用性&#xff08;Availability&#xff09;和分区容忍性&#xff08;Partition Tolerance&#xff09;。该理论指出&#xff0c;…

CodeForces 611:New Year and Domino ← 二维前缀和

【题目来源】 https://codeforces.com/contest/611/problem/C 【题目描述】 They say "years are like dominoes, tumbling one after the other". But would a year fit into a grid? I dont think so. Limak is a little polar bear who loves to play. He has r…

数组

数组 栈区的空间很有限&#xff0c;静态区的空间大些&#xff0c;一般在静态区去申请较大的空间 考虑特例能不能归并到一起也很重要 在二维数组中&#xff0c;基于范围的 for 循环直接遍历的是行&#xff0c;而不是单个元素 对于一个 int arr[3][4] 的二维数组&#xff0c; m…

网易Android开发面试题200道及参考答案 (下)

说明原码、反码、补码的概念 原码:是一种简单的机器数表示法。对于有符号数,最高位为符号位,0 表示正数,1 表示负数,其余位表示数值的绝对值。比如,对于 8 位二进制数,+5 的原码是 00000101,-5 的原码是 10000101。原码的优点是直观,容易理解,但在进行加减法运算时,…

K8S中的数据存储之基本存储

基本存储类型 EmptyDir 描述&#xff1a;当 Pod 被调度到节点上时&#xff0c;Kubernetes 会为 Pod 创建一个空目录&#xff0c;所有在该 Pod 中的容器都可以访问这个目录。特点&#xff1a; 生命周期与 Pod 绑定&#xff0c;Pod 删除时&#xff0c;数据也会丢失。适用于临时…

如何移植ftp服务器到arm板子?

很多厂家提供的sdk&#xff0c;一般都不自带ftp服务器功能&#xff0c; 需要要发人员自己移植ftp服务器程序。 本文手把手教大家如何移植ftp server到arm板子。 环境 sdk&#xff1a;复旦微 Buildroot 2018.02.31. 解压 $ mkdir ~/vsftpd $ cp vsftpd-3.0.2.tar.gz ~/vs…

Alfresco Content Services docker自动化部署操作

Alfresco Content Services docker部署文档 前提条件 在开始之前&#xff0c;需要确保已经安装了 Docker 和 Docker Compose。Docker 用于创建和管理容器&#xff0c;Docker Compose 则用于定义和运行多容器的 Docker 应用。 步骤 1. 创建目录结构 首先&#xff0c;创建一个…

计算机网络 (61)移动IP

前言 移动IP&#xff08;Mobile IP&#xff09;是由Internet工程任务小组&#xff08;Internet Engineering Task Force&#xff0c;IETF&#xff09;提出的一个协议&#xff0c;旨在解决移动设备在不同网络间切换时的通信问题&#xff0c;确保移动设备可以在离开原有网络或子网…

二十三种设计模式-桥接模式

桥接模式&#xff08;Bridge Pattern&#xff09;是一种结构型设计模式&#xff0c;其核心思想是将抽象与实现解耦&#xff0c;让它们可以独立变化。桥接模式主要用于解决类的继承问题&#xff0c;避免由于继承而带来的类层次结构过于复杂和难以维护的问题。 1. 核心概念 桥接…

什么是Pytest Fixtures作用域及如何为Pytest Fixtures设置合适的作用域

关注开源优测不迷路 大数据测试过程、策略及挑战 测试框架原理&#xff0c;构建成功的基石 在自动化测试工作之前&#xff0c;你应该知道的10条建议 在自动化测试中&#xff0c;重要的不是工具 编写重复代码很可能是你最不乐意做的事情之一。至少对我来说是这样。 在一个全力追…