Excel文件操作
API用法完整文档可以查看NPM-XLSX。
加载Excel表数据
在日常使用中接触到的表格文件经常是Excel表格文件(*.xlsx),工具箱中的leanpro.xlsx
库提供了Excel文件的数据读取和写入等支持。它提供的是xlsx
的npm包的简单封装,更多的详细的调用方法可以查看xlsx npm包。
按照下面步骤添加Excel的读取:
- 拖拽
加载Excel数据
工具到代码中 - 在工具对话框中,选择Excel文件
- 设定Excel数据表的变量名,缺省为"workbook"
- 选择读取的工作表名称或索引(默认为0,即第一张工作表)
- 完成Excel数据读取
生成代码如下:
const xlsx = require('leanpro.xlsx');
let workbook = xlsx.readFile("C:\\temp\\data.xlsx");
let worksheetData = xlsx.utils.sheet_to_json(workbook.Sheets[workbook.SheetNames[0]]);
console.log(worksheetData); // 输出工作簿内容,默认为注释状态
运行结果如下,它应与工作表内容一致:
[
{ "first_name": "James",
"last_name": "Butt",
"company_name": "Benton, John B Jr",
"state": "LA",
"zip": "70116" },
{ "first_name": "Josephine",
"last_name": "Darakjy",
"company_name": "Chanay, Jeffrey A Esq",
"state": "MI",
"zip": "48116" },
{ "first_name": "Art",
"last_name": "Venere",
"company_name": "Chemel, James L Cpa",
"state": "NJ",
"zip": "8014" }
]
如果要通过工作表的名称访问工作表,比如"sheet1",那么代码会变为:
const xlsx = require('leanpro.xlsx');
let workbook = xlsx.readFile("C:\\temp\\data.xlsx");
let worksheetData = xlsx.utils.sheet_to_json(workbook.Sheets["sheet1"]); // 变为直接使用工作簿名称来索引
使用Excel数据
Excel文件中还包含了很多样式、格式信息,并且数据保存在不同的表格(Sheet)中,因此需要用户了解如何拿到表格中的数据,并用于自动化操作脚本中。
假如应用中的表格读出来的数据是这个样子的:
data = [
[ '100', 'EmilyIna', 'F', '77', 'NahumBing', 'ChaucerBeck' ],
[ '101', 'NahumBing', 'F', '92', 'DanBeryl', 'BartonZora' ],
[ '102', 'MarionQuintina', 'M', '90', 'TrollpoeCaesar', 'EmilyIna' ],
......
]
header = [ '学号', '名字', '性别', '成绩', '父亲', '母亲' ]
而读写csv
和xlsx
文件的数据类型为对象数组的形式,所以需要修改为以下形式:
[
{
"学号": "100",
"名字": "EmilyIna",
"性别": "F",
"成绩": "77",
"父亲": "NahumBing",
"母亲": "ChaucerBeck"
},
{
"学号": "101",
"名字": "NahumBing",
"性别": "F",
"成绩": "92",
"父亲": "DanBeryl",
"母亲": "BartonZora"
},
{
"学号": "102",
"名字": "MarionQuintina",
"性别": "M",
"成绩": "90",
"父亲": "TrollpoeCaesar",
"母亲": "EmilyIna"
},
...
]
因此需要一个辅助函数将表头和表数据分开的数据形式转换为对象数组的形式,代码如下:
function arrayToJson(data, header) {
// 用于将二维数组转换成对象数组的方法
// 用于构建写入xlsx和csv的数据
let rows = data.map((datum) => {
let keyvalueSet = {};
datum.forEach((cell, index) => {
keyvalueSet[header[index]] = cell;
})
return keyvalueSet;
})
return rows;
}
写入Excel数据
创建一个新的工作簿
let workbook = xlsx.utils.book_new();
book_new()
方法创建了一个没有工作表的空的工作簿。电子表格软件通常需要至少一个工作表,如果将空工作簿传递给写入函数,则会报错。
let filename = "C:\\temp\\data.xlsx";
let header = ["first_name", "last_name", "company_name", "state", "zip"];
let sheet = xlsx.utils.json_to_sheet(worksheetData, { header: header });
if (existsSync(filename)) {
workbook = xlsx.readFile(filename);
workbook.Sheets[workbook.SheetNames[0]] = sheet;
} else {
xlsx.utils.book_append_sheet(workbook, sheet, 'sheet1');
}
xlsx.writeFile(workbook, fullname);
xlsx.utils.json_to_sheet
用于按顺序遍历JS对象数组,生成工作表对象。
workbook.Sheets
是一个对象,其键是工作表名称,其值是工作表对象。
book_append_sheet
用于将工作表添加到工作簿
与CSV格式的转换
CukeTest除了提供Excel的读写库,另外也提供了CSV文件的读写方法。相对来说.csv
文件在开发过程中有着更高的泛用性,但是在实际工作场景里,往往更常用的是Excel的.xlsx
文件,因此这里介绍CSV文件和Excel文件的互转。
Excel文件转CSV文件:
读取Excel文件获得json数据:
const xlsx = require('leanpro.xlsx');
let header = ["first_name", "last_name", "company_name", "state", "zip"];
let workbook = xlsx.readFile("C:\\temp\\data.xlsx");
let worksheetData = xlsx.utils.sheet_to_json(workbook.Sheets[workbook.SheetNames[0]]);
在得到json格式的数据后,可以再使用saveToCsvFile(rows, filePath)
函数将数据保存为csv文件:
Util.saveToCsvFile(data, "./data_bak.csv");
CSV文件转Excel文件:
读取CSV文件获得json数据:
let csvData = await Util.loadCsvFile('C:\\temp\\data.csv');
在得到json格式的数据后,可以再使用xlsx.utils.json_to_sheet
将json数据转换为工作表,再写入工作簿:
let sheet = xlsx.utils.json_to_sheet(csvData, { header: header });
workbook.Sheets[workbook.SheetNames[0]] = sheet;
xlsx.writeFile(workbook, "./data_bak.xlsx");