看这篇博客之前需要先学习ExeclUitls的入门

点击链接进入

https://blog.csdn.net/kuyuyingzi/article/details/21472977

业务场景

根据页面选择的id,将对应的id对应的实体类传入后端接口,后端接口匹配对应的Execl模板文档,使用ExeclUtils进行映射,导出选择数据的文档。

技术实现

前端:Vue
后端:SpringBoot

前端

设置按钮

<el-buttontype="danger"@click="exportExecl"icon="el-icon-delete"buttonCode="TY007"
>导出</el-button>

导入

<scprit>import axios from "axios";
</scprit>

导出文件事件

<scprit>
export default {//导出文件exportExecl() {console.log(this.ids);axios({method: "post",url: this.api.testExeclExport, //接口地址data: [{id: this.ids               //传入接口数据}],responseType: "blob"}).then(response => {this.download(response.data, "测试");  //调用下载事件}).catch(error => {console.log("错误信息: " + JSON.stringify(error));});}
};
</scprit>

下载事件

 // 根据模板下载文件
download(data, projDocName) {if (!data) {return;}// console.log("下载excel文档!!!!  ")let url = window.URL.createObjectURL(new Blob([data]));let link = document.createElement("a");link.style.display = "none";link.href = url;link.setAttribute("download", projDocName + ".xls");document.body.appendChild(link);link.click();
}

后端

POM文件

导入 execlUtils 相关jar

<!--POI-->
<dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>3.17</version>
</dependency><dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>3.17</version>
</dependency<!-- ExeclUtils工具类 started --><dependency><groupId>com.github.hxbkx</groupId><artifactId>ExcelUtils</artifactId><version>1.4.2</version></dependency>

ExeclExportController

@RestController
@RequestMapping("/api/agt/execl")
@CrossOrigin
public class ExeclExportController {@AutowiredExeclExportService execlExportService;/*** 根据模板导出文件(测试)* @return*/@PostMapping(value="/execlexport")public void  exportexecl(@RequestBody String body, HttpServletRequest request ,HttpServletResponse response){execlExportService.exportexecl(body,request,response);}}

ExeclExportService

public interface ExeclExportService {/*** 根据模板导出文件(测试)* @param body* @param request* @param response*/void exportexecl(String body, HttpServletRequest request, HttpServletResponse response);
}

ExeclExportServiceImpl

1、contractOutReasonService,projectFileTemplateMapper为相关业务实体类及mapper类,可替换成符合的类或者写死测试2、fileTemplate.getFileContent():该模板是存在数据库中的file_content字段,类型为longblob3、FileNIOUtils:工具类,用于生成模板的临时文件路径
package com.bohee.pageoffice.service.impl;import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.annotation.TableName;
import com.bohee.module.agt.contractoutreason.entity.ContractOutReason;
import com.bohee.module.agt.contractoutreason.service.IContractOutReasonService;
import com.bohee.module.system.sysfiletemplate.dao.SysProjectFileTemplateMapper;
import com.bohee.module.system.sysfiletemplate.entity.SysProjectFileTemplate;
import com.bohee.pageoffice.service.ExeclExportService;
import com.bohee.pageoffice.utils.FileNIOUtils;
import net.sf.excelutils.ExcelUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.ByteArrayInputStream;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;/*** <p>*    服务实现类:Execl导出* </p>** @author syd* @since 2019-05-29*/
@Service
public class ExeclExportServiceImpl implements ExeclExportService {@AutowiredIContractOutReasonService contractOutReasonService;@AutowiredSysProjectFileTemplateMapper projectFileTemplateMapper;@Overridepublic void exportexecl(String body, HttpServletRequest request, HttpServletResponse response) {//---- 组装数据 started -----Object[] objects = assemblyDate(body);List details = new ArrayList<>();for(int i = 0;i<objects.length;i++){ContractOutReason obj = contractOutReasonService.getById(objects[i].toString());details.add(obj);}ExcelUtils.addValue("printDate", new Date());ExcelUtils.addValue("list", details);//---- 组装数据 end -----ServletOutputStream outputStream = null;try {outputStream = response.getOutputStream();//模板路径//String path ="http://192.168.1.83/group1/M00/00/00/wKgBU1z30F-AJdOUAABMAP0SjPA352.xls";//查询对应的模板文件字节SysProjectFileTemplate projectFileTemplate = new SysProjectFileTemplate();projectFileTemplate.setTableName(getTableName(new ContractOutReason()));projectFileTemplate.setFileName("ContractOutReasonTemplate");projectFileTemplate.setTemplateName("ContractOutReasonTemplate");SysProjectFileTemplate fileTemplate = projectFileTemplateMapper.selectByUnionParameter(projectFileTemplate);//将字节转换为流byte[] fileContent = fileTemplate.getFileContent();InputStream stream = new ByteArrayInputStream(fileContent);// 生成模板的临时文件路径String tmpFileUrl = FileNIOUtils.copyByStream(stream, request, response);response.reset();//避免空行response.setContentType("application/x-msdownload");response.setHeader("Content-disposition", "attachment; filename=" + new String(tmpFileUrl.getBytes("utf-8"), "iso-8859-1"));ExcelUtils.export(tmpFileUrl, outputStream);outputStream.close();} catch (Exception e) {e.printStackTrace();}}/*** 功能:解析数据* @param body* @return*/public Object[] assemblyDate(String body){JSONArray jsonArray = JSONArray.parseArray(body);JSONObject obj = jsonArray.getJSONObject(0);Object[] ids = obj.getJSONArray("id").toArray();return ids;}/*** 获取对象对应的表名* @param targetObject* @return*/private String getTableName(Object targetObject) {Class<?> aClass = targetObject.getClass();return aClass.getAnnotation(TableName.class).value();}}

FileNIOUtils工具类

采用NIO方式对文件的操作,主要功能根据文件流生成临时文件到临时目录下,并返回。

public class FileNIOUtils {/*** 功能:根据路径,产生一份新的临时文件到临时目录下,并返回文件路径* @param inputStream 流* @param request* @param response* @return* @throws IOException*/public static String copyByStream(InputStream inputStream, HttpServletRequest request, HttpServletResponse response){Map<String, Object> map = CopyFile(inputStream, request, response);return map.get("path").toString();}/*** 功能:根据流,产生一份新的临时文件到临时目录下,并返回流* @param inputStream 流* @param request* @param response* @return* @throws IOException*/public static OutputStream copyToSteam(InputStream inputStream, HttpServletRequest request, HttpServletResponse response) throws IOException {Map<String, Object> map = CopyFile(inputStream, request, response);return (OutputStream) map.get("stream");}/*** 根据路径,产生一份新的临时文件到临时目录下,并返回文件路径和流* @param inputStream* @param request* @param response* @return*/public static Map<String,Object> CopyFile(InputStream inputStream, HttpServletRequest request, HttpServletResponse response){FileChannel outChannel = null;BufferedInputStream dis = null;FileOutputStream fos = null;String folderOut = null;try {//---生成临时文件 started ---//生成临时文件String folderOutId = java.util.UUID.randomUUID().toString();folderOut = System.getProperty("java.io.tmpdir") + folderOutId + ".xls";//创建文件File fileOut = new File(folderOut);fileOut.createNewFile();//----生成临时文件 end----dis = new BufferedInputStream(inputStream);fos = new FileOutputStream(folderOut);//获取通道outChannel = fos.getChannel();//分配指定大小的缓冲区ByteBuffer buf = ByteBuffer.allocate(2048);byte[] dst = new byte[buf.limit()];int bytesRead;//将通道中的数据存入缓冲区中while (-1 != (bytesRead = dis.read(dst, 0, dst.length))) {//切换读取数据的模式buf.flip();buf = ByteBuffer.wrap(dst);//将缓冲区中的数据写入通道中outChannel.write(buf);//清空缓冲区buf.clear();}}catch (IOException e){e.printStackTrace();}finally {//关闭流try {outChannel.close();dis.close();fos.close();}catch (IOException e){e.printStackTrace();}}Map<String,Object> map = new HashMap<>();map.put("path",folderOut);map.put("stream",fos);return map;}

EXECL模板文件

生成日期:${printDate}                    合同外编码                合同外原因                 备注
#foreach detail in ${list}      ${detail.reasonCode}    ${detail.reasonDescription} ${detail.description}
#end        说明:printDate与list,均在前面service已经加入--->
ExcelUtils.addValue("printDate", new Date());
ExcelUtils.addValue("list", details);

Java实现Execl导出相关推荐

  1. Java execl导出

    java execl导出 SXSSFWorkbook public void test(List<Map<String, String>> cellcytokinesInfoM ...

  2. java 操作execl添加边框

    java 操作execl添加边框 使用poi导出execl时想要有网格的样式时,可以使用下面的方法进行对execl添加边框,下面的方法会保留原execl模板设置的样式 /*** 抽取的实现粗边框的方法 ...

  3. Java:Java编程实现导出二维码

    Java:Java编程实现导出二维码 目录 输出结果 代码设计 输出结果 更新-- 代码设计 public class QRCodeUtil {private static final String ...

  4. java导入、导出Excel文件

    一.介绍 当前B/S模式已成为应用开发的主流,而在企业办公系统中,常常有客户这样子要求:你要把我们的报表直接用Excel打开(电信系统.银行系统).或者是:我们已经习惯用Excel打印.这样在我们实际 ...

  5. java图片的导出,并压缩

    java图片的导出,并压缩 java 压缩包jar包使用的是commons-compress-1.6.jar /*** 导出图片* @param request* @param response*/@ ...

  6. java poi pdf 导出

    java poi pdf 导出 (java poi pdf导出 文字+图片两张放置一行) 思路:流传入图片 ,pdf没有行的概念,只有列即为一行,两张图片可以先建立一列在一列总再建立两列各放置一张图片 ...

  7. java利用poi导出excel功能-附带图片导出

    java利用poi导出excel功能-附带图片导出 写在前面 最近刚离职,闲来无事,于是把上两家公司都有碰到过的需求但都没有去研究实现:即导出带图片的excel报表.于是就折腾了一下这个功能,研究出来 ...

  8. java中Excel导出echart图片

    java中Excel导出echart图片 1.在生成echart的前端代码生成图片代码后Echart.setOption(captestRcapEchartOption, true);后面加上以下代码 ...

  9. java Excel导入导出工具类 及使用demo

    java Excel导入导出工具类 及使用demo 前言:相信进来的都是想尽快解决问题的,话不多说,按照以下步骤来,可以操作导出excel到本地,导入同理,自行学习.步骤一:直接复制以下excel工具 ...

最新文章

  1. extjs 4 tab panel得strip在IE下右偏解决办法
  2. 80%以上Javaer可能不知道的一个Spring知识点
  3. Codevs 2296 仪仗队 2008年省队选拔赛山东
  4. C语言--在终端输入多行信息,找出包含“ould”的行,并打印改行
  5. ARM中断分析之四:WinCE的OAL层的中断分析
  6. Pycharm选择pyenv安装的Python版本
  7. java 合并csv_用java将三个csv表格文件,整合数据组合成一个文件。
  8. Linux系统编程 -- volatile关键字
  9. 一、二线城市 IT 公司大盘点!建议收藏
  10. 仿百度导航跟随效果demo效果示例(整理)
  11. ThingsBoard 多个设备的最新遥测数据合并计算案例
  12. Kubernetes部署(七):k8s项目交付----(4)日志收集
  13. html怎么制作小黄人,【PS教程】制作一个小黄人
  14. android仿空间短视频播放
  15. RTThread从底层AT组件到上层SAL之间的关系
  16. android 短信 app下载,云短信app下载安装-云短信 安卓版v2.0.0-PC6安卓网
  17. 三类传感器助力保证无人驾驶安全
  18. multisim变压器反馈式_负反馈放大电路与Multisim仿真学习笔记
  19. 会议聊天室--开发文档
  20. Midas MeshFree 2020 R1中文版

热门文章

  1. opendir、readdir以及使用
  2. 解决模拟器安装不了apk
  3. 摩托车无钥匙启动的好处
  4. How to generate the 8660_msimage.mbn
  5. echarts 柱状图设置边框_series组件
  6. FPGA数值的表示与运算
  7. adb操作系统开关命令
  8. 项目管理交流分享~~
  9. jmeter登录退出
  10. oracle 僵死的进程,Oracle Instance僵死导致不能正常恢复