当前位置:首页 » 《关于电脑》 » 正文

【exceljs】纯前端如何实现Excel导出下载和上传解析?

19 人参与  2024年10月19日 11:20  分类 : 《关于电脑》  评论

点击全文阅读


前段时间写过一篇类似的文章,介绍了sheetjs。最近发现了一个更好用的库ExcelJS,它支持高级的样式自定义,并且使用起来也不复杂。实际上sheetjs也支持高级自定义样式,不过需要使用付费版。

下面对比了Exceljs和Sheetjs:

特性ExcelJSSheetJS (xlsx)
写入样式支持单元格的样式设置(字体、颜色、边框等)不支持样式设置
图表支持不支持不支持
内存效率适合处理较大文件,支持流式写入与读取处理大文件时内存占用较高,需要手动优化
流式操作支持(如流式写入、读取大文件)不支持流式操作,适用于小到中型数据集的处理
社区与文档文档详尽,社区活跃社区活跃,文档相对较简单
适用场景适合需要丰富样式、较大数据集处理的场景适合快速操作小型文件,支持更多文件格式

ExcelJS主要用于Node.js环境,它是一个Node.js库。因此,它的核心功能是为Node.js应用程序提供操作Excel文件的接口。虽然ExcelJS本身是为Node.js设计的,但它也提供了在浏览器端使用的版本。

这里我们主要来介绍浏览器端的使用方式,还是通过下载和上传来演示这个库的常规用法,更多功能可以参考文档:
https://github.com/exceljs/exceljs/blob/master/README_zh.md

前端实现Excel导出下载

先来看下功能演示,如下图把表格中的数据下载到excel文件中
在这里插入图片描述

export const exportExcel = (data: DataType[] ) => {    const headerStyle = {        font: {            name: 'Arial',            family: 4,            size: 12,            bold: true,            // color: { argb: 'FF0000' }        },        fill: {            type: 'pattern',            pattern: 'solid',            // fgColor: { argb: 'FFFF00' },            // bgColor: { argb: 'FFFF00' }        },        alignment: {            vertical: 'middle',            horizontal: 'center'        },        border: {            top: {style: 'thin', color: {argb: '000000'}},            left: {style: 'thin', color: {argb: '000000'}},            bottom: {style: 'thin', color: {argb: '000000'}},            right: {style: 'thin', color: {argb: '000000'}}        }    };    const headerTitle = ['APP', '名称', '作品数']    const workbook = new ExcelJS.Workbook();    const ws = workbook.addWorksheet("Sheet1")    ws.addRow(headerTitle)        .eachCell((cell) => {            // eslint-disable-next-line @typescript-eslint/ban-ts-comment            // @ts-expect-error            cell.style = headerStyle        })    data.forEach(it=> {        ws.addRow(Object.values({            app: it.app,            name: it.name,            works: it.works        }))    })    ws.columns = headerTitle.map((header) => ({        header, key: header, width: 20    }))    workbook.xlsx.writeBuffer()        .then(buffer => {            // 创建 Blob 对象            const blob = new Blob([buffer], {type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'});            // 创建下载链接            const url = window.URL.createObjectURL(blob);            const a = document.createElement('a');            a.href = url;            a.download = `exceljs.xlsx`;            a.click();            // 清理 URL            setTimeout(() => {                window.URL.revokeObjectURL(url);                a.remove();            }, 100);        })        .catch(err => console.error('Error creating file:', err));}

这段代码实现的功能是:

使用ExcelJS.Workbook()创建一个Workbook对象使用addWorksheet("Sheet1")向Workbook中添加一个sheet使用addRow方法先加入表头,再使用eachCell为表头单元格设置样式,后面添加数据也是使用这个方法最后通过模拟点击a标签下载xlsx

前端实现Excel上传解析

将上面下载的excel文件再次上传解析

在这里插入图片描述

这里使用antd的Upload组件获取到file文件对象,你可以可以使用原生的标签来上传。beforeUpload是上传前调用这个方法, 我们的目的是获取到file对象,没有必要把文件真的上传到服务器,所以返回值为false,表示不再执行后续上传动作了。

<Upload    multiple    showUploadList={false}    action="/"    beforeUpload={async (file) => {        const excelData = await uploadExcel(file);        setTableData([...tableData, ...excelData])        return false;    }}>    <Button>上传Excel</Button></Upload>

获取到file对象就传递给exceljs来解析文件,代码如下:

export const uploadExcel = async (file: File) => {    const arrayBuffer = await file.arrayBuffer()    const tableData: DataType[] = [];    const workbook = new ExcelJS.Workbook();    try {        await workbook.xlsx.load(arrayBuffer);        // 获取第一个工作表        const worksheet = workbook.getWorksheet(1);        // 读取工作表中的数据        worksheet?.eachRow({includeEmpty: true}, (row, rowNumber) => {            console.log(`Row ${rowNumber}:`, row.values);            // 去掉表头            if (rowNumber > 1) {                tableData.push({                    key: rowNumber.toString(),                    // eslint-disable-next-line @typescript-eslint/ban-ts-comment                    // @ts-expect-error                    app: row.values[1].trim(),                    // eslint-disable-next-line @typescript-eslint/ban-ts-comment                    // @ts-expect-error                    name: row.values[2].trim(),                    // eslint-disable-next-line @typescript-eslint/ban-ts-comment                    // @ts-expect-error                    works: row.values[3].trim()                })            }        });    } catch (error) {        console.error('Error loading workbook:', error);    }    console.log(tableData);    return tableData;}

下面解释一下这段代码

使用ExcelJS.Workbook()创建一个workbook对象使用workbook.xlsx.load(arrayBuffer)将文件对象解码workbook.getWorksheet(1)获取到xls文件的第一个sheet使用worksheet?.eachRow方法获取到每行与单元格

在线调试

仓库和在线访问:https://stackblitz.com/~/github.com/fullee/exceljs-demo

运行演示命令:

cd exceljs-demo/npm inpm run dev

点击全文阅读


本文链接:http://zhangshiyu.com/post/174019.html

<< 上一篇 下一篇 >>

  • 评论(0)
  • 赞助本站

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

最新文章

  • 祖母寿宴,侯府冒牌嫡女被打脸了(沈屿安秦秀婉)阅读 -
  • 《雕花锦年,昭都旧梦》(裴辞鹤昭都)完结版小说全文免费阅读_最新热门小说《雕花锦年,昭都旧梦》(裴辞鹤昭都) -
  • 郊区41号(许洛竹王云云)完整版免费阅读_最新全本小说郊区41号(许洛竹王云云) -
  • 负我情深几许(白诗茵陆司宴)完结版小说阅读_最热门小说排行榜负我情深几许白诗茵陆司宴 -
  • 九胞胎孕妇赖上我萱萱蓉蓉免费阅读全文_免费小说在线看九胞胎孕妇赖上我萱萱蓉蓉 -
  • 为保白月光,侯爷拿我抵了债(谢景安花田)小说完结版_完结版小说全文免费阅读为保白月光,侯爷拿我抵了债谢景安花田 -
  • 陆望程映川上官硕《我的阿爹是带攻略系统的替身》最新章节阅读_(我的阿爹是带攻略系统的替身)全章节免费在线阅读陆望程映川上官硕
  • 郑雅琴魏旭明免费阅读_郑雅琴魏旭明小说全文阅读笔趣阁
  • 头条热门小说《乔书意贺宴临(乔书意贺宴临)》乔书意贺宴临(全集完整小说大结局)全文阅读笔趣阁
  • 完结好看小说跨年夜,老婆初恋送儿子故意出车祸_沈月柔林瀚枫完结的小说免费阅读推荐
  • 热推《郑雅琴魏旭明》郑雅琴魏旭明~小说全文阅读~完本【已完结】笔趣阁
  • 《你的遗憾与我无关》宋怀川冯洛洛无弹窗小说免费阅读_免费小说大全《你的遗憾与我无关》宋怀川冯洛洛 -

    关于我们 | 我要投稿 | 免责申明

    Copyright © 2020-2022 ZhangShiYu.com Rights Reserved.豫ICP备2022013469号-1