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

本文涉及的产品
云解析 DNS,旗舰版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
全局流量管理 GTM,标准版 1个月
简介: 本文介绍了用于处理Excel文件的库——ExcelJS,相较于SheetJS,ExcelJS支持更高级的样式自定义且易于使用。表格对比显示,ExcelJS在样式设置、内存效率及流式操作方面更具优势。主要适用于Node.js环境,也支持浏览器端使用。文中详细展示了如何利用ExcelJS实现前端的Excel导出下载和上传解析功能,并提供了示例代码。此外,还提供了在线调试的仓库链接和运行命令,方便读者实践。

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

下面对比了Exceljs和Sheetjs:

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

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

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

前端实现Excel导出下载

先来看下功能演示,如下图把表格中的数据下载到excel文件中
image.png

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));
}
AI 代码解读

这段代码实现的功能是:

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

前端实现Excel上传解析

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

image.png

这里使用antd的Upload组件获取到file文件对象,你可以可以使用原生的<input>标签来上传。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>
AI 代码解读

获取到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;
}
AI 代码解读

下面解释一下这段代码

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

在线调试

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

运行演示命令:

cd exceljs-demo/
npm i
npm run dev
AI 代码解读
目录
打赏
0
3
5
0
35
分享
相关文章
|
13天前
|
【2025优雅草开源计划进行中01】-针对web前端开发初学者使用-优雅草科技官网-纯静态页面html+css+JavaScript可直接下载使用-开源-首页为优雅草吴银满工程师原创-优雅草卓伊凡发布
【2025优雅草开源计划进行中01】-针对web前端开发初学者使用-优雅草科技官网-纯静态页面html+css+JavaScript可直接下载使用-开源-首页为优雅草吴银满工程师原创-优雅草卓伊凡发布
31 1
【2025优雅草开源计划进行中01】-针对web前端开发初学者使用-优雅草科技官网-纯静态页面html+css+JavaScript可直接下载使用-开源-首页为优雅草吴银满工程师原创-优雅草卓伊凡发布
FastExcel:开源的 JAVA 解析 Excel 工具,集成 AI 通过自然语言处理 Excel 文件,完全兼容 EasyExcel
FastExcel 是一款基于 Java 的高性能 Excel 处理工具,专注于优化大规模数据处理,提供简洁易用的 API 和流式操作能力,支持从 EasyExcel 无缝迁移。
268 9
FastExcel:开源的 JAVA 解析 Excel 工具,集成 AI 通过自然语言处理 Excel 文件,完全兼容 EasyExcel
SpringBoot操作Excel实现单文件上传、多文件上传、下载、读取内容等功能
SpringBoot操作Excel实现单文件上传、多文件上传、下载、读取内容等功能
236 8
|
3月前
|
Java实现导出多个excel表打包到zip文件中,供客户端另存为窗口下载
Java实现导出多个excel表打包到zip文件中,供客户端另存为窗口下载
186 4
前端界面生成PDF并导出下载
【10月更文挑战第21天】利用合适的第三方库,你可以在前端轻松实现界面生成 PDF 并导出下载的功能,为用户提供更方便的文档分享和保存方式。你还可以根据具体的需求进一步优化和定制生成的 PDF 文件,以满足不同的业务场景要求。
SpringBoot中大量数据导出方案:使用EasyExcel并行导出多个excel文件并压缩zip后下载
在SpringBoot环境中,为了优化大量数据的Excel导出体验,可采用异步方式处理。具体做法是将数据拆分后利用`CompletableFuture`与`ThreadPoolTaskExecutor`并行导出,并使用EasyExcel生成多个Excel文件,最终将其压缩成ZIP文件供下载。此方案提升了导出效率,改善了用户体验。代码示例展示了如何实现这一过程,包括多线程处理、模板导出及资源清理等关键步骤。
不走弯路,纯前端如何把图片导出成视频!
【10月更文挑战第3天】不走弯路,纯前端如何把图片导出成视频!
172 3
吐血整理:纯前端如何实现批量dom转图片,并下载成压缩包
【10月更文挑战第2天】吐血整理:纯前端如何实现批量dom转图片,并下载成压缩包
99 2
前端实战:基于Verdaccio搭建私有npm仓库,轻松上传与下载自定义npm插件包
前端实战:基于Verdaccio搭建私有npm仓库,轻松上传与下载自定义npm插件包
232 0
前端基于XLSX实现数据导出到Excel表格,以及提示“文件已经被损坏,无法打开”的解决方法
前端基于XLSX实现数据导出到Excel表格,以及提示“文件已经被损坏,无法打开”的解决方法
343 0

热门文章

最新文章

  • 1
    【11】flutter进行了聊天页面的开发-增加了即时通讯聊天的整体页面和组件-切换-朋友-陌生人-vip开通详细页面-即时通讯sdk准备-直播sdk准备-即时通讯有无UI集成的区别介绍-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
    13
  • 2
    【08】flutter完成屏幕适配-重建Android,增加GetX路由,屏幕适配,基础导航栏-多版本SDK以及gradle造成的关于fvm的使用(flutter version manage)-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
    24
  • 3
    详解智能编码在前端研发的创新应用
    17
  • 4
    巧用通义灵码,提升前端研发效率
    16
  • 5
    智能编码在前端研发的创新应用
    12
  • 6
    【07】flutter完成主页-完成底部菜单栏并且做自定义组件-完整短视频仿抖音上下滑动页面-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草央千澈
    10
  • 7
    大前端之前端开发接口测试工具postman的使用方法-简单get接口请求测试的使用方法-简单教学一看就会-以实际例子来说明-优雅草卓伊凡
    28
  • 8
    VSCode AI提效工具,通义灵码前端开发体验
    71
  • 9
    【09】flutter首页进行了完善-采用android studio 进行真机调试开发-增加了直播间列表和短视频人物列表-增加了用户中心-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
    10
  • 10
    以项目登录接口为例-大前端之开发postman请求接口带token的请求测试-前端开发必学之一-如果要学会联调接口而不是纯写静态前端页面-这个是必学-本文以优雅草蜻蜓Q系统API为实践来演示我们如何带token请求接口-优雅草卓伊凡
    13
  • 推荐镜像

    更多
    AI助理

    你好,我是AI助理

    可以解答问题、推荐解决方案等