README
概述
此模块用于快速批量生成 随机Dummy数据的 xlsx文件
使用此模块需要了解以下几个概念
输入
- 模板xlsx路径,
- 字典文件路径,
- 输出Dummy xlsx文件的路径,数量,sheet属性
输出
若干个 随机数据的 xlsx 文件
随机数据来源
- chance.js 制造, http://chancejs.com/
- 字典文件中 定义 取值范围数组
- 字典文件中可以填写 chance 语句
模板xlsx
一个xlsx文件,
通过 批注 确定循环 单元格 及 循环次数, 通过 单元格内容 确定 其中填充的内容,
单元格内容 包含 $ 则视为代码,通过 eval 执行,否则 不视为代码
config
每个config 对象,指定了 一个模板文件 所需的所有输入,
每次 开始生成数据文件 前,可通过 程序直接添加多个config对象,也可以指定 写有 config 的 JSON文件
Getting start
Install with npm:
npm install dummy_xlsx
Then require
and use it in your code:
每一个 config 对象参数
"templateFilePath":"./订单表_模板.xlsx",//源文件路径
"dictPaths":["./订单表dict.json","./财务报表dict.json"],//字典文件路径集合
"options":{
exportFilesNum":5, //导出文件数量"
"exportFilePaths":["./订单表1.xlsx","./订单表2.xlsx"],//导出文件路径集合(可缺省)
"exportFileSheets":{//导出文件sheet属性:
<模板文件原sheet名:"订单表">:{
- "toSheets":["订单1","订单2","订单3"], // 目标sheet
- "pick":{"min":1,"max":3},// 随机sheet数
}
var dummy_xlsx=require("dummy._xlsx");
// 添加配置文件, 可以是单个配置文件,也可以是 配置文件路径集合数组
// 配置文件中的 json 对象,可以是单个 config 对象,也可以是 config对象数组
dummy_xlsx.addConfigsFromFiles("./profile.json");
或者 直接添加 config 对象
可以是单个 config 对象,也可以是 config 对象数组
dummy_xlsx.addConfigs({...})
// 开始 生成 数据 文件
dummy_xlsx.doDummy();
listener
执行 dummy_xlsx.doDummy() 之前,
增加这些代码可以帮助你
- 了解具体执行步骤
- 捕获错误
dummy_xlsx
//开始处理模板
.on("templateStarted",(xPath)=>{
console.log("开始处理模板:", xPath);
})
// 字典加载
.on("dictLoaded",(xPath)=>{
console.log("字典已加载:", xPath);
})
// dummy 数据 文件 创建成功
.on("dummyFileCreated",(xPath)=>{
console.log("生成dummy文件:",xPath)
})
//结束处理模板
.on("templateFinished",(xPath)=>{
console.log("模板处理完成:", xPath);
})
// 出错
.on("error",(err)=>{
console.log("err",err)
});
架构
模块 I/O
输入:配置json文件
路径输出:生成的Dummy数据 xlsx文件
配置json文件
定义:
存放 批量生成数据 的输入参数 的json文件
文件内容:
array的json格式,
- array每一项对应一个输入模板文件配置 [ 模板文件配置1,模板文件配置2 , ... ]
- 模板文件配置对象 :{...}
- templateFilePath,输入模板文件路径,
- dictFilePaths:[],输入字典文件路径集合,
加载多个字典,
相同属性后加载的字典会覆盖先加载的 - options{...},生成文件选项,
- exportFilesNum,生成Dummy文件个数,
- exportFilePaths:[],生成Dummy文件路径集合, 未指定则使用 <源文件路径+复制次数下标> 作为默认路径,若此集合长度小于exportFilesNum,剩余文件路径使用默认路径
- exportFileSheets:{<模板xlsx的sheet名1>:模板xlsx的sheet对象1,...},
- 生成的Dummy数据xlsx 的sheet名以及来源,模板xlsx的sheet对象:{...}
- toSheets:[],输出xlsx中 sheet名集合,
- pick:{min:<最小pick数>,max:<最大pick数>},数组中随机取值范围, 无此属性则取全部 没有此属性,则数据xlsx 和模板xlsx sheet 一一对应
- 生成的Dummy数据xlsx 的sheet名以及来源,模板xlsx的sheet对象:{...}
- 模板文件配置对象 :{...}
字典文件
定义:
存放 每种字典属性的取值范围 数据的json文件,
文件内容:
obj的json格式,每一项代表一个字典属性的取值范围,
key 为 字典属性名称,value 如果是数组,则会从数组中pick 一项作为取值,如果是字符串,则会认为是代码,执
行此字符串,结果作为取值{ <字典属性名>:["可能值1","可能值2"...], <字典属性名>:"chance.integer({min:10,max:100})", ...}
模板xlsx文件
定义:
指定输出xlsx的数据格式的xlsx文件,在此模板xlsx文件中,可以通过填写 含有【自定义$批注】或【自定义$公式】的单元格,指定输出xlsx文件的数据格式,
模板设置:
单元格批注
- 非自定义$批注,输出文件中不会包含这些批注
- 自定义$批注
- $repeatStart:{min:N,max:N},指定 复制区域的开头,以及需要复制的 次数,同一repeat区域内相同字典值也相同,每个repeatStart,开始,会重新声明一遍所有字典变量,同一repeat区域内同一中字典属性的值不会改变,
- $repeatEnd,指定复制区域的结尾
- $comment,忽略其中一行,输出文件中不会包含此行
- $copyUntil:N,从出现此行,一直到指定的行,每行都复制填充此行列的内容,主要用于用于固定表格行的样式
- $fixed:line,固定此行位置,模板中在第几行,生成的数据就在第几行,不会随着循环而递增行号
单元格内容
- excel 原有公式,不会保留公式,只会保留计算出的结果
- 自定义$公式(且无 excel公式),判断条件:单元格内容 含有 $ 字符对于此类单元格,系统会执行eval(<单元格内的内容>) 在输出文件中替换为模板单元格的内容值及格式 (文本,时间,数字),模板单元格内容可能包括:
- $xx,xx为字典属性名, 输出为最后生效的字典属性定义范围内的随机值。
- $_chance,这是一个保留的chancejs 对象,可以使用$_chance.xxx(xxx) 调用chancejs的方法生成随机值,
- $_dict,这是一个保留对象,存放 当前sheet 所有字典属性 按声明顺序 依次 声明过的值(每次repeat循环会重新声明一次), {<字典属性名>:[<此字典属性第1次随机值>,<此字典属性第2次随机值>,...]} 可以使用此属性计算某个字典属性的合计等信息 , 例: _.max($_dict["$注册资金"])
- 可以是上述内容的运算组合,算符包括:+,-,. 等,eval支持的 js运算符。 如:$姓+$名, $family.cnName,$_chance.guid() 可以使用 undersoce,增加了 _.sum(list) 求合计 ,_.avg(list)求平均数 两个方法
生成的Dummy数据 xlsx文件
定义:
按特定的格式生成的Dummy数据的xlsx文件
示例
具体参照
./sample/source.xlsx ,模板xlsx
./sapmple/dicts ,字典文件
./sapmple/profile.json,config属性的配置文件
./sapmple/export,生成的数据文件输出路径
双击 start.cmd 查看测试结果
profile.json:
[{
//源文件路径
"templateFilePath":"./订单表_模板.xlsx",
//字典文件路径
"dictPaths":["./订单表dict.json","./财务报表dict.json"],
"options":{
//导出文件数量
"exportFilesNum":5,
//导出文件路径集合(可缺省)
"exportFilePaths":["./订单表1.xlsx","./订单表2.xlsx"],
//导出文件sheet属性:
"exportFileSheets":{"订单表":
//{<原sheet名>:{toSheets:[<目标sheet名集合>]}}
{"toSheets":["订单1","订单2","订单3"], // 随机sheet数
"pick":{"min":1,"max":3}
}
}
}},
{"templateFilePath":"./财务报表_模板.xlsx",
"dictPaths":["./订单表dict.json","./财务报表dict.json"],
"options":{
"exportFilesNum":5,
"exportFilePaths":["./财务报表1.xlsx","./财务报表2.xlsx"],
"exportFileSheets":{"财务报表":{"toSheets":["报表1","报表2","报表3"], "pick":{"min":1,"max":3}
}
}
}}
]
订单表dict.json:
{"$编号":"chance.integer({min:1,max:1000})",
"$交易日期":"chance.date({year:2018})",
"$交易额":"chance.integer({min:10000,max:100000})",
"$商品名1":["牙刷","毛巾","肥皂"],
"$供应商1":["联华超市","苏果超市"]
}
财务报表dict.json:
{"$年度销售额":"chance.integer({min:100000,max:1000000})",
"$本月销售额":"chance.integer({min:10000,max:100000})",
"$年度活动收入额":"chance.integer({min:10000,max:100000})",
"$本月活动收入额":"chance.integer({min:10000,max:100000})",
"$年度税率支出额":"chance.integer({min:10000,max:100000})",
"$本月税率支出额":"chance.integer({min:10000,max:100000})",
"$年度其他收入额":"chance.integer({min:10000,max:100000})",
"$本月其他收入额":"chance.integer({min:10000,max:100000})",
"$年度薪酬额":"chance.integer({min:10000,max:100000})",
"$本月薪酬额":"chance.integer({min:10000,max:100000})",
}
模板xlsx:
参照 ./sample/source.xlsx