SheetJS(xlsx)导出 Excel 全流程(新手版)【SheetJS】

  • 每天收获一点点,今天是sheetjs!!

目录

理解Excel的结构

一个excel文件:

javascript 复制代码
Excel文件
  └── Workbook(工作簿)
          ├── Sheet1(工作表)
          ├── Sheet2
          └── Sheet3

在SheetJS里:

Excel概念 SheetJS对象
Excel文件 workbook
sheet页 worksheet
单元格 cell
javascript 复制代码
先创建worksheet -> 再放进workbook -> 最后导出writeFile

安装

npm:

javascript 复制代码
npm install xlsx

yarn:

javascript 复制代码
yarn add xlsx

完整流程简单例子:

javascript 复制代码
import * as XLSX from "xlsx";

// 1. 准备数据
const data = [
  ["姓名", "年龄"],
  ["张三", 18],
  ["李四", 20]
];

// 2. 生成 worksheet(工作表)
const ws = XLSX.utils.aoa_to_sheet(data);

// 3. 创建 workbook(Excel文件)
const wb = XLSX.utils.book_new();

// 4. 把 worksheet 添加到 workbook
XLSX.utils.book_append_sheet(wb, ws, "用户数据");

// 5. 导出 Excel
XLSX.writeFile(wb, "test.xlsx");

核心对象解释:

worksheet(工作表)

就是Excel里的一项,例如:

姓名 年龄
张三 18

对应:

javascript 复制代码
const ws = XLSX.utils.aoa_to_sheet(data);
console.log(ws);
// 打印出来的结果:
// {
//   A1: { v: '姓名' },
//   B1: { v: '年龄' },
//   A2: { v: '张三' },
//   B2: { v: 18 },
//  '!ref': 'A1:B3'
// }

字段解释:

字段 含义
A1 Excel 单元格
v value 值
!ref sheet范围

workbook(工作簿)

就是整个 Excel 文件

创建:(此时他还是空的)

javascript 复制代码
const wb = XLSX.utils.book_new();

三种创建 worksheet 的方式

详情页也可看 ➡️ 前端三种输入数据来源生成 worksheet(工作表)新手适用详细篇【SheetJS】

aoa_to_sheet(最底层)

javascript 复制代码
const ws = XLSX.utils.aoa_to_sheet([
  ["姓名", "年龄"],
  ["张三", 18]
]);

json_to_sheet(最常用)

javascript 复制代码
const ws = XLSX.utils.json_to_sheet([
  { name: "张三", age: 18 },
  { name: "李四", age: 20 }
]);

实际项目常见做法:

javascript 复制代码
const exportData = list.map(item => ({
  姓名: item.name,
  年龄: item.age
}));

const ws = XLSX.utils.json_to_sheet(exportData);

高级写法!!!!!(入坑不亏)

先定义"导出配置"

javascript 复制代码
const columns = [
  {
    title: "姓名",
    dataIndex: "name"
  },
  {
    title: "年龄",
    dataIndex: "age"
  }
];

统一做转换

javascript 复制代码
const exportData = list.map(item => {
  const row = {};

  columns.forEach(col => {
    row[col.title] = item[col.dataIndex];
  });

  return row;
});

table_to_sheet

HTML table 转 worksheet:

html 复制代码
<table id="demo">
  <tr>
    <th>姓名</th>
    <th>年龄</th>
  </tr>

  <tr>
    <td>张三</td>
    <td>18</td>
  </tr>
</table>
javascript 复制代码
const table = document.getElementById("demo");

const ws = XLSX.utils.table_to_sheet(table);

适合页面表格直接导出。

book_append_sheet 是什么

作用就是把 worksheet 添加到 workbook

参数 含义
wb workbook(Excel文件)
ws worksheet(sheet页)
"Sheet1" Excel底部tab名称
javascript 复制代码
XLSX.utils.book_append_sheet(
  wb,
  ws,
  "Sheet1"
);

多个 sheet

javascript 复制代码
const wb = XLSX.utils.book_new();

const ws1 = XLSX.utils.aoa_to_sheet([
  ["姓名", "年龄"]
]);

const ws2 = XLSX.utils.aoa_to_sheet([
  ["产品", "价格"]
]);

XLSX.utils.book_append_sheet(wb, ws1, "用户");

XLSX.utils.book_append_sheet(wb, ws2, "商品");

XLSX.writeFile(wb, "demo.xlsx");

结果:

javascript 复制代码
Excel
  ├── 用户
  └── 商品

writeFile 是什么

把 workbook 写成真正的 Excel 文件并下载:(浏览器-> 自动下载; Node.js->写入磁盘)

javascript 复制代码
XLSX.writeFile(wb, "test.xlsx");

常用设置项(重点)

设置列宽

javascript 复制代码
ws["!cols"] = [
  { wch: 20 },
  { wch: 10 }
];

效果:

宽度
A列 20
B列 10

设置杭高

javascript 复制代码
ws["!rows"] = [
  { hpx: 40 }
];

合并单元格

表示 A1:C1 合并

javascript 复制代码
ws["!merges"] = [
  {
    s: { r: 0, c: 0 },
    e: { r: 0, c: 2 }
  }
];

参数解释:

字段 含义
s start
e end
r row
c col

设置单元格格式

日期:

javascript 复制代码
ws["B2"].z = "yyyy-mm-dd";

保留两位小数:

javascript 复制代码
ws["B2"].z = "0.00";

设置超链接

javascript 复制代码
ws["A1"].l = {
  Target: "https://google.com"
};

设置公式

javascript 复制代码
ws["C2"] = {
  f: "SUM(A2:B2)"
};

Excel:=SUM(A2:B2)

项目完整流程:

javascript 复制代码
接口数据
   ↓
tableData
   ↓
map转换字段
   ↓
json_to_sheet
   ↓
worksheet
   ↓
设置列宽/格式/合并
   ↓
book_new
   ↓
book_append_sheet
   ↓
workbook
   ↓
writeFile
   ↓
Excel下载

真实案例:

javascript 复制代码
import * as XLSX from "xlsx";

const data = [
  {
    name: "张三",
    age: 18,
    score: 99
  },
  {
    name: "李四",
    age: 20,
    score: 88
  }
];

// 1. 转换导出数据
const exportData = data.map(item => ({
  姓名: item.name,
  年龄: item.age,
  分数: item.score
}));

// 2. 创建 worksheet
const ws = XLSX.utils.json_to_sheet(exportData);

// 3. 设置列宽
ws["!cols"] = [
  { wch: 20 },
  { wch: 10 },
  { wch: 10 }
];

// 4. 创建 workbook
const wb = XLSX.utils.book_new();

// 5. 添加 sheet
XLSX.utils.book_append_sheet(
  wb,
  ws,
  "用户统计"
);

// 6. 导出
XLSX.writeFile(
  wb,
  "用户统计.xlsx"
);

概念讲解

名称 本质
worksheet 一张 sheet
workbook 整个 Excel
writeFile 导出 Excel
book_append_sheet 把 sheet 放进 Excel
aoa/json/table_to_sheet 创建 worksheet
相关推荐
Dxy123931021610 小时前
MySQL索引完整教程:创建、查看、修改、删除与日常管理
前端·javascript·mysql
端庄的战斗机11 小时前
javascript 设计模式(文章很长,请自备瓜子,水果和眼药水)
开发语言·javascript·设计模式
前端毕业班14 小时前
uni-app 小程序支持 teleport 了
前端·javascript·vue.js
东风破_14 小时前
LLM 为什么记不住你?无状态、messages 和上下文管理
javascript·人工智能
Hilaku15 小时前
前端架构师的克制:什么时候该坚决对新技术说不?
前端·javascript·程序员
古夕16 小时前
多应用同域部署下 Favicon 异常问题排查与治理
前端·javascript
逗逗豆巴吧16 小时前
WPS 加载项中实现当前文档直接上传
前端·javascript·ecmascript 6
妙码生花16 小时前
从 PHP 到 AI + Golang,程序员自救转型手记(二十一):网络请求封装优化
前端·javascript·vue.js
用户114818678948416 小时前
普通Fetch、Fetch流式、Axios、SSE:谁才是流式输出的正确操作?
前端·javascript
谷哥的小弟17 小时前
TypeScript数组类型
javascript·typescript