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){// 列1case 1: // 判断是否为一级栏目,并且文本不为空创建对象if(column.Text){JsonFirstIndex++;// 创建一级对象JsonData[JsonFirstIndex] = {name: column.Text,children: []};}break;// 列2case 2: // 判断是否为二级栏目,并且文本不为空创建对象if(column.Text){let secondArr = JsonData[JsonFirstIndex]['children'];// 如果一级children为数组,则自递索引,新增二级数据if(Array.isArray(secondArr)){JsonSecondIndex++;secondArr[JsonSecondIndex] = {name: column.Text,children: []}}}break;// 列3case 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){// 列1case 1: // 判断是否为一级栏目,并且文本不为空创建对象if(column.Text){JsonFirstIndex++;// 创建一级对象JsonData[JsonFirstIndex] = {name: column.Text,children: []};}break;// 列2case 2: // 判断是否为二级栏目,并且文本不为空创建对象if(column.Text){let secondArr = JsonData[JsonFirstIndex]['children'];// 如果一级children为数组,则自递索引,新增二级数据if(Array.isArray(secondArr)){JsonSecondIndex++;secondArr[JsonSecondIndex] = {name: column.Text,children: []}}}break;// 列3case 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){// 列1case 1: // 判断是否为一级栏目,并且文本不为空创建对象if(column.Text){JsonFirstIndex++;// 创建一级对象JsonData[JsonFirstIndex] = {name: column.Text,children: []};}break;// 列2case 2: // 判断是否为二级栏目,并且文本不为空创建对象if(column.Text){let secondArr = JsonData[JsonFirstIndex]['children'];// 如果一级children为数组,则自递索引,新增二级数据if(Array.isArray(secondArr)){JsonSecondIndex++;secondArr[JsonSecondIndex] = {name: column.Text,children: []}}}break;// 列3case 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对象一样功能的,欢迎留言告知。

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

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

相关文章

说说React中setState和replaceState的区别?

在 React 中,setState()和 replaceState()是用于更新组件状态的两个方法。它们之间有一些区别。 1)setState(newState):setState() 方法用于更新组件的状态。它接收一个新状态对象作为参数,并将新状态与当前状态合并。React 会合并状态更新并…

设计模式——代理模式(Proxy Pattern)

概述 代理模式是指为其他对象提供一种代理,以控制对这个对象的访问。代理对象在访问对象和目标对象之间起到中介作用。代理对象也可以在不修改目标对象的前提下,提供额外的功能操作,拓展目标对象的功能,比如说在目标对象的某个方法…

【Docker】进阶之路:(十二)Docker Composer

【Docker】进阶之路:(十二)Docker Composer Docker Compose 简介安装 Docker Compose模板文件语法docker-compose.yml 语法说明imagecommandlinksexternal_linksportsexposevolumesvolunes_fromenvironmentenv_fileextendsnetpiddnscap_add,c…

7+PPI+机器学习+实验,非肿瘤结合建模筛选生物标志物,可升级

今天给同学们分享一篇生信文章“Identification of diagnostic biomarkers and therapeutic targets in peripheral immune landscape from coronary artery disease”,这篇文章发表在J Transl Med期刊上,影响因子为7.4。 结果解读: 外周血中…

构建外卖小程序:技术代码实践

在这个数字化的时代,外卖小程序已经成为餐饮业的一项重要工具。在本文中,我们将通过一些简单而实用的技术代码,向您展示如何构建一个基本的外卖小程序。我们将使用微信小程序平台作为例子,但这些原理同样适用于其他小程序平台。 …

Android其他组件(单选框)

一、单选框(RadioGroup) 单选框(RadioGroup)需要配合单选按钮(RadioButton)使用,同一个单选框中的单选按钮只能被选中一个,默认是一个都不选中。 RadioGroup的常见属性&#xff08…

盈科数智视频管理平台简介

平台介绍 盈科数智视频管理平台是多种视频终端联网的标准管理平台,具有接入能力强、基础功能完善、运行实时监测、视频稳定传输、不同厂家的设备接入等能力,为智慧社区、智慧城市、安防监控提供视联网接入场景。 主要功能介绍 支持GB/T 28181,支持国标…

c#面试基础语法——as和is的区别

as as关键字用于将一个对象转换为指定类型(或其派生类型)。如果转换成功,则返回转换后的对象;如果对象不能转换为指定类型,则返回null。当使用as进行类型转换时,如果目标类型与原始对象类型不兼容&#xff…

华为配置本地端口镜像示例(1:1)

图1 配置本地端口镜像组网图 组网需求 如图1所示,某公司行政部通过Switch与外部Internet通信,监控设备Server与Switch直连。 现在希望通过Server对行政部访问Internet的流量进行监控 配置思路 在Switch进行如下配置,实现Server对所有行政…

VS的python没有pandas(VS连接mysql数据库)

import pandas as pd from sqlalchemy import create_engine# 初始化数据库连接 engine create_engine(mysqlpymysql://root:556localhost:3306/仓库)sql_chaSELECT * FROM 库房 print(sql_cha) df_read pd.read_sql_query(sql_cha, engine); print(df_read);VS连接mysql如上…

【通俗易懂】基于fabric8io操作k8s集群实战(pod、deployment、service、volume)

目录 前言一、基于fabric8io操作pod1.1 yaml创建pod1.2 fabric8io创建pod案例 二、基于fabric8io创建Service(含Deployment)2.1 yaml创建Service和Deployment2.2 fabric8io创建service案例 三、基于fabric8io操作Volume3.1 yaml配置挂载存储卷3.2 基于fa…

微信小程序封装自定义导航栏

在 app.json 文件中设置导航栏的样式: "window": {"navigationStyle": "custom" }, "usingComponents": {"nav-bar": "/components/navbar/navbar"}在app.js中获取设备顶部窗口的高度 App({onLaunch…

AUTOSAR从入门到精通-面向服务的中间件SOME/IP(五)

目录 前言 几个高频面试题目 SOME/IP与SOA的关系 some/ip、http、ftp、dns、rpc区别

Java服务网关的实现与应用:Spring Cloud Gateway、Zuul和Kong比较

引言: 随着微服务架构的兴起,服务网关作为系统的入口和出口,扮演着至关重要的角色。它能够集中处理请求、路由和过滤,提供统一的访问接口,简化了系统的复杂性。在Java领域,有多种服务网关的实现方案可供选择…

【超图】SuperMap iClient3D for WebGL/WebGPU ——暴雪

作者:taco 时隔多年北京又开始降下了特大暴雪。身为打工人的你有没有居家办公呢?反正小编我是没有。既然没有借着暴雪的功劳居家办公,那就接着雪来输出一篇博客好了。基于SuperMap iClient3D for WebGL/WebGPU 实现暴雪仿真效果。 先来看下效…

threejs ShapeGeometry 自定义贴图的uv坐标

问题描述: 由于一些原因,要绘制一个长方形,但是这个长方形并不是 PlaneGeometry,而是一个ShapeGeometry。但是同样的贴图,同样的形状,贴图贴在PlaneGeometry上时可以正常显示,但是贴在ShapeGeo…

了解如何在linux使用podman管理容器

本章主要介绍使用 podman 管理容器。 了解什么是容器,容器和镜像的关系 安装和配置podman 拉取和删除镜像 给镜像打标签 导出和导入镜像 创建和删除镜像 数据卷的使用 管理容器的命令 使用普通用户管理容器 使用普通用户管理容器 对于初学者来说,不太容…

squid SSL https

在 Squid 服务中配置 SSL Bumping 建议在 Squid 服务中配置 SSL Bumping 以处理加密连接。如果未配置 SSL Bumping,则代理服务器无法干预加密连接建立过程。在这种情况下,Kaspersky Web Traffic Security(反病毒和反网络钓鱼)的保…

pytorch:to()、device()、cuda()将Tensor或模型移动到指定的设备上

将Tensor或模型移动到指定的设备上:tensor.to(‘cuda:0’) 最开始读取数据时的tensor变量copy一份到device所指定的GPU上去,之后的运算都在GPU上进行在做高维特征运算的时候,采用GPU无疑是比用CPU效率更高,如果两个数据中一个加了…

word四级目录序号不随上级目录序号变化问题解决方法

一、word中的几个元素简介 1、word中的列表 如下图所示,代表word的列表: 2、word中的标题 如下图所示,代表word的标题: 3、word中的编号/序号 如下图所示,代表word的编号/序号: 4、word中的目录 如下图…