解决postman无法下载xls并解析下载内容是否正确方案

问题

使用postman做restful api自动化测试,遇到下载excel报表,并需要解析报表内容是否正确?

解决办法

借助nodejs后端框架express写一个解析程序:
postman客户端请求服务端接口,带上相关参数;
服务端下载指定文档,解析文档内容,断言是否和客户端参数一致!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
//引入接口实现模块
var express = require('express');
var bodyParser = require('body-parser');
//引入sheetJS xlsx模块
var xl = require('xlsx');
//引入node-xlsx模块
var xlsx = require('node-xlsx');
//引入文件、路径、http请求模块
var fs = require('fs');
var path = require("path");
var request = require('request');
// 实例化一个express的对象app
var app = express();
// 创建 application/x-www-form-urlencoded 编码解析
var urlencodedParser = bodyParser.urlencoded({ extended: true })
// 告诉应用程序中间件,使用外部引入的模块中间件(内置中间件、第三方中间件、自己封装js)
// 开放客户端请求访问public目录下的资源 express.statics()是内置中间件函数,与express.json、express.urlencoder一样都是内置中间件
app.use(express.static(__dirname + "/public"), function (req, res, next) {
console.log("请求地址:" + __dirname + "/public");
console.log('请求时间:', new Date());
//释放控制权
next();
});
// 为了解析 application/json
app.use(bodyParser.json());
// 跨域设置,对所有http请求均有效
// 自定义跨域中间件
app.all("*", function (req, res, next) {
//响应头
// res.header("Access-Control-Allow-Credentials", 'true');
res.header('Access-Control-Allow-Origin', '*');
res.header('Access-Control-Allow-Headers', 'Content-Type,Content-Length,Authorization,Accept,X-Requested-With');
res.header('Access-Control-Allow-Methods', 'PUT,POST,GET,DELETE,OPTIONS');
res.header("Content-Length", "2000");
res.header("X-Powered-By", ' 3.2.1');
// res.header("Content-Type", "application/x-www-form-urlencoded");
res.header("Content-Type", "application/json;charset=utf-8");
//控制权交给下一个处理程序
if (req.method == 'OPTIONS') {
//让options请求快速返回
res.sendStatus(200);
} else {
next();
}
});

var result;
/**
* @description 下载文件
* @params ''
*/
app.post('/ExportTheDetailsAndCheckTheContent', function (req, res, next) {

/**
* 第一部分:根据请求内容下载指定报表
*/
//创建文件夹目录,用于保存下载文件
let dirPath = path.join(__dirname, "download_path");
//判断文件夹是否已存在
if (!fs.existsSync(dirPath)) {
fs.mkdirSync(dirPath);
console.log("文件夹创建成功");
} else {
console.log("文件夹已存在");
}
//创建写入流
let stream = fs.createWriteStream(path.join(dirPath, req.body.fileName + ".xls"));
//请求参数
let options = {
url: req.body.down_url + req.body.fileName + ".xls",
};
//通过request模块,pipe方法将响应结果写入文件流stream中
request(options).pipe(stream).on("close", function (err) {
console.log("文件[" + req.body.fileName + ".xls]下载完毕");
//此处特别说明:因为是异步,所以要放在请求下载生成文档之后,再进行解析excel报表
/**
* 第二部分:解析下载报表方法
* 使用sheetJS xlsx读取工作簿指定工作表的数据
* @description 获取指定单元格数据
*/

//workbook 对象,指的是整份 Excel 文档。我们在使用 js-xlsx 读取 Excel 文档之后就会获得 workbook 对象。
var workbook = xl.readFile(path.join(dirPath, req.body.fileName + ".xls"))
console.log(path.join(dirPath, req.body.fileName + ".xls"));

//获取 Excel 中所有表名
const sheetNames = workbook.SheetNames; // 返回 ['sheet1', 'sheet2']

console.log("sheetNames:" + sheetNames);
//获取指定工作表数据,返回json数据
var first_sheet_name = workbook.SheetNames[0];
var address_of_cell_A2 = 'A2';
var address_of_cell_B2 = 'B2';
var address_of_cell_C2 = 'C2';
var address_of_cell_D2 = 'D2';
var address_of_cell_E2 = 'E2';
var address_of_cell_F2 = 'F2';
var address_of_cell_G2 = 'G2';
//获取工作表
var worksheet = workbook.Sheets[first_sheet_name];
//找到所需的单元格
var desired_cell_A2 = worksheet[address_of_cell_A2];
var desired_cell_B2 = worksheet[address_of_cell_B2];
var desired_cell_C2 = worksheet[address_of_cell_C2];
var desired_cell_D2 = worksheet[address_of_cell_D2];
var desired_cell_E2 = worksheet[address_of_cell_E2];
var desired_cell_F2 = worksheet[address_of_cell_F2];
var desired_cell_G2 = worksheet[address_of_cell_G2];
//获取值
var desired_value_A2 = (desired_cell_A2 ? desired_cell_A2.v : undefined);
var desired_value_B2 = (desired_cell_B2 ? desired_cell_B2.v : undefined);
var desired_value_C2 = (desired_cell_C2 ? desired_cell_C2.v : undefined);
var desired_value_D2 = (desired_cell_D2 ? desired_cell_D2.v : undefined);
var desired_value_E2 = (desired_cell_E2 ? desired_cell_E2.v : undefined);
var desired_value_F2 = (desired_cell_F2 ? desired_cell_F2.v : undefined);
var desired_value_G2 = (desired_cell_G2 ? desired_cell_G2.v : undefined);
console.log("ddesired_valueata:" + desired_value_A2);//输出excel单元格A2的数据
console.log("ddesired_valueata:" + desired_value_B2);
console.log("ddesired_valueata:" + desired_value_C2);
console.log("ddesired_valueata:" + desired_value_D2);
console.log("ddesired_valueata:" + desired_value_E2);
console.log("ddesired_valueata:" + desired_value_F2);
console.log("ddesired_valueata:" + desired_value_G2);

/**
* 第二部分:解析下载报表方法
* 使用node-xlsx
* @description 获取整个工作簿的数据
* 格式:[{"name":"表名","data":数据数据
*/
var list = xlsx.parse(path.join(dirPath, req.body.fileName + ".xls"));
console.log(JSON.stringify(list[0].data[1]));

//将读取的数据返回给客户端
if (!err === null) {
res.status(500).send({ data: list })
} else {
res.status(200).send({ data: list })
}

});

});


//监听端口
var server = app.listen(8004, function () {
var host = server.address().address
var port = server.address().port
console.log("应用实例,访问地址为 http://%s:%s", host, port)

})

参考链接:https://blog.csdn.net/q3585914/article/details/70157938