您的位置:首页 > Web前端 > Node.js

使用Nodejs 实现Excel文件转换为JSON、Xml文件格式

2017-12-08 11:25 731 查看
最近公司部署了Testlink的测试用例管理平台,比较坑的是这个导入用例方式只有支持xml文件格式,在网上找了下几个支持EXcel文件格式导入的方法,进行配置后没有生效,只好考虑对测试用例文档进行转换格式(excel文档--转为--json--转为--xml),来实现转换功能。

使用Nodejs 的方式大致如下,文件目录说明:

Excel :将需要转换的Excel文档放在 Excel 目录下,对应的目标Xml文件也是放在这个文件下。

js :存放具体实现的js文件和单独引用的文件,lib目录下引入underscore-min.js 。

node_modules :存放对应的引用类库,

js目录存放文件:

node_modules 引用的类库如下:

实现create.js 代码如下:

'use strict';
var xlsxrd = require("node-xlsx");
var _ = require("./lib/underscore-min.js");
var fs = require('fs');
var xml2js = require('xml2js');
//excel 文件名称,上级目录Excel 文件夹下的测试用例文档
var excelFilePath = 'testcase-js.xlsx';
var xmlFilePath = '../excel/xmlCase.xml';

//解析xml 结构的属性值
var parser = new xml2js.Parser({
explicitArray: false,
attrkey:'$',
trim:false,
childkey:'$$',
attrNameProcessors: null,
attrValueProcessors:null
});
//构建xml文件的结构

// jons -> xml
var jsonBuilder = new xml2js.Builder({
rootName:'testsuite',
cdata: true,
renderOpts: { 'pretty': true, 'indent': '', 'newline': '\n' },
xmldec:{
'version':'1.0',
'encoding': 'UTF-8'}});

//调用转换方法:
excel2xml(excelFilePath,xmlFilePath);
xml2Json(xmlFilePath);
function excel2xml(excelFilePath,xmlFilePath) {
// 封装函数...
//获取到excel的数据文件,将excle文件放到上级Excel 目录下
//示例xml文件保持路径:'../excel/xmlCase.xml'
var excelData = xlsxrd.parse("../excel/" + excelFilePath);

console.log(excelData.length);

var testsuites = {'$':{'name':''},"testcase":[]};//测试套件,
_.each(excelData,function(testsuite,i) {
console.log("测试套件-----start-------------");
//对所有的测试套件进行处理,获取套件名称和数据。
testsuites.$.name = excelData[i].name;
_.each(excelData[i].data,function(testcase,x) {
//对套件中的测试用例进行遍历
console.log("测试用例-------start-----------");
console.log(testcase);
if(x>0){
let tmpcase = {
'$':{'name':testcase[0]},
'summary':'<p>'+testcase[1]+'</p>',
'preconditions':'<p>'+testcase[2]+'</p>' ,
'steps':{"step":[]}
};
//构建思路:
//根据name 去搜索用例,查找是否能找到相同名称、摘要、预置条件的用例
//如果找到,则拼接step,对steps.step 进行push操作,
//如果找不到,则拼接steps信息
//构建步骤
let step = {
'step_number':testcase[3]||'',
'actions':'<p>'+testcase[4]+'</p>',
'expectedresults':'<p>'+testcase[5]+'</p>',
"execution_type":"1"
};
let casename = testcase[0];

//筛选出用例名称相同的用例(同名的用例永远只能有一个,存在2个时,则取第一个)
let tempCases = _.find(testsuites.testcase,function(item) {
// body...
return item.$.name === casename;
});

//判断筛选结果非定义、为空,查不到结果时,直接添加结果
if(!_.isUndefined(tempCases)){

//查找到该对象,在这个对象上增加steps
_.find(testsuites.testcase,function(item) {
//查找到同名的对象,然后将步骤合并到一条用例上.
return item.$.name === casename;
}).steps.step.push(step);
}else{
//找不到相同名的用例
tmpcase.steps.step.push(step);
//添加一条用例
testsuites.testcase.push(tmpcase);
}
console.log("测试用例-----end-------------");

}
});
console.log("测试套件-----end-------------");

});

//转 testsuites 用例格式
//调试时使用固定模式 jsond 作为数据源
var json2xml = jsonBuilder.buildObject(testsuites);
fs.writeFileSync('../excel/xmlCase.xml', json2xml, 'utf-8');
}

function nameToUpperCase(name){
return name.toUpperCase();
}

function xml2Json(FilePath){
// xml -> json '../excel/测试1.testsuite-deep.xml'
fs.readFile(FilePath,'utf-8',function(err,result){
//转换xml文件
parser.parseString(result, function (err, result) {
console.log('xml解析成json:'+'\n'+JSON.stringify(result));
});
});

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息