# nested-json-to-table
**Repository Path**: cloudhi/nested-json-to-table
## Basic Information
- **Project Name**: nested-json-to-table
- **Description**: 一个将JSON数据转化为各种表格显示的工具,支持复杂的嵌套格式,嵌套的JSON会以合并单元格的方式显示。
- **Primary Language**: JavaScript
- **License**: Not specified
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 24
- **Created**: 2019-03-01
- **Last Updated**: 2020-12-19
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# nested-json-to-table
支持任意嵌套格式的JSON数据转化为表格显示,嵌套的JSON会以合并的单元格形式展示。
为了这个项目,特地做了个线上的JSON数据导出工具,可以导入JSON文件,预览导出效果以及导出为EXCEL。案例链接:
- [示例1](https://json-to-table.run27.top/#example/1)
- [示例2](https://json-to-table.run27.top/#example/2)
- [示例3](https://json-to-table.run27.top/#example/3)
线上导出工具请认准域名:
> https://json-to-table.run27.top
0.1\. [快速使用](#快速使用)
0.2\. [更多的JSON格式](#更多的json格式)
0.2.1\. [简单格式](#简单格式)
0.2.2\. [嵌套格式](#嵌套格式)
0.2.3\. [更复杂的嵌套数组的格式](#更复杂的嵌套数组的格式)
0.3\. [定义Meta](#定义meta)
0.3.1\. [Meta简写格式](#meta简写格式)
0.3.2\. [自定义Builder](#自定义builder)
1\. [函数列表](#函数列表)
1.1\. [jsonToHTML](#jsontohtml)
1.2\. [jsonToTable](#jsontotable)
1.3\. [依赖](#依赖)
1.3.1\. [Node版本](#node版本)
1.3.2\. [生成文档](#生成文档)
1.4\. [License](#license)
## 0.1\. 快速使用
安装
npm install nested-json-to-table --save
引入
```js
const { jsonToHTML } = require('nested-json-to-table')
const data = [
{
a: 1,
b: {
c: 2,
d: 3
}
},
{
a: 4,
b: {
c: 5,
d: 6
}
}
]
const html = jsonToHTML(data)
console.log(html)
```
显示效果
点击查看生成的源码
```html
```
## 0.2\. 更多的JSON格式
### 0.2.1\. 简单格式
```js
const data = [
{
a: 1,
b: 2
},
{
a: 3,
b: 4
}
]
```
显示效果
点击查看生成源码
```html
```
### 0.2.2\. 嵌套格式
```js
const data = [
{
a: 1,
b: {
c: 2,
d: 3
}
},
{
a: 4,
b: {
c: 5,
d: 6
}
}
]
```
显示效果
点击查看生成源码
```html
```
### 0.2.3\. 更复杂的嵌套数组的格式
```js
const data = [
{
a: 1,
b: [
{
d: 2,
e: 3
},
{
d: 4,
e: 5
}
],
c: [
{
f: 6,
g: 7
},
{
f: 8,
g: 9
},
{
f: 10,
g: 11
}
]
}
]
```
显示效果
a |
b |
c |
d |
e |
f |
g |
1 |
2 |
3 |
6 |
7 |
4 |
5 |
8 |
9 |
|
10 |
11 |
点击查看生成源码
```html
a |
b |
c |
d |
e |
f |
g |
1 |
2 |
3 |
6 |
7 |
4 |
5 |
8 |
9 |
|
10 |
11 |
```
## 0.3\. 定义Meta
我们可以规定Meta的格式来收获我们想要的格式。如简单的格式:
```js
const { jsonToHTML } = require('nestd-json-to-table')
const meta = {
order: ['a', 'b'],
mapping: {
a: {
title: 'A'
},
b: {
title: 'B'
}
}
}
const data = [
{
a: 1,
b: 2
},
{
a: 3,
b: 4
}
]
const html = jsonToHTML(meta, data)
console.log(html)
```
显示效果
点击查看生成源码
```html
```
再如嵌套的格式:
```js
const { jsonToHTML } = require('nested-json-to-table')
const meta = {
order: ['a', 'b'],
mapping: {
a: {
title: 'A'
},
b: {
title: 'B',
meta: {
order: ['c', 'd'],
mapping: {
c: {
title: 'C'
},
d: {
title: 'D'
}
}
}
}
}
}
const data = [
{
a: 1,
b: {
c: 2,
d: 3
}
},
{
a: 4,
b: {
c: 5,
d: 6
}
}
]
const html = jsonToHTML(meta, data)
console.log(html)
```
显示效果
点击查看生成源码
```html
```
### 0.3.1\. Meta简写格式
如果只有一个title属性,则Meta可以简写为:
```js
const meta = {
order: ['a', 'b'],
mapping: {
a: 'A',
b: 'B'
}
}
```
order可以省略,这时列顺序不可保证,一般来讲是写入的顺序:
```js
const meta = {
mapping: {
a: {
title: 'A'
}
b: {
title: 'B'
}
}
}
```
省略mapping的写法也是支持的,下面两者等价:
```js
const meta1 = {
order: ['a', 'b']
}
const meta2 = {
order: ['a', 'b'],
mapping: {
a: 'a',
b: 'b'
}
}
```
### 0.3.2\. 自定义Builder
输出HTML源码只是工具提供的最基本的格式。实际上,可以通过编写Builder支持更多的输出格式,如Excel等等。下面是一个简单的示例,它输出``、``、``这样的XML格式。
```js
const { jsonToTable } = require('nested-json-to-table')
class Builder {
constructor () {
this.indent = 0
}
table (next) {
this._wrap('table', next)
}
head (next) {
this._wrap('table', next)
}
body (next) {
this._wrap('table', next)
}
row (next) {
this._wrap('row', next)
}
cell (data, at) {
this._writeLine(`${data}`)
}
_wrap (tag, next) {
this._writeLine(`<${tag}>`)
this.indent++
next()
this.indent--
this._writeLine(`${tag}>`)
}
_writeLine (line) {
const spaces = new Array(this.indent * 2).fill(' ').join('')
console.log(spaces + line)
}
}
const data = [
{
a: 1,
b: 2
},
{
a: 3,
b: 4
}
]
const builder = new Builder()
jsonToTable(data, builder)
```
输出
```html
```
一个Builder是一个对象,其中要定义`table`、`head`、`body`、`row`、`cell`五个方法,分别对应表格的表格、表头、表体、行和单元格的处理段。
- `table(next)`:进入table的处理段,调用next方法才会进入到下一层的处理段。
- `head(next)`:进入head的处理段,调用next方法才会进入到下一层的处理段。
- `body(next)`:进入body的处理段,调用next方法才会进入到下一层的处理段。
- `row(next)`:进入row的处理段,调用next方法才会进入到下一层的处理段。
- `cell(data, at)`:进入单元格的处理段,data是该单元格的数据,at包含三个参数:
- `rowSpan`: 该单元格纵跨的行数
- `colSpan`:该单元格横跨的列数
- `isHead`:该单元格是否位于表头,否则就在表体内
# 1\. 函数列表
## 1.1\. jsonToHTML
function jsonToTable(data)
将data转化为HTML表格源码。
function jsonToTable(meta, data)
将data转化为HTML表格源码,其中表头的部分通过meta定义。
function jsonToTable(meta, data, rootAttrs)
将data转化为HTML表格源码,其中表头的部分通过meta定义。该调用可以附加一个根元素(即table)的属性列表。如下调用,最终生成的源码会是:
jsonToTable(meta, data, { class: 'class1 class2' })
// generate
//
// ...
## 1.2\. jsonToTable
function jsonToTable(data, builder)
利用自定义Builder,将data转化为table格式。关于自定义Builder的部分,可参考相关章节。
function jsonToTable(meta, data, builder)
利用自定义Builder,将data转化为table格式。其中表头的部分通过meta定义。关于meta和自定义Builder的部分,可参考相关章节。
## 1.3\. 依赖
### 1.3.1\. Node版本
v8.11.1
### 1.3.2\. 生成文档
pip install MarkdownPP
## 1.4\. License
LGPL-2.1