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,一经查实,立即删除!

相关文章

设计模式——代理模式(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…

华为配置本地端口镜像示例(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…

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

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

threejs ShapeGeometry 自定义贴图的uv坐标

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

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

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

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中的目录 如下图…

Stable diffusion 简介

Stable diffusion 是 CompVis、Stability AI、LAION、Runway 等公司研发的一个文生图模型,将 AI 图像生成提高到了全新高度,其效果和影响不亚于 Open AI 发布 ChatGPT。Stable diffusion 没有单独发布论文,而是基于 CVPR 2022 Oral —— 潜扩…

在接口实现类中,加不加@Override的区别

最近的软件构造实验经常需要设计接口,我们知道Override注解是告诉编译器,下面的方法是重写父类的方法,那么单纯实现接口的方法需不需要加Override呢? 定义一个类实现接口,使用idea时,声明implements之后会…

cfa一级考生复习经验分享系列(三)

从总成绩可以看出,位于90%水平之上,且置信区间全体均高于90%线。 从各科目成绩可以看出,所有科目均位于90%线上或高于90%线,其中,另类与衍生、公司金额、经济学、权益投资、固定收益、财报分析表现较好,目测…

QEMU源码全解析 —— virtio(1)

接前一篇文章: 本文内容参考: 《趣谈Linux操作系统》 —— 刘超,极客时间 《QEMU/KVM》源码解析与应用 —— 李强,机械工业出版社 特此致谢! virtio简介 对于一台虚拟机而言,除了要虚拟化CPU和内存&…

一站式查询热门小程序排名,助力小程序运营决策

如今小程序数量激增,竞争日益激烈,如何能在众多同类小程序中脱颖而出,提高曝光度与下载量,是每一个小程序运营者都极为关心的问题。对此,及时准确地查询自己小程序的热门排名,分析强劲对手,找出自己的短板,都是提高小程序竞争力的重要一环。那我们该如何方便快捷地查询到这些关…

DNS:从域名解析到网络连接

目录 解密 DNS:从域名解析到网络连接的不可或缺 1. DNS的基本工作原理 1.1 本地解析器查询 1.2 递归查询 1.3 迭代查询 1.4 TLD 查询 1.5 权威 DNS 查询 2. DNS的重要性与作用 2.1 地址解析与负载均衡 2.2 网络故障处理与容错 2.3 安全性与防护 3. DNS的…

Flink 流处理流程 API详解

流处理API的衍变 Storm:TopologyBuilder构建图的工具,然后往图中添加节点,指定节点与节点之间的有向边是什么。构建完成后就可以将这个图提交到远程的集群或者本地的集群运行。 Flink:不同之处是面向数据本身的,会把D…