前提准备
下载 xlsx 包。
npm i xlsx
导入 xlsx。
import * as XLSX from "xlsx";
打印XLSX可以在控制台看到它的属性和方法。
后续很多操作都是通过 XLSX 中的属性和方法实现,其中 utils 用到的地方会多一些,下面会一点一点的介绍。
1.XLSX 导出 Excel 文件有以下几个步骤
-
创建一个工作簿(WorkBook)。
-
创建 sheet 对象(WorkBook.sheet)。
-
将 sheet 对象插入工作簿。
-
下载工作簿。
2.创建工作簿(WorkBook)
通过 XLSX.utils.book_new() 可以创建一个新的工作簿。
let wb = XLSX.utils.book_new();
工作簿包含两个属性。
一个属性是 SheetNames,是一个数组,另外一个属性是 Sheets,是一个对象。
每一个工作簿都是一个EXCEL文件,EXCEL文件包含Sheet,每一个Sheet都是一个表格。
SheetNames 属性用来存储 sheet 的名字,Sheets 属性用来存储相对应的 sheet(键值对的形式,键是 sheet 的名字也就是 SheetNames 属性里的项,值就是 sheet 的数据)。此时是刚创建的新的工作簿,所以都是空的。
3.创建 Sheet 对象
每一个 sheet 对象都是一个 excel 的 sheet,也就是一个表格。
创建 Sheet 对象的方法
根据情况的不同,创建 sheet 对象的方法也有很多。比如:
- XLSX.utils.aoa_to_sheet(): 将一个二维数组转成sheet,会自动处理number、string、boolean、date等类型数据。
- XLSX.utils.table_to_sheet(): 将一个table dom直接转成sheet,会自动识别colspan和rowspan并将其转成对应的单元格合并。
- XLSX.utils.json_to_sheet():将一个由对象组成的数组转成sheet 。
- 等等
这些方法最后都会去一一介绍。
4.将 Sheet 对象加入到 工作簿中
通过 XLSX.utils.book_append_sheet() 方法可以将 sheet 对象加到工作簿中。
XLSX.utils.book_append_sheet() 方法接收三个参数,第一个是工作簿,第二个是 sheet 对象,第三个是工作簿中每一个 Sheet 的名字。
XLSX.utils.book_append_sheet(wb, ws, "sheetName");
如果工作簿中有多个 sheet ,就多次添加就好了。
XLSX.utils.book_append_sheet(wb, ws1, "sheetName");
XLSX.utils.book_append_sheet(wb, ws2, "sheetName2");
注意:添加多个 sheet 的时候名字不能相同。
5.下载表格
通过 XLSX.writeFile 方法下载表格。
接收三个参数,第一个是工作簿,第二个是工作簿的名字,第三个是配置项(可省略)。
XLSX.writeFile(wb, "名字.xlsx");
6.XLSX.utils.json_to_sheet() 方式创建 Sheet 对象
(1)
XLSX.utils.json_to_sheet
获取对象数组并且返回Sheet对象。
(2)默认的列表头由数组第一项对象的key决定,不过可以使用选项参数覆盖。
比如:
exportFile1() {
const tableData = [
{ department: "行政部", count: 2 },
{ department: "技术部", count: 2 },
];
// 1.创建一个工作簿
let wb = XLSX.utils.book_new();
// 2.创建sheet对象
let ws= XLSX.utils.json_to_sheet(tableData);
// 3.将 sheet 对象插入工作簿
XLSX.utils.book_append_sheet(wb, ws, "sheetName");
// 4.下载 excel
XLSX.writeFile(wb, "out.xlsx");
},
此时的表头就是数组第一项的key,也就是 department,count。
(3)如果数组第一个对象之外的对象的 key 有跟第一项不一样的,就会单独再添加一列。
比如:
exportFile2() {
const tableData = [
{ department: "行政部", count: 2 },
{ department: "技术部", count: 2 },
{ num: "yjb", count: 2 },
];
// 1.创建一个工作簿
let wb = XLSX.utils.book_new();
console.log(wb);
// 2.创建sheet对象
let ws = XLSX.utils.json_to_sheet(tableData);
// 3.将 sheet 对象插入工作簿
XLSX.utils.book_append_sheet(wb, ws, "sheetName");
// 4.下载 excel
XLSX.writeFile(wb, "out.xlsx");
},
此时的表头就是除了数组第一项的key,也就是 department,count以外还会新增一列 num。
注意事项:如果 key 有重复的会被覆盖。
(4)XLSX.utils.json_to_sheet()接收两个参数。
除了上述的表格数据参数以外,还有一个配置参数。配置参数是一个对象,有以下几个属性:
属性 | 默认值 | 描述 |
header | 使用指定的列顺序 (默认 Object.keys(数据第一项) ) | |
dateNF | FMT 14 | 字符串输出使用指定的日期格式 |
cellDates | false | 存储日期为类型 d (默认是 n ) |
skipHeader | false | 如果值为true, 输出不包含header行 |
示例:header属性
是一个数组,用来指定列头。默认是 数组第一项对象的 key。
exportFile3() {
const tableData = [
{ S: 1, h: 2, e: 3, e_1: 4, t: 5, J: 6, S_1: 7 },
{ S: 2, h: 3, e: 4, e_1: 5, t: 6, J: 7, S_1: 8 },
];
// 1.创建一个工作簿
let wb = XLSX.utils.book_new();
console.log(wb);
// 2.创建sheet对象
let ws = XLSX.utils.json_to_sheet(tableData, {
header: ["S", "h", "e", "e_1", "t", "J", "S_1"],
});
// 3.将 sheet 对象插入工作簿
XLSX.utils.book_append_sheet(wb, ws, "sheetName");
// 4.下载 excel
XLSX.writeFile(wb, "out.xlsx");
},
此时 header 属性指定的列就是 "S", "h", "e", "e_1", "t", "J", "S_1"。
这么看好像设不设置都一样,因为默认就是这个,但是如果我们给 header 属性设置不一样的值。
exportFile4() {
const tableData = [
{ S: 1, h: 2, e: 3, e_1: 4, t: 5, J: 6, S_1: 7 },
{ S: 2, h: 3, e: 4, e_1: 5, t: 6, J: 7, S_1: 8 },
];
// 1.创建一个工作簿
let wb = XLSX.utils.book_new();
console.log(wb);
// 2.创建sheet对象
let ws = XLSX.utils.json_to_sheet(tableData, {
header: ["A", "S", "h", "e", "e_1", "B", "t", "J", "S_1"],
});
// 3.将 sheet 对象插入工作簿
XLSX.utils.book_append_sheet(wb, ws, "sheetName");
// 4.下载 excel
XLSX.writeFile(wb, "out.xlsx");
},
可以看见此时 header 属性的值已经不是默认的值了,多了几个值。
可以看到表格的列也相对应的增加了,这个有什么用暂时不知道。
示例:skipHeader属性
是一个布尔值,如果为 true,不展示表格的表头,默认 false。
exportFile5() {
const tableData = [
{ A: "S", B: "h", C: "e", D: "e", E: "t", F: "J", G: "S" },
{ A: 1, B: 2, C: 3, D: 4, E: 5, F: 6, G: 7 },
{ A: 2, B: 3, C: 4, D: 5, E: 6, F: 7, G: 8 },
];
// 1.创建一个工作簿
let wb = XLSX.utils.book_new();
console.log(wb);
// 2.创建sheet对象
let ws = XLSX.utils.json_to_sheet(tableData, {
header: ["A", "B", "C", "D", "E", "F", "G"],
skipHeader: true,
});
// 3.将 sheet 对象插入工作簿
XLSX.utils.book_append_sheet(wb, ws, "sheetName");
// 4.下载 excel
XLSX.writeFile(wb, "out.xlsx");
},
设置 skipHeader 属性为 true 以后,表格的表头就不会导出。
(5)拓展:XLSX.utils.sheet_add_json
XLSX.utils.sheet_add_json 也是
获取一个对象数组,并且更新一个已存在的工作表对象。
接收三个参数,第一个是被更新的 sheet 对象,第二个是更新内容(对象数组),第三个是配置对象。配置对象有以下几个属性:
属性 | 默认值 | 描述 |
header | 使用指定的列顺序 (默认 Object.keys(数据第一项) ) | |
dateNF | FMT 14 | 字符串输出使用指定的日期格式 |
cellDates | false | 存储日期为类型 d (默认是 n ) |
skipHeader | false | 如果值为true, 输出不包含header行 |
origin | 使用指定的单元格作为起点 (查看下方表格) |
origin | 描述 |
(cell object) | 使用指定的单元格(单元格对象) |
(string) | 使用指定的单元格 (A1样式的单元格) |
(number >= 0) | 从指定行的第一列开始(0索引) |
-1 | 从第一列开始添加到工作表底部 |
(default) | 从单元格A1开始 |
示例:origin 为 (string)
exportFile6() {
// 1.创建一个工作簿
let wb = XLSX.utils.book_new();
console.log(wb);
// 2.创建sheet对象
var ws = XLSX.utils.json_to_sheet(
[],
{ header: ["A", "B", "C", "D", "E", "F", "G"], skipHeader: false }
);
// 3.将 sheet 对象插入工作簿
XLSX.utils.book_append_sheet(wb, ws, "sheetName");
// 4.下载 excel
XLSX.writeFile(wb, "out.xlsx");
},
这是基础的表格(只有表头)导出,没有使用 XLSX.utils.sheet_add_json 更新 sheet 对象。
这是导出结果。
此时使用 XLSX.utils.sheet_add_json 更新 sheet 对象,且
origin为 A2,代表 从 表格A 列第二行开始更新。
exportFile6() {
// 1.创建一个工作簿
let wb = XLSX.utils.book_new();
console.log(wb);
// 2.创建sheet对象
var ws = XLSX.utils.json_to_sheet(
[],
{ header: ["A", "B", "C", "D", "E", "F", "G"], skipHeader: false }
);
XLSX.utils.sheet_add_json(
ws,
[
{ A: 1, B: 2 },
{ A: 2, B: 3 },
{ A: 3, B: 4 },
],
{ skipHeader: true, origin: "A2" }
);
// 3.将 sheet 对象插入工作簿
XLSX.utils.book_append_sheet(wb, ws, "sheetName");
// 4.下载 excel
XLSX.writeFile(wb, "out.xlsx");
},
这是导出结果。
如果 origin为 A3,代表 从表格 A 列第三行开始更新。
exportFile6() {
// 1.创建一个工作簿
let wb = XLSX.utils.book_new();
console.log(wb);
// 2.创建sheet对象
var ws = XLSX.utils.json_to_sheet(
[],
{ header: ["A", "B", "C", "D", "E", "F", "G"], skipHeader: false }
);
XLSX.utils.sheet_add_json(
ws,
[
{ A: 1, B: 2 },
{ A: 2, B: 3 },
{ A: 3, B: 4 },
],
{ skipHeader: true, origin: "A3" }
);
// 3.将 sheet 对象插入工作簿
XLSX.utils.book_append_sheet(wb, ws, "sheetName");
// 4.下载 excel
XLSX.writeFile(wb, "out.xlsx");
},
这是导出结果。
如果 origin为 B3,代表 从 表格B列第三行开始更新。
exportFile6() {
// 1.创建一个工作簿
let wb = XLSX.utils.book_new();
console.log(wb);
// 2.创建sheet对象
var ws = XLSX.utils.json_to_sheet(
[],
{ header: ["A", "B", "C", "D", "E", "F", "G"], skipHeader: false }
);
XLSX.utils.sheet_add_json(
ws,
[
{ A: 1, B: 2 },
{ A: 2, B: 3 },
{ A: 3, B: 4 },
],
{ skipHeader: true, origin: "B3" }
);
// 3.将 sheet 对象插入工作簿
XLSX.utils.book_append_sheet(wb, ws, "sheetName");
// 4.下载 excel
XLSX.writeFile(wb, "out.xlsx");
},
这是导出结果。
此时可能会有一些疑惑,为什么是更新内容 { A: 1, B: 2 }, { A: 2, B: 3 },{ A: 3, B: 4 } 会跑到表头是B和C的列下去,按理说应该是只有表头是B的列更新(因为是从表格B列开始更新,会以为表格A列也就是表头是A的列会被忽略)。
{ A: 1, B: 2 } 这里的 A 和 B 指的不是表头是 A 或者 B,只是一个代名词,就相当于第一列和第二列,不一定指的是表头是 A 的列或者表头是 B 的列,也不是指表格 A 列或者表格 B 列。指的就是更新内容的第一列和第二列。换成别的也行,只是习惯用ABCD。且会以第一项的key值来确定更新内容的顺序。
举个例子:
exportFile6() {
// 1.创建一个工作簿
let wb = XLSX.utils.book_new();
console.log(wb);
// 2.创建sheet对象
var ws = XLSX.utils.json_to_sheet([], {
header: ["A", "B", "C", "D", "E", "F", "G"],
skipHeader: false,
});
XLSX.utils.sheet_add_json(
ws,
[
{ X: 1, Y: 2, Z: 3 },
{ X: 1, Z: 2, Y: 3 },
{ X: 1, W: 2, Z: 3 },
],
{ skipHeader: true, origin: "B3" }W
);
// 3.将 sheet 对象插入工作簿
XLSX.utils.book_append_sheet(wb, ws, "sheetName");
// 4.下载 excel
XLSX.writeFile(wb, "out.xlsx");
},
此时更新内容的第一项确定了更新顺序是 X Y Z,且从表格 B 列第三行开始更新,所以从表格 B 列第三行的内容就按照顺序更新了,第二项是 { X: 1, Z: 2, Y: 3 } ,所以第四行更新内容应该是 1 3 2,因为第一项已经确定更新顺序是 X Y Z,第三项是 { X: 1, W: 2, Z: 3 },多了个 W,所以此时更新顺序应该为 X Y Z W,所以更新内容是 1 空白 3 2。
这是导出结果。
示例:origin 为 (cell object)
exportFile6() {
// 1.创建一个工作簿
let wb = XLSX.utils.book_new();
console.log(wb);
// 2.创建sheet对象
var ws = XLSX.utils.json_to_sheet([], {
header: ["A", "B", "C", "D", "E", "F", "G"],
skipHeader: false,
});
XLSX.utils.sheet_add_json(
ws,
[
{ A: 1, B: 2 },
{ A: 2, B: 3 },
{ A: 3, B: 4 },
],
{ skipHeader: true, origin: "A2" }
);
XLSX.utils.sheet_add_json(
ws,
[
{ A: 5, B: 6, C: 7 },
{ A: 6, B: 7, C: 8 },
{ A: 7, B: 8, C: 9 },
],
{ skipHeader: true, origin: { r: 1, c: 4 }}
);
// 3.将 sheet 对象插入工作簿
XLSX.utils.book_append_sheet(wb, ws, "sheetName");
// 4.下载 excel
XLSX.writeFile(wb, "out.xlsx");
},
此时 origin 是一个对象,有两个属性 r 和 c,其中 r 代表 行(row),c 代表列(col),而他们都是从 0 开始计数的,所以 origin: { r: 1, c: 4 } 就表示从第二行第五列开始更新。
这是导出结果。
如果 r 和 c 都是 0 的话。
exportFile6() {
// 1.创建一个工作簿
let wb = XLSX.utils.book_new();
console.log(wb);
// 2.创建sheet对象
var ws = XLSX.utils.json_to_sheet([], {
header: ["A", "B", "C", "D", "E", "F", "G"],
skipHeader: false,
});
XLSX.utils.sheet_add_json(
ws,
[
{ A: 1, B: 2 },
{ A: 2, B: 3 },
{ A: 3, B: 4 },
],
{ skipHeader: true, origin: "A2" }
);
XLSX.utils.sheet_add_json(
ws,
[
{ A: 5, B: 6, C: 7 },
{ A: 6, B: 7, C: 8 },
{ A: 7, B: 8, C: 9 },
],
{ skipHeader: true, origin: { r: 0, c: 0}}
);
// 3.将 sheet 对象插入工作簿
XLSX.utils.book_append_sheet(wb, ws, "sheetName");
// 4.下载 excel
XLSX.writeFile(wb, "out.xlsx");
},
因为从第一行开始更新,所以会把表头也给更新掉。
示例:origin 为 -1
origin 为 -1 代表从最底下的一行的第一列开始添加。
exportFile6() {
// 1.创建一个工作簿
let wb = XLSX.utils.book_new();
console.log(wb);
// 2.创建sheet对象
var ws = XLSX.utils.json_to_sheet([], {
header: ["A", "B", "C", "D", "E", "F", "G"],
skipHeader: false,
});
XLSX.utils.sheet_add_json(
ws,
[
{ A: 1, B: 2 },
{ A: 2, B: 3 },
{ A: 3, B: 4 },
{ A: 3, B: 4 },
],
{ skipHeader: true, origin: "A2" }
);
XLSX.utils.sheet_add_json(
ws,
[
{ A: 5, B: 6, C: 7 },
{ A: 6, B: 7, C: 8 },
{ A: 7, B: 8, C: 9 },
],
{ skipHeader: true, origin: { r: 1, c: 4 } }
);
XLSX.utils.sheet_add_json(
ws,
[
{ A: 4, B: 5, C: 6, D: 7, E: 8, F: 9, G: 0 },
{ A: 4, B: 5, C: 6, D: 7, E: 8, F: 9, G: 0 },
],
{
skipHeader: true,
origin: -1,
}
);
// 3.将 sheet 对象插入工作簿
XLSX.utils.book_append_sheet(wb, ws, "sheetName");
// 4.下载 excel
XLSX.writeFile(wb, "out.xlsx");
},
此时更新内容有两项,代表从最底下的行的第一列开始更新两项内容。
这是导出结果。
示例:origin 为 (number >= 0)
表示从第 number + 1 行的第一列开始更新,因为从 0 开始数。
exportFile6() {
// 1.创建一个工作簿
let wb = XLSX.utils.book_new();
console.log(wb);
// 2.创建sheet对象
var ws = XLSX.utils.json_to_sheet([], {
header: ["A", "B", "C", "D", "E", "F", "G"],
skipHeader: false,
});
XLSX.utils.sheet_add_json(
ws,
[
{ A: 1, B: 2 },
{ A: 2, B: 3 },
{ A: 3, B: 4 },
{ A: 3, B: 4 },
],
{ skipHeader: true, origin: "A2" }
);
XLSX.utils.sheet_add_json(
ws,
[
{ A: 5, B: 6, C: 7 },
{ A: 6, B: 7, C: 8 },
{ A: 7, B: 8, C: 9 },
],
{ skipHeader: true, origin: { r: 1, c: 4 } }
);
XLSX.utils.sheet_add_json(
ws,
[
{ A: 4, B: 5, C: 6, D: 7, E: 8, F: 9, G: 0 },
{ A: 4, B: 5, C: 6, D: 7, E: 8, F: 9, G: 0 },
],
{
skipHeader: true,
origin: -1,
}
);
XLSX.utils.sheet_add_json(
ws,
[
{ A: 1, B: 1 },
{ A: 1, B: 1 },
],
{
skipHeader: true,
origin: 10,
}
);
// 3.将 sheet 对象插入工作簿
XLSX.utils.book_append_sheet(wb, ws, "sheetName");
// 4.下载 excel
XLSX.writeFile(wb, "out.xlsx");
},
此时 origin 为 10,表示从第 11 行的第一列开始更新。
7.XLSX.utils.aoa_to_sheet() 方式创建 Sheet 对象
(1)XLSX.utils.aoa_to_sheet 获取二维数组并返回一个 sheet 对象。
(2)接收的二维数组中,第一项数组就是表头。这里表头可重复。
比如:
exportFile7() {
// 1.创建一个工作簿
let wb = XLSX.utils.book_new();
// 2.创建sheet对象
var ws = XLSX.utils.aoa_to_sheet([
"SheetJS".split(""),
[1, 2, 3, 4, 5, 6, 7],
[2, 3, 4, 5, 6, 7, 8],
]);
// 3.将 sheet 对象插入工作簿
XLSX.utils.book_append_sheet(wb, ws, "sheetName");
// 4.下载 excel
XLSX.writeFile(wb, "out.xlsx");
},
此时第一项数组为 ["S", "h", "e", "e", "t", "J", "s"],所以表头就是 S h e e J s。
这是导出结果。
(3) XLSX.utils.aoa_to_sheet 接收两个参数,除了表格数据以外,还有一个配置参数。
除了上述的表格数据参数以外,还有一个配置参数。配置参数是一个对象,有以下几个属性:
属性 | 默认值 | 描述 |
sheetStubs | false | 为null 值创建类型为z 的单元格对象 |
dateNF | FMT 14 | 字符串输出使用指定的日期格式 |
cellDates | false | 存储日期为类型 d (默认是 n ) |
都不怎么用所以不做展示。
(4)拓展:XLSX.utils.sheet_add_aoa
XLSX.utils.sheet_add_aoa 获取一个二维数组,并且更新一个已存在的工作表对象。
接收三个参数,第一个是被更新的 sheet 对象,第二个是更新内容(二维数组),第三个是配置对象。配置对象有以下几个属性:
属性 | 默认值 | 描述 |
sheetStubs | false | 为null 值创建类型为z 的单元格对象 |
dateNF | FMT 14 | 字符串输出使用指定的日期格式 |
cellDates | false | 存储日期为类型 d (默认是 n ) |
origin | 使用指定的单元格作为起点 (查看下方表格) |
origin | 描述 |
(cell object) | 使用指定的单元格(单元格对象) |
(string) | 使用指定的单元格 (A1样式的单元格) |
(number >= 0) | 从指定行的第一列开始(0索引) |
-1 | 从第一列开始添加到工作表底部 |
(default) | 从单元格A1开始 |
示例:origin 为 (string)
exportFile8() {
// 1.创建一个工作簿
let wb = XLSX.utils.book_new();
// 2.创建sheet对象
var ws = XLSX.utils.aoa_to_sheet(["SheetJS".split("")]);
// 3.将 sheet 对象插入工作簿
XLSX.utils.book_append_sheet(wb, ws, "sheetName");
// 4.下载 excel
XLSX.writeFile(wb, "out.xlsx");
},
这是基础的表格(只有表头)导出,没有使用 XLSX.utils.sheet_add_aoa 更新 sheet 对象。
这是导出结果。
此时使用 XLSX.utils.sheet_add_aoa 更新 sheet 对象,且
origin为 A2,代表 从 表格A 列第二行开始更新。
exportFile9() {
// 1.创建一个工作簿
let wb = XLSX.utils.book_new();
// 2.创建sheet对象
var ws = XLSX.utils.aoa_to_sheet(["SheetJS".split("")]);
XLSX.utils.sheet_add_aoa(
ws,
[
[1, 2],
[2, 3],
[3, 4],
],
{ origin: "A2" }
);
// 3.将 sheet 对象插入工作簿
XLSX.utils.book_append_sheet(wb, ws, "sheetName");
// 4.下载 excel
XLSX.writeFile(wb, "out.xlsx");
},
这是导出结果。
示例:origin 为 (cell object)
exportFile10() {
// 1.创建一个工作簿
let wb = XLSX.utils.book_new();
// 2.创建sheet对象
var ws = XLSX.utils.aoa_to_sheet(["SheetJS".split("")]);
XLSX.utils.sheet_add_aoa(
ws,
[
[1, 2],
[2, 3],
[3, 4],
],
{ origin: "A2" }
);
XLSX.utils.sheet_add_aoa(
ws,
[
[5, 6, 7],
[6, 7, 8],
[7, 8, 9],
],
{ origin: { r: 1, c: 4 } }
);
// 3.将 sheet 对象插入工作簿
XLSX.utils.book_append_sheet(wb, ws, "sheetName");
// 4.下载 excel
XLSX.writeFile(wb, "out.xlsx");
},
此时 origin 是一个对象,有两个属性 r 和 c,其中 r 代表 行(row),c 代表列(col),而他们都是从 0 开始计数的,所以 origin: { r: 1, c: 4 } 就表示从第二行第五列开始更新。
这是导出结果。
示例:origin 为 -1
origin 为 -1 代表从最底下的一行的第一列开始添加。
exportFile11() {
// 1.创建一个工作簿
let wb = XLSX.utils.book_new();
// 2.创建sheet对象
var ws = XLSX.utils.aoa_to_sheet(["SheetJS".split("")]);
XLSX.utils.sheet_add_aoa(
ws,
[
[1, 2],
[2, 3],
[3, 4],
],
{ origin: "A2" }
);
XLSX.utils.sheet_add_aoa(
ws,
[
[5, 6, 7],
[6, 7, 8],
[7, 8, 9],
],
{ origin: { r: 0, c: 0 } }
);
XLSX.utils.sheet_add_aoa(ws, [[4, 5, 6, 7, 8, 9, 0]], { origin: -1 });
// 3.将 sheet 对象插入工作簿
XLSX.utils.book_append_sheet(wb, ws, "sheetName");
// 4.下载 excel
XLSX.writeFile(wb, "out.xlsx");
},
此时更新内容有一项,代表从最底下的行的第一列开始更新一项内容。
这是导出结果。
示例:origin 为 (number >= 0)
表示从第 number + 1 行的第一列开始更新,因为从 0 开始数。
exportFile12() {
// 1.创建一个工作簿
let wb = XLSX.utils.book_new();
// 2.创建sheet对象
var ws = XLSX.utils.aoa_to_sheet(["SheetJS".split("")]);
XLSX.utils.sheet_add_aoa(
ws,
[
[1, 2],
[2, 3],
[3, 4],
],
{ origin: "A2" }
);
XLSX.utils.sheet_add_aoa(
ws,
[
[5, 6, 7],
[6, 7, 8],
[7, 8, 9],
],
{ origin: { r: 1, c: 4 } }
);
XLSX.utils.sheet_add_aoa(ws, [[4, 5, 6, 7, 8, 9, 0]], { origin: -1 });
XLSX.utils.sheet_add_aoa(ws, [[4, 5, 6, 7, 8, 9, 0]], { origin: 7 });
// 3.将 sheet 对象插入工作簿
XLSX.utils.book_append_sheet(wb, ws, "sheetName");
// 4.下载 excel
XLSX.writeFile(wb, "out.xlsx");
},
此时 origin 为 7,所以从第八行第一列开始更新。
这是导出结果。
8.XLSX.utils.table_to_sheet() 方式创建 Sheet 对象
(1) XLSX.utils.table_to_sheet
获取一个table DOM元素并且返回一个 Sheet 对象。
(2)接收的 table DOM元素什么数据格式,最后生成的 Sheet 表格就是什么格式。
比如:
<el-table
:data="tableData"
stripe
border
style="width: 500px; margin-top: 20px"
:cell-style="{ textAlign: 'center' }"
:header-cell-style="{ textAlign: 'center', background: 'pink' }"
id="sheetjs"
>
<el-table-column label="a" prop="a"></el-table-column
><el-table-column label="b" prop="b"></el-table-column
><el-table-column label="c" prop="c"></el-table-column
></el-table>
data() {
return {
tableData: [
{ a: 1, b: 2, c: 3 },
{ a: 1, b: 2, c: 3 },
{ a: 1, b: 2, c: 3 },
{ a: 1, b: 2, c: 3 },
],
};
},
此时的表格在页面是这样的。
我们进行导出。
exportFile13() {
// 1.创建一个工作簿
let wb = XLSX.utils.book_new();
// 2.创建sheet对象
var tbl = document.getElementById("sheetjs");
var ws = XLSX.utils.table_to_sheet(tbl);
// 3.将 sheet 对象插入工作簿
XLSX.utils.book_append_sheet(wb, ws, "sheetName");
// 4.下载 excel
XLSX.writeFile(wb, "out.xlsx");
},
这是导出结果。
(3) XLSX.utils.table_to_sheet
接收两个参数,除了 table DOM元素以外,还有一个配置参数。
除了上述的表格数据参数以外,还有一个配置参数。配置参数是一个对象,有以下几个属性:
属性 | 默认值 | 描述 |
raw | false | 如果值为true, 每一个单元格将会保存原始的字符串 |
dateNF | FMT 14 | 字符串输出使用指定的日期格式 |
cellDates | false | 存储日期为类型 d (默认是 n ) |
sheetRows | 0 | 如果值 >0, 读取表格的第一个sheetRows 行 |
display | false | 如果值为true, 隐藏的行和单元格将不会被解析 |
都不怎么用所以不做展示。
(4)拓展:XLSX.utils.table_to_book
基于工作表会产生一个最小的工作簿。
该方法跟前面导出 excel 不同,不需要按照步骤去创建工作簿,生成 sheet 对象,把 sheet 对象加入到工作簿中,而是直接生成一个工作簿,并且已经有 sheet 内容。但是该方法只能生成一个 sheet。
exportFile14() {
var tbl = document.getElementById("sheetjs");
var wb = XLSX.utils.table_to_book(tbl);
XLSX.writeFile(wb, "out.xlsx");
},
这是导出结果。
该方法也接收两个参数,除了 table DOM元素以外,还有一个配置参数,同 XLSX.utils.table_to_sheet 方法一样
。