前后端数据导入导出Excel

一:导入

Excel有读取也便有写出,Hutool针对将数据写出到Excel做了封装。

原理

Hutool将Excel写出封装为ExcelWriter,原理为包装了Workbook对象,每次调用merge(合并单元格)或者write(写出数据)方法后只是将数据写入到Workbook,并不写出文件,只有调用flush或者close方法后才会真正写出文件。

由于机制原因,在写出结束后需要关闭ExcelWriter对象,调用close方法即可关闭,此时才会释放Workbook对象资源,否则带有数据的Workbook一直会常驻内存。

后端接口:参数response=》在response中去获得输出流,写出数据。

java 复制代码
 /**
     * 批量导出
     */

    @PostMapping("/export")
    public void exportData(HttpServletResponse response) throws IOException {

        ExcelWriter writer = ExcelUtil.getWriter(true);
        //1.全部导出   先查询所有数据
        List<SysOrderEntity> list = sysOrderService.list();
        //写出文件
        writer.write(list,true);

        //设置导出浏览器的格式
        response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=utf-8");


        //attachment 附件的形式下载    导出excel
        response.setHeader("Content-Disposition", "attachment; filename="
                + URLEncoder.encode("订单表", "UTF-8")+".xlsx");
        //创建输出流对象
        ServletOutputStream outputStream = response.getOutputStream();
        //刷新完毕之后,关闭输出流
        writer.flush(outputStream,true);
        writer.close();
        //双重保险进行关闭
        outputStream.flush();
        outputStream.close();

    }

前端操作按钮

XML 复制代码
<el-form-item>
	<el-button type="primary" plain @click="exportUser">导出</el-button>
</el-form-item>

导出时如果没有设置请求头token的值会出现如下问题

因此设置请求头时必不可少的。

headers:{

token: this.$cookie.get('token')

}

javascript 复制代码
	// 导出用户,通过blob
			exportUser () {
				axios({
					  method: 'post',
					  url: this.$http.adornUrl("/sys/order/export"),
					  responseType: 'blob',
                      headers:{
                        token: this.$cookie.get('token')
                      }
				  }).then((res) => {
					  c console.log(res)
                      //创建一个a标签  
					  const link = document.createElement('a')
                      // 规定文件类型 res就是返回的数据流,这里是excel类型
					  let blob = new Blob([res.data],{type: 'application/vnd.ms-excel'});
                      //设置标签的 style.display
					  link.style.display = 'none'
                      //设置地址    用于创建 URL 的 Blob 对象
					  link.href = URL.createObjectURL(blob);
					  console.log("href:"+link.href)
                      //生成随机数 作为文件名称
					  let num = ''
					  for(let i=0;i < 10;i++){
					   num += Math.ceil(Math.random() * 10)
					  }
					  link.setAttribute('download', num + '.xlsx')
                      //添加到树中
					  document.body.appendChild(link)
					  link. Click()x
					  document.body.removeChild(link)
				  }).catch(error => {
					  console.log(error)
				  })
				
			},		

还要注意的一点是,导出的Excel表格的表头是与实体类的属性相对应的。我们需要设置中文就必须加上@Alias设置别名。

导出结果如下:

二:导入

后端接口:

读取Excel内容的封装,通过构造ExcelReader对象,指定被读取的Excel文件、流或工作簿,然后调用readXXX方法读取内容为指定格式。

java 复制代码
/**
     * 导入
     */

    @PostMapping("/import")
    public void importData( MultipartFile file) throws Exception {
        ExcelReader reader = ExcelUtil.getReader(file.getInputStream());
        //读取到的数据放入List<>中
        List<SysOrderEntity> orderList = reader.readAll(SysOrderEntity.class);
        //持久化导数据库
        sysOrderService.saveBatch(orderList);
    }

前端:

:action="importUrl" 访问后端接口的路径地址。

:headers="tokenInfo" 请求头的设置(没有则会报401错误,无效令牌)

XML 复制代码
<el-form-item>
                <el-upload
                        :action="importUrl"
                        :headers="tokenInfo"
                        :beforeUpload="beforeUpload"
                        :showUploadList="false"
                        :multiple="true">
                    <el-button type="primary" @click="importU()"> 导入 </el-button>
                </el-upload> 
            </el-form-item>

选择Excel文件,导入

参考:

eeOffice文档操作(Hutool-poi) - Excel生成-ExcelWriter - 《Hutool v4.5.15 参考文档》 - 书栈网 · BookStack

相关推荐
阿成学长_Cain40 分钟前
Linux telinit 命令详解:运行级别切换|关机重启|系统维护一站式掌握
linux·运维·前端·网络
Patrick_Wilson1 小时前
最佳实践是有保质期的:从一次 CDN external 白屏事故说起
前端·性能优化·前端工程化
YHHLAI1 小时前
[特殊字符] Agent 智能体开发实战 · 第一课:Tool Use —— 让大模型自动干活
前端·人工智能
nuIl1 小时前
我把 5 个编码 Agent 塞进了一个 npm 包
前端·agent·claude
L-影2 小时前
FastAPI 静态文件:Web 页面的“固定展柜”与“加速引擎”
前端·fastapi
陪我去看海2 小时前
受够了 AI 写完代码留下一堆端口?我做了一个端口管理App!
前端·macos·vibecoding
Xuepoo2 小时前
我抛弃了 DOM,但保留了无障碍访问
前端
李明卫杭州2 小时前
Vue2 vs Vue3 的 h 函数:渲染函数完整迁移指南
前端
星栈2 小时前
LiveView 的认证系统:从登录到权限,我一开始以为有 `current_user` 就算完事了
前端·前端框架·elixir
在因斯坦2 小时前
摸摸鱼之前端自己研究 Jenkins 自动化部署
前端