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.hqwc.cn/news/278179.html

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

相关文章

设计模式-状态(State)模式

目录 开发过程中的一些场景 状态模式的简单介绍 状态模式UML类图 类图讲解 适用场景 Java中的例子 案例讲解 什么是状态机 如何实现状态机 SpringBoot状态自动机 优点 缺点 与其他模式的区别 小结 开发过程中的一些场景 我们在平时的开发过程中,经常会…

网络协议 - HTTP 协议详解

网络协议 - HTTP 协议详解 一 、基础概念URL请求和响应报文1. 请求报文2. 响应报文 二、HTTP 方法GETHEADPOSTPUTPATCHDELETEOPTIONSCONNECTTRACE 三、HTTP 状态码1XX 信息2XX 成功3XX 重定向4XX 客户端错误5XX 服务器错误 四、HTTP 首部通用首部字段请求首部字段响应首部字段实…

Knife4j 接口文档如何设置 Authorization 鉴权参数?

🚀 作者主页: 有来技术 🔥 开源项目: youlai-mall 🍃 vue3-element-admin 🍃 youlai-boot 🌺 仓库主页: Gitee 💫 Github 💫 GitCode 💖 欢迎点赞…

鸿蒙原生应用/元服务开发-Stage模型能力接口(五)

说明 Common模块将二级模块API组织在一起方便开发者进行导出。本模块首批接口从API version 9开始支持。后续版本的新增接口,采用上角标单独标记接口的起始版本。本模块接口仅可在Stage模型下使用 二、 导入模块 import common from ohos.app.ability.common; 三、 …

11.jvm第三方工具使用实践

目录 概述GCEasy官网jvm内存占用情况关键性能指标堆内存与元空间优化 MAT安装MAT相关概念说明内存泄漏与内存溢出shallow heap及retained heapoutgoing references与incoming referencesDominator Tree GCViewerArthas下载安装与启动jdk8jdk 11jdk11自定义boot jarjdk17 常用命…

七. 使用ts写一个贪吃蛇小游戏

之前学习了几篇的ts基础,今天我们就使用ts来完成一个贪吃蛇的小游戏。 游戏拆解 我们将我们的任务进行简单拆解分析。 首先我们应该有一个窗口,我们叫做屏幕。让蛇在里面移动,所有我们应该想到要设计一个大盒子当作地图。考虑到食物以及蛇…

华为数通——企业双出口冗余

目标:默认数据全部经过移动上网,联通低带宽。 R1 [ ]ip route-static 0.0.0.0 24 12.1.1.2 目的地址 掩码 下一条 [ ]ip route-static 0.0.0.0 24 13.1.1.3 preference 65 目的地址 掩码 下一条 设置优先级为65 R…

SaaS行业分析

文章目录 什么是SaaS ?SaaS的标准定义什么是软件即服务?SaaS与传统软件的区别 ? SaaS行业分析你知道最赚钱的行业是什么?互联网带给企业的变化 SaaS与PaaS、IaaS的区别?IaaS(Infrastructure as a Service)…

关于“Python”的核心知识点整理大全22

目录 ​编辑 9.4.2 在一个模块中存储多个类 虽然同一个模块中的类之间应存在某种相关性,但可根据需要在一个模块中存储任意数量的 类。类Battery和ElectricCar都可帮助模拟汽车,因此下面将它们都加入模块car.py中: car.py my_electric_car…

【Linux】Redis 数据库安装教程(Ubuntu 22.04)

前言 Redis是一个开源的内存数据库,它可以用作键值存储、缓存和消息代理。它支持各种数据结构,包括字符串、哈希、列表、集合、有序集合等。Redis通常被用于构建高性能、可扩展的应用程序,特别是那些需要快速访问数据和实时数据处理的应用场…

高压电气是什么

高压电气 电工电气百科 文章目录 高压电气前言一、高压电气是什么二、高压电气的类别三、高压电气的作用原理总结前言 高压电气在电力系统中起着重要的作用,它能够将电能有效地输送和分配到各个用户,为社会和工业生产提供稳定可靠的电力供应。然而,高压电气系统也需要注意安…

【Qt开发流程】之网络编程:`HTTP`和`FTP`的高级网络操作

概述 Qt Network模块提供了可以编写TCP/IP客户端和服务器的类。它提供了较低层次的类,如QTcpSocket、QTcpServer和QUdpSocket,来代表低层次网络概念,以及高级层次类,如QNetworkRequest、QNetworkReply和QNetworkAccessManager&am…