WPS Office JS宏实现Excel转换为JSON格式数据

        通过Excel JS宏,将表格中的数据以”列“形式导出为JSON数据格式。

        我们在整理文档时,产品会通过Excel将功能点和功能描述分层级整理出来,有时需要将此数据导入到系统中,Web端对Json这类数据比较友好,所以这里试着使用Excel JS宏将数据导出为JSON数据。

图1-1 

        如上图,我们将此信息生成为树结构的JSON数据格式的文本文件。

一、宏创建

1.1 定义宏

        首先,打开Excel中的宏编辑器,在模块中定义宏,代码如下:

/**
 * 创建将Excel数据转换为JSON格式的数据宏
 */
function 数据转换为JSON数据(){
	
}

        如果对JS宏还不了解朋友,或不知道在哪创建宏的,可以看下前面写的一篇,地址:

WPS Office JS宏实现批量处理Word中的表格样式-CSDN博客

1.2 获取内容

       Sheets 对象指定的或活动工作簿中所有工作表的集合。Sheets 集合可以包含 Chart 或 Worksheet 对象。使用 Sheets(index)(其中 index 是工作表名称或索引号)可返回一个 Chart 或 Worksheet 对象。

        所以通过Sheets对象获取Sheet 1中的数据内容,UsedRange返回一个 Range 对象,该对象表示指定工作表上所使用的区域。代码如下:

/**
 * 创建将Excel数据转换为JSON格式的数据宏
 */
function 数据转换为JSON数据(){
	// 获取Sheet 1内容
	let wbContent = Sheets("Sheet1").UsedRange;
    
}

        Sheets()可以使用ThisWorkbook.Sheets()调用,这里可以省略ThisWorkbook。

1.3 获取行数据  

        图1-1中,每列对应一个字段,所以在读取数据时,我们需要一行一行读取,读取每行数据后,再通过列关联上对应数据。

        这里将通过Rows对象获取到每行数据集,以及通过Cells获取每行中对应列的单元格数据,代码如下:

/**
 * 创建将Excel数据转换为JSON格式的数据宏
 */
function 数据转换为JSON数据(){
	// 获取Sheet 1内容
	let wbContent = Sheets("Sheet1").UsedRange;
	// 获取所有行数据
	let dataRows = wbContent.Rows;
	// 定义变量存储json数据
	let JsonData = [];
	// 循环输出数据
	for(let rows of dataRows){
		// 循环出每列数据
		for(let column of rows.Cells){
			console.log('column', column.Column, column.Text);
		}
	}
}

        如上代码执行后,获取结果如下图:

1.4 组装数据

        数据获取到后,如何将数据组装成JSON格式树状数据,需要通过一些简单逻辑判断即可,由1.3中输出结果可以看出,第1、2两列会出现空数据,所以由此可以判断出对应的一级和二级数据,代码如下:

/**
 * 创建将Excel数据转换为JSON格式的数据宏
 */
function 数据转换为JSON数据(){
	// 获取Sheet 1内容
	let wbContent = Sheets("Sheet1").UsedRange;
	// 获取所有行数据
	let dataRows = wbContent.Rows;
	// 定义变量存储json数据
	let JsonData = [];
	// 存储索引
	let JsonFirstIndex = -1,		//一级目录
		JsonSecondIndex = -1;		//二级目录
	// 循环输出数据
	for(let rows of dataRows){
		// 循环出每列数据
		for(let column of rows.Cells){
			switch(column.Column){
				// 列1
				case 1: 
					// 判断是否为一级栏目,并且文本不为空创建对象
					if(column.Text){
						JsonFirstIndex++;
						// 创建一级对象
						JsonData[JsonFirstIndex] = {
							name: column.Text,
							children: []
						};
					}
					break;
				// 列2
				case 2: 
					// 判断是否为二级栏目,并且文本不为空创建对象
					if(column.Text){
						let secondArr = JsonData[JsonFirstIndex]['children'];
						// 如果一级children为数组,则自递索引,新增二级数据
						if(Array.isArray(secondArr)){
							JsonSecondIndex++;
							secondArr[JsonSecondIndex] = {
								name: column.Text,
								children: []
							}
						}
					}
					break;
				// 列3
				case 3: 
					let threeArr = JsonData[JsonFirstIndex].children[JsonSecondIndex]['children'];
					// 如果二级children为数组,则追加数据,列3为末级功能,列4为功能描述,都在此组装
					if(Array.isArray(threeArr)){
						threeArr.push({
							name: rows.Cells.Item(3).Text,
							description: rows.Cells.Item(4).Text
						});
					}
					break;
			}
		}
	}
	
	console.log(JSON.stringify(JsonData));
}

        此时,Json数据则组装完成了,输出后结果如下:

二、输出Json数据

2.1 JSON.stringify()

语法:JSON.stringify(value, replacer , space)

属性

名称描述
value将要序列化成 一个JSON 字符串的值。
replace(可选)如果该参数是一个函数,则在序列化过程中,被序列化的值的每个属性都会经过该函数的转换和处理;如果该参数是一个数组,则只有包含在这个数组中的属性名才会被序列化到最终的 JSON 字符串中;如果该参数为null或者未提供,则对象所有的属性都会被序列化。
space(可选)指定缩进用的空白字符串,用于美化输出(pretty-print);如果参数是个数字,它代表有多少的空格;上限为10。该值若小于1,则意味着没有空格;如果该参数为字符串(字符串的前十个字母),该字符串将被作为空格;如果该参数没有提供(或者为null)将没有空格。

2.2 输出序列化json数据

/**
 * 创建将Excel数据转换为JSON格式的数据宏
 */
function 数据转换为JSON数据(){
	// 获取Sheet 1内容
	let wbContent = Sheets("Sheet1").UsedRange;
	// 获取所有行数据
	let dataRows = wbContent.Rows;
	// 定义变量存储json数据
	let JsonData = [];
	// 存储索引
	let JsonFirstIndex = -1,		//一级目录
		JsonSecondIndex = -1;		//二级目录
	// 循环输出数据
	for(let rows of dataRows){
		// 循环出每列数据
		for(let column of rows.Cells){
			switch(column.Column){
				// 列1
				case 1: 
					// 判断是否为一级栏目,并且文本不为空创建对象
					if(column.Text){
						JsonFirstIndex++;
						// 创建一级对象
						JsonData[JsonFirstIndex] = {
							name: column.Text,
							children: []
						};
					}
					break;
				// 列2
				case 2: 
					// 判断是否为二级栏目,并且文本不为空创建对象
					if(column.Text){
						let secondArr = JsonData[JsonFirstIndex]['children'];
						// 如果一级children为数组,则自递索引,新增二级数据
						if(Array.isArray(secondArr)){
							JsonSecondIndex++;
							secondArr[JsonSecondIndex] = {
								name: column.Text,
								children: []
							}
						}
					}
					break;
				// 列3
				case 3: 
					let threeArr = JsonData[JsonFirstIndex].children[JsonSecondIndex]['children'];
					// 如果二级children为数组,则追加数据,列3为末级功能,列4为功能描述,都在此组装
					if(Array.isArray(threeArr)){
						threeArr.push({
							name: rows.Cells.Item(3).Text,
							description: rows.Cells.Item(4).Text
						});
					}
					break;
			}
		}
	}
	
	// 将数据转换为JSON格式字符串
	let jsonStringData = JSON.stringify(JsonData, null, 2);
	console.log(jsonStringData);
}

通过JSON.stringify()将json数据进行序列化后,并缩进2位显得更为美观,输出结果如下图:

2.3 保存json数据

        从数据的读取,分析,以及json数据组装工作已完成,现在咱们则将最终的数据导出为json格式文件,代码如下:

/**
 * 创建将Excel数据转换为JSON格式的数据宏
 */
function 数据转换为JSON数据(){
	// 获取Sheet 1内容
	let wbContent = Sheets("Sheet1").UsedRange;
	// 获取所有行数据
	let dataRows = wbContent.Rows;
	// 定义变量存储json数据
	let JsonData = [];
	// 存储索引
	let JsonFirstIndex = -1,		//一级目录
		JsonSecondIndex = -1;		//二级目录
	// 循环输出数据
	for(let rows of dataRows){
		// 循环出每列数据
		for(let column of rows.Cells){
			switch(column.Column){
				// 列1
				case 1: 
					// 判断是否为一级栏目,并且文本不为空创建对象
					if(column.Text){
						JsonFirstIndex++;
						// 创建一级对象
						JsonData[JsonFirstIndex] = {
							name: column.Text,
							children: []
						};
					}
					break;
				// 列2
				case 2: 
					// 判断是否为二级栏目,并且文本不为空创建对象
					if(column.Text){
						let secondArr = JsonData[JsonFirstIndex]['children'];
						// 如果一级children为数组,则自递索引,新增二级数据
						if(Array.isArray(secondArr)){
							JsonSecondIndex++;
							secondArr[JsonSecondIndex] = {
								name: column.Text,
								children: []
							}
						}
					}
					break;
				// 列3
				case 3: 
					let threeArr = JsonData[JsonFirstIndex].children[JsonSecondIndex]['children'];
					// 如果二级children为数组,则追加数据,列3为末级功能,列4为功能描述,都在此组装
					if(Array.isArray(threeArr)){
						threeArr.push({
							name: rows.Cells.Item(3).Text,
							description: rows.Cells.Item(4).Text
						});
					}
					break;
			}
		}
	}
	
	// 将数据转换为JSON格式字符串
	let jsonStringData = JSON.stringify(JsonData, null, 2);

	// 创建新的工作簿并保存为JSON文件
	let filePath = "D:\\workspace\\work\\office-study\\data\\data.json";
	
	// 将JSON数据写入文件
	// 打开文件
	Open(filePath, '#1', jsOutput, jsWrite, jsLockWrite, jsonStringData.length*2);
	// 写入数据
	Write('#1', jsonStringData);
	// 关闭流
	Close('#1');
	// 提示
	MsgBox("数据保存成功~", jsInformation, "提示");
}

        此时点击运行按钮,则文件保存到filePath指定的位置了,如下图:

        data.json内容如下图:

        细心朋友此时会发现导出的json数据开头和结尾,会多出一个双引号。这里查了下VBA文档:

  • Write #和 Input #旨在与“结构化”文件 (.csv) 一起使用,并使用文本限定数据 - 任何 String或 Variant带有字符串子类型的双引号转义为 "" , 整个事情都用引号括起来。
  • Print #和 Input(number, #filenumber)旨在与“非结构化”文件一起使用。

        在WPS中没找到Print对象,这里就先手动删除,有朋友在WPS发现有和Print对象一样功能的,欢迎留言告知。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Android】在Android上使用mlKit构建人脸检测程序

在Android上构建人脸检测程序 目录 1、导入mlKit依赖包2、配置人脸检测器并且获取人脸检测器3、加载图片资源4、调用人脸检测器5、绘制矩形边框6、完整代码7、效果展示 1、导入mlKit依赖包 dependencies {// ...// Use this dependency to bundle the model with your appi…

用23种设计模式打造一个cocos creator的游戏框架----(十七)命令模式

1、模式标准 模式名称:命令模式 模式分类:行为型 模式意图:将一个请求封装为一个对象,从而使得可以用不同的请求对客户进行参数化:对请求排队或记录请求日志,以及支持可撤销的操作。 结构图: 适用于&am…

DS冲刺整理做题定理(四)查找与排序

最后一期更新,考试之前应该不会再出该专题了,之后有时间会出一些有关链表的代码题,其他章节只挑选重点的总结~ 一.查找 1.顺序查找 又被称为线性查找,对顺序表和链表都使用~基本思想是从某一端开始,逐个检查关键字是否…

GZ015 机器人系统集成应用技术样题1-学生赛

2023年全国职业院校技能大赛 高职组“机器人系统集成应用技术”赛项 竞赛任务书(学生赛) 样题1 选手须知: 本任务书共 25页,如出现任务书缺页、字迹不清等问题,请及时向裁判示意,并进行任务书的更换。参赛队…

IEEE Transactions on Industrial Electronics工业电子TIE论文投稿须知

一、背景 IEEE TIE作为控制领域的TOP期刊,接收机器人、控制、自动驾驶、仪器和传感等方面的论文,当然范围不止这些,感兴趣的可以自行登录TIE官网查看。所投稿论文必须经过实验验证,偏工程应用类,当然也必须有方法上的…

MFC逆向之CrackMe Level3 过反调试 + 写注册机

今天我来分享一下,过反调试的方法以及使用IDA还原代码 写注册机的过程 由于内容太多,我准备分为两个帖子写,这个帖子主要是写IDA还原代码,下一个帖子是写反调试的分析以及过反调试和异常 这个CrackMe Level3是一个朋友发我的,我也不知道他在哪里弄的,我感觉挺好玩的,对反调试…

Ubuntu解决Failed to fetch https://... Could not resolve ‘某个源‘

在我使用sudo apt install subversion的时候遇到报错: 这个报错与Ubuntu操作系统的软件源配置文件有关系。错误提示显示无法解析“mirrors.shanhe.com”地址,这可能是由于更新软件包列表或下载软件包时出现的网络问题。 1.可以先更新一下源试试&#xf…

TCP/IP详解——UDP 协议

文章目录 1. UDP1.1 UDP 头部1.2 UDP 校验和1.3 UDP 传输过程1.4 UDP-Lite1.5 最大 UDP 数据报长度1.6 UDP 输入队列 1. UDP UDP:用户数据报协议(User Datagram Protocol)面向无连接的,也就是无需建立连接,传输不可靠。…

【LeetCode刷题笔记(7-1)】【Python】【四数之和】【哈希表】【中等】

文章目录 四数之和题目描述示例 1示例 2提示解决方案1:【四层遍历查找】解决方案2:【哈希表】【三层遍历】 结束语 四数之和 四数之和 题目描述 给你一个由 n 个整数组成的数组 nums ,和一个目标值 target 。请你找出并返回满足下述全部条件…

2023.12.15 FineBI与kettle

1.结构化就是可以用schema描述的数据,就是结构化数据,能转为二维表格, 如CSV,Excel, 2.半结构化就是部分可以转换为二维表格,如JSON,XML 3.非结构化数据,就是完全无法用二维表格表示的数据,如Word文档,Mp4,图片,等文件. kettle的流程 新建转换-构建流图-配置组件-保存运行 使…

spring boot集成mybatis和springsecurity实现登录认证功能

参考了很多网上优秀的教程,结合自己的理解,实现了登录认证功能,不打算把理论搬过来,直接上代码可能入门更快,文中说明都是基于我自己的理解写的,可能存在表述或者解释不对的情况,如果需要理论支…

机器学习中数据的特征表示

在实际应用中,数据的类型多种多样,比如文本、音频、图像、视频等。不同类型的数据,其原始特征的空间也不相同。比如一张灰度图像(像素数量为 𝐷)的特征空间为 [0, 255]𝐷,一个自然语…

统一观测丨使用 Prometheus 监控 Memcached 最佳实践

作者:啃唯 Memcached 简介 Memcached 是什么? Memcached 是一个免费开源、高性能、分布式内存对象缓存系统,支持将任意数据类型的 chunk 数据以键值对的方式存储。本质上 Memcached 是通用于所有的应用的,但最初用于存储被经常…

ArcGIS Pro SDK 右键获取选中的图层

需求&#xff1a; 获取右键选中的图层 解决方法&#xff1a; 地图页面获取选中的图形 // 获取所选要素 var firstFeatureLayer MapView.Active.Map.GetLayersAsFlattenedList().OfType<FeatureLayer>().FirstOrDefault(); 布局页面获取选中的地图框 Layout layout …

构建强大应用的引擎:深度解析Spring Boot Starter机制

目录 引言1. Spring Boot Starter机制1.1 什么是Spring Boot Starter1.2 为什么要使用Spring Boot Starter1.3.应用场景1.4.自动加载核心注解说明 2. 综合案例配置类制作控制功能实现 总结 引言 在当今互联网时代&#xff0c;构建高性能、可维护的应用已成为开发者的首要任务。…

在 Spring Boot 中发送邮件简单实现

Spring Boot 对于发送邮件这种常用功能也提供了开箱即用的 Starter&#xff1a;spring-boot-starter-mail。 通过这个 starter&#xff0c;只需要简单的几行配置就可以在 Spring Boot 中实现邮件发送&#xff0c;可用于发送验证码、账户激活等等业务场景。 本文将通过实际的案…

计算机网络快速刷题

自用//奈奎斯特定理和香农定理计算题 参考博客&#xff1a;UDP协议是什么&#xff1f;作用是什么&#xff1f; 肝了&#xff0c;整理了8张图详解ARP原理 【网络协议详解】——FTP系统协议&#xff08;学习笔记&#xff09; 在OSI参考模型中&am…

Nessus漏洞扫描报错:42873 - SSL Medium Strength Cipher Suites Supported (SWEET32)

个人搭建的windows server 2019服务器,被Nessus工具扫描出现三个漏洞,修复比较过程比较坎坷,特记录下 首先:报错信息: 42873 - SSL Medium Strength Cipher Suites Supported (SWEET32) 104743 - TLS Version 1.0 Protocol Detection 157288 - TLS Version 1.1 Protocol …

Linux的文件系统 内核结构

Linux的文件系统 Q1&#xff1a;什么是文件系统&#xff1f; A&#xff1a;在学术的角度下&#xff0c;文件系统指“操作系统用于明确存储设备组织文件的方法”&#xff0c;是“文件管理系统”的简称&#xff0c;本质也是代码&#xff0c;一段程序 Q2&#xff1a;文件系统&…

【FunASR】Paraformer语音识别-中文-通用-16k-离线-large-onnx

模型亮点 模型文件: damo/speech_paraformer-large-vad-punc_asr_nat-zh-cn-16k-common-vocab8404-pytorchParaformer-large长音频模型集成VAD、ASR、标点与时间戳功能&#xff0c;可直接对时长为数小时音频进行识别&#xff0c;并输出带标点文字与时间戳&#xff1a; ASR模型…