excel 数据处理简介
excel 是广泛应用于办公场景的数据处理软件。
在日常开发中,我们常需在后台管理系统中实现数据的导入与导出功能,以便与 excel 文件进行交互。
使用 exceljs 库进行 excel 数据处理
exceljs 简介
在 node.js 环境和浏览器中,我们常用 exceljs 这个包来解析和生成 excel 文件。该包在 npm 官网上每周有超过 30 万的下载量,足见其受欢迎程度。
环境搭建
mkdir exceljs-test cd exceljs-test npm init -y
安装 exceljs:
npm install exceljs
新建 data.xlsx:
从 excel 文件读取数据
工作表结构遵循层级关系:workbook(工作簿)> worksheet(工作表)> row(行)> cell(单元格)。通过遍历这些层级,我们可以获取所有数据:
// 引入 exceljs 库 const { workbook } = require('exceljs'); // 异步函数读取 excel 文件 async function main() { // 创建一个workbook实例,用于处理excel文件 const workbook = new workbook(); // 从指定路径读取excel文件 const databook = await workbook.xlsx.readfile('./data.xlsx'); // 遍历excel中的每个工作表 databook.eachsheet((sheet, index1) => { console.log('工作表 ' + index1); // 遍历每个工作表中的每行数据 sheet.eachrow((row, index2) => { const rowdata = []; // 用于存储当前行的数据 row.eachcell((cell, index3) => { // 遍历当前行的每个单元格,并将值存储到rowdata数组中 rowdata.push(cell.value); }); console.log('行 ' + index2, rowdata); }); }); } main();
node 运行:
我们已经解析出 excel 数据了。
exceljs 还提供了简便的方法,可以直接调用 worksheet 的 getsheetvalues 来拿到表格数据,不用自己遍历:
这就是解析 excel 文件。
导入数据的时候,按照格式从中解析数据然后存入数据库就行。
一般我们都会提供一个 excel 模版,用这个模版来填数据,然后再导入。
数据导出
使用 exceljs 进行数据导出:
const { workbook } = require('exceljs'); async function main() { // 创建一个新的工作簿 const workbook = new workbook(); // 添加一个新的工作表,命名为'hong' const worksheet = workbook.addworksheet('hong'); // 定义工作表的列结构 worksheet.columns = [ { header: 'id', key: 'id', width: 20 }, { header: '姓名', key: 'name', width: 40 }, { header: '年龄', key: 'age', width: 20 }, ]; // 数据数组,用于填充工作表 const data = [ { id: 1, name: '探春', age: 18 }, { id: 2, name: '迎春', age: 19 }, { id: 3, name: '惜春' }, ]; // 向工作表中添加数据行 worksheet.addrows(data); // 将工作簿保存为excel文件 workbook.xlsx.writefile('./data2.xlsx'); } main();
运行后产生的 data2.xlsx 如下:
我们可以遍历行和列,对特定单元格进行样式设置,如字体、背景色、边框等。
比如通过 cell.style 可以设置 font、fill、border、alignment 这些。
在浏览器中使用 exceljs 库解析 excel 文件
创建 index.html,引入 exceljs 包:
<!doctype html> <html lang="en"> <head> <!-- 加载exceljs库 --> <script src="https://unpkg.com/exceljs@4.4.0/dist/exceljs.min.js"></script> </head> <body> <!-- 文件选择输入框 --> <input id="fileinput" type="file" /> <script> const fileinput = document.getelementbyid('fileinput'); // 文件选择变化时的处理逻辑 fileinput.onchange = async () => { // 获取选中的文件 const file = fileinput.files[0]; const { workbook } = exceljs; const workbook = new workbook(); const loadedworkbook = await workbook.xlsx.load(file); loadedworkbook.eachsheet((sheet, index1) => { console.log('工作表' + index1); const value = sheet.getsheetvalues(); console.log(value); }); }; </script> </body> </html>
启动静态服务器:
npx http-server .
同样解析出了 excel 的内容。
在浏览器中使用 exceljs 库生成 excel 文件并下载
然后再试试生成 excel:
这里我创建了一个 10m 的 arraybuffer 来写入数据,之后再读取。
<!doctype html> <html lang="en"> <head> <meta charset="utf-8" /> <script src="https://unpkg.com/exceljs@4.4.0/dist/exceljs.min.js"></script> </head> <body> <script> const { workbook } = exceljs; async function main() { // 创建一个新的工作簿 const workbook = new workbook(); // 添加一个新的工作表,命名为'hong' const worksheet = workbook.addworksheet('hong'); // 定义工作表的列结构 worksheet.columns = [ { header: 'id', key: 'id', width: 20 }, { header: '姓名', key: 'name', width: 40 }, { header: '年龄', key: 'age', width: 20 }, ]; // 数据数组,用于填充工作表 const data = [ { id: 1, name: '宝玉', age: 18 }, { id: 2, name: '宝钗', age: 19 }, { id: 3, name: '黛玉' }, ]; worksheet.addrows(data); // 将工作簿写入 arraybuffer 并下载 const buffer = new arraybuffer(10 * 1024 * 1024); // 分配足够大的内存空间 const res = await workbook.xlsx.writebuffer(buffer); download(res.buffer); } function download(arraybuffer) { const link = document.createelement('a'); // 创建 blob 对象并生成 url const blob = new blob([arraybuffer]); const url = url.createobjecturl(blob); link.href = url; // 设置下载的文件名 link.download = 'honglou.xlsx'; // 插入链接到页面并触发点击下载 document.body.appendchild(link); link.click(); // 下载完成后移除链接 link.addeventlistener('click', () => { link.remove(); }); } main(); // 在页面加载完毕后执行 window.onload = generateexcel; </script> </body> </html>
和前面的逻辑一样,只是把 writefile 换成了 writebuffer。
在浏览器中打开 index.html,excel 文件将自动生成并下载:
到此这篇关于nodejs使用exceljs实现excel导入导出的文章就介绍到这了,更多相关nodejs excel导入导出内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论