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
相关推荐
King禅1 小时前
JavaScript 调试实战指南:从 console.log 到 DevTools 深度运用
javascript
全栈项目管理程序猿1 小时前
ArcGIS JS 基础教程(28):图层渲染顺序管理
前端·javascript
扶风ff1 小时前
练题簿在线免费刷题:创建个人任务,把刷题、听题和模考目标放到每天的学习中
开发语言·javascript·学习·小程序
asong2 小时前
没有源代码,AI 也能拆解软件:这个开源项目已有 3.7 万 Star
javascript·后端·github
用户1733598075372 小时前
纯前端 PDF 压平避坑指南:压平后表单字段变了?
前端·javascript·vue.js
葡萄城技术团队2 小时前
在 DSH 中直接查看和编辑 Excel:dsh-spreadjs-editor 开源插件发布
excel
用户298698530142 小时前
React 中实现 Word 与 Markdown 双向转换的实践记录
javascript·react.js·markdown
OpsEye3 小时前
大模型会话里的手机号、身份证,怎么自动脱敏?
javascript·ai编程
开开心心就好3 小时前
视频里的图片怎么提取?双击一下就导出
java·前端·人工智能·spring·智能手机·intellij-idea·excel
爱喝水的小周3 小时前
实验十 Vue‑Router 王者荣耀战绩查询 APP 开发实践
前端·javascript·vue.js