Excel文件操作

API用法完整文档可以查看NPM-XLSX

加载Excel表数据

在日常使用中接触到的表格文件经常是Excel表格文件(*.xlsx),工具箱中的leanpro.xlsx库提供了Excel文件的数据读取和写入等支持。它提供的是xlsx的npm包的简单封装,更多的详细的调用方法可以查看xlsx npm包

按照下面步骤添加Excel的读取:

  • 拖拽加载Excel数据工具到代码中
  • 在工具对话框中,选择Excel文件
  • 设定Excel数据表的变量名,缺省为"workbook"
  • 选择读取的工作表名称或索引(默认为0,即第一张工作表)
  • 完成Excel数据读取

生成代码如下:

JavaScript
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",那么代码会变为:

JavaScript
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)中,因此需要用户了解如何拿到表格中的数据,并用于自动化操作脚本中。

假如应用中的表格读出来的数据是这个样子的:

JavaScript
data = [
    [ '100', 'EmilyIna', 'F', '77', 'NahumBing', 'ChaucerBeck' ],
     [ '101', 'NahumBing', 'F', '92', 'DanBeryl', 'BartonZora' ],
    [ '102', 'MarionQuintina', 'M', '90', 'TrollpoeCaesar', 'EmilyIna' ],
    ......
]
header = [ '学号', '名字', '性别', '成绩', '父亲', '母亲' ]

而读写csvxlsx文件的数据类型为对象数组的形式,所以需要修改为以下形式:

[
  {
    "学号": "100",
    "名字": "EmilyIna",
    "性别": "F",
    "成绩": "77",
    "父亲": "NahumBing",
    "母亲": "ChaucerBeck"
  },
  {
    "学号": "101",
    "名字": "NahumBing",
    "性别": "F",
    "成绩": "92",
    "父亲": "DanBeryl",
    "母亲": "BartonZora"
  },
  {
    "学号": "102",
    "名字": "MarionQuintina",
    "性别": "M",
    "成绩": "90",
    "父亲": "TrollpoeCaesar",
    "母亲": "EmilyIna"
  },
  ...
]

至于为什么需要对象数组的数据格式,可以查看Excel读写库CSV读写的说明。

因此需要一个辅助函数将表头和表数据分开的数据形式转换为对象数组的形式,代码如下:

JavaScript
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数据

创建一个新的工作簿

JavaScript
let workbook = xlsx.utils.book_new();

book_new()方法创建了一个没有工作表的空的工作簿。电子表格软件通常需要至少一个工作表,如果将空工作簿传递给写入函数,则会报错。

JavaScript
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数据:

JavaScript
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文件:

JavaScript
Util.saveToCsvFile(data, "./data_bak.csv");

CSV文件转Excel文件:

读取CSV文件获得json数据:

JavaScript
let csvData = await Util.loadCsvFile('C:\\temp\\data.csv');

在得到json格式的数据后,可以再使用xlsx.utils.json_to_sheet将json数据转换为工作表,再写入工作簿:

JavaScript
let sheet = xlsx.utils.json_to_sheet(csvData, { header: header });
workbook.Sheets[workbook.SheetNames[0]] = sheet;
xlsx.writeFile(workbook, "./data_bak.xlsx");

results matching ""

    No results matching ""