easyExcel 导出
需要引入的maven
<dependency> <groupId>com.alibaba</groupId> <artifactId>easyexcel</artifactId> <version>2.1.6</version> </dependency> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml</artifactId> <version>3.17</version> </dependency> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml-schemas</artifactId> <version>3.17</version> </dependency> <dependency> <groupId>org.apche.poi</groupId> <artifactId>poi</artifactId> <version>3.17</version> </dependency>
后台代码
/** /** * 导出excel * @param formInfoEntityList * @param response */ @PostMapping("/exportTargetDataResult") @ApiOperationSupport(order = 7) @ApiOperation(value = "导出", notes = "") public void exportTargetDataResult(@RequestBody List<ContractFormInfoEntity> formInfoEntityList, HttpServletResponse response) { if(CollectionUtil.isNotEmpty(formInfoEntityList)){ /* 导出文件名称 */ String fileName = "合同归档信息导出"; WriteSheet sheet1 = new WriteSheet(); /* 导出的sheet的名称 */ sheet1.setSheetName("合同归档信息导出"); sheet1.setSheetNo(0); /* 需要存入的数据 */ List<List<Object>> data = new ArrayList<>(); /* formInfoEntityList 表示要写入的数据 因为是前台显示列表 由前台进行传值,后期可以根据自己的需求进行改变 */ for(ContractFormInfoEntity contractFormInfoEntity:formInfoEntityList){ /* 属性 cloumns 表示一行,cloumns包含的数据是一行的数据 要将一行的每个值 作为list的一个属性存进到list里 ,数据要和展示的excel表头一致*/ List<Object> cloumns = new ArrayList<Object>(); /* 合同名称 */ cloumns.add(contractFormInfoEntity.getContractName()); /* 币种 */ cloumns.add(contractFormInfoEntity.getCurrencyCategory()); /* 合同金额 */ cloumns.add(contractFormInfoEntity.getContractAmount()); /* 创建人 */ cloumns.add(contractFormInfoEntity.getCreateUser()); /* 创建时间 */ cloumns.add(contractFormInfoEntity.getCreateTime()); /* 创建部门标识 */ cloumns.add(contractFormInfoEntity.getCreateDept()); /* 合同一级分类 */ cloumns.add(contractFormInfoEntity.getContractBigCategory()); /* 合同二级分类 */ cloumns.add(contractFormInfoEntity.getContractSmallCategory()); data.add(cloumns); } /* 表头名称,excel的表头 一个list对象为一行里的一个表头名称 */ List<List<String>> headList = new ArrayList<List<String>>(); /* 此处表头为一行要显示的所有表头,要和数据的顺序对应上 需要转换为list */ List<String> head = Arrays.asList("合同名称", "币种", "合同金额","创建人", "创建时间", "创建部门标识","合同一级分类","合同二级分类"); /* 为了生成一个独立的list对象,所进行的初始化 */ List<String> head2 =null; for( String head1:head){ head2 = new ArrayList<>(); /* 将表头的数据赋值进入list对象 */ head2.add(head1); /* 将数据赋值进入最终要输出的表头 */ headList.add(head2); } try { response.setContentType("application/vnd.ms-excel"); response.setCharacterEncoding(Charsets.UTF_8.name()); fileName = URLEncoder.encode(fileName, Charsets.UTF_8.name()); response.setHeader("Content-disposition", "att achment;filename=" + fileName + ".xlsx"); EasyExcel.write(response.getOutputStream()).head(headList).sheet().doWrite(data); }catch (IOException e) { e.printStackTrace(); } } }
前台代码
配置文件:axios
axios.interceptors.response.use(res => { ..... const headers = res.headers; if (headers['content-type'] === 'application/octet-stream;charset=utf-8') { return res } return res; ...... }, error => { NProgress.done(); return Promise.reject(new Error(error)); });
js 文件
// 导出excel export const getExportTarget = (params) => { return request({ url: '/api/blade-contract/archive/exportTargetDataResult', method: 'post', data: params, responseType: "blob" }) }
vue 文件
// 导出 exportData(){ getExportTarget(this.tableData).then((res) => { // 将文件流转成blob形式 const blob = new Blob([res.data], {type: 'application/vnd.ms-excel'}) let filename = '归档文件导出.xls' // 创建一个超链接,将文件流赋进去,然后实现这个超链接的单击事件 const elink = document.createElement('a') elink.download = filename elink.style.display = 'none' elink.href = URL.createObjectURL(blob) document.body.appendChild(elink) elink.click() URL.revokeObjectURL(elink.href) // 释放URL 对象 document.body.removeChild(elink) }) }