前后端数据导入导出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

相关推荐
HelloWord~2 分钟前
SpringSecurity+vue通用权限系统
vue.js·spring boot
小小小小宇4 分钟前
二维数组按顺时针螺旋顺序
前端
安木夕23 分钟前
C#-Visual Studio宇宙第一IDE使用实践
前端·c#·.net
努力敲代码呀~25 分钟前
前端高频面试题2:浏览器/计算机网络
前端·计算机网络·html
高山我梦口香糖1 小时前
[electron]预脚本不显示内联script
前端·javascript·electron
神探小白牙1 小时前
vue-video-player视频保活成功确无法推送问题
前端·vue.js·音视频
简鹿办公1 小时前
Excel 表格内批量添加前缀与后缀的实用方法
excel·excel单元格统一加后缀文字
炸毛的飞鼠1 小时前
智警杯备赛--excel模块
excel
Angel_girl3192 小时前
vue项目使用svg图标
前端·vue.js
難釋懷2 小时前
vue 项目中常用的 2 个 Ajax 库
前端·vue.js·ajax