基于poi3.17使用easyexcel导出 含前后端

本文详细介绍了如何在基于SpringBoot和Vue的应用中,结合element-ui和easyexcel库,利用poi3.17版本实现数据导出功能,包括实体类中的自定义注解和导出参数的处理。
摘要由CSDN通过智能技术生成

依赖导入

我使用的是2.2.7版本

springboot+vue(element-ui)

最底下贴一个poi3.17的导出
        <!-- excel -->
		<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>
		<dependency>
			<groupId>com.alibaba</groupId>
			<artifactId>easyexcel</artifactId>
			<version>2.2.7</version>
		</dependency>

实体类

包含许多注解:

@Data
@EqualsAndHashCode
@Accessors(chain = false)
@TableName("register")
public class Register implements Serializable {

private static final long serialVersionUID = 1L;

自动生成器生成,和导出无关

@TableField注解也是
@ExcelColumn注解:使用poi导出使用的自定义注解

参考poi 3.17 导入excel文件-CSDN博客

@ColumnWidth(20)

设置导出单元格列宽(默认列宽8.43)

@Data
@EqualsAndHashCode
@Accessors(chain = false)
@TableName("register")
public class Register implements Serializable {

    private static final long serialVersionUID = 1L;

    /**
     * 主键id
     */
    @ExcelIgnore
    @TableId(value = "id", type = IdType.AUTO)
    private Long id;

    /**
     * 维修申请单id
     */
    @ExcelProperty("维修申请单id")
    @ExcelColumn("维修申请单id")
    @TableField("note_id")
    private Long noteId;

    /**
     * 故障表现
     */
    @ColumnWidth(20)
    @ExcelProperty("故障表现")
    @ExcelColumn("故障表现")
    @TableField("fault_behavior")
    private String faultBehavior;

    /**
     * 维修方案
     */
    @ColumnWidth(20)
    @ExcelProperty("维修方案")
    @ExcelColumn("维修方案")
    @TableField("rep_plan")
    private String repPlan;

    /**
     * 维修开始时间
     */
    @ColumnWidth(20)
    @ExcelProperty("维修开始时间")
    @ExcelColumn("维修开始时间")
    @TableField("rep_start_time")
    private Date repStartTime;

    /**
     * 维修结束时间红灯结束时间
     */
    @ColumnWidth(20)
    @ExcelProperty("维修结束时间红灯结束时间")
    @ExcelColumn("维修结束时间红灯结束时间")
    @TableField("end_time")
    private Date endTime;

    /**
     * 维修时间
     */
    @ExcelIgnore
    @TableField("rep_time")
    private Long repTime;

    /**
     * 红灯开始时间
     */
    @ColumnWidth(20)
    @ExcelProperty("红灯开始时间")
    @ExcelColumn("红灯开始时间")
    @TableField("red_start_time")
    private Date redStartTime;

    /**
     * 红灯时长
     */
    @ExcelIgnore
    @TableField("red_time")
    private Long redTime;

    /**
     * 联系方式
     */
    @ColumnWidth(20)
    @ExcelProperty("联系方式")
    @ExcelColumn("联系方式")
    @TableField("phone")
    private String phone;

    /**
     * 设备故障码
     */
    @ExcelProperty("设备故障码")
    @ExcelColumn("设备故障码")
    @TableField("fault_code")
    private String faultCode;

    /**
     * 用户id(技术工id)
     */
    @ExcelProperty("用户id")
    @ExcelColumn("用户id")
    @TableField("sys_user_id")
    private Long sysUserId;

    /**
     * 技术工姓名
     */
    @ExcelProperty("技术工姓名")
    @ExcelColumn("技术工姓名")
    @TableField("sys_username")
    private String sysUsername;

    /**
     * 逻辑删除
     */
    @ExcelIgnore
    @TableLogic
    @TableField("`delete`")
    private Integer delete;

    /**
     * 创建时间
     */
    @ColumnWidth(20)
    @ExcelProperty("创建时间")
    @ExcelColumn("创建时间")
    @TableField("create_time")
    private Date createTime;

    /**
     * 修改时间
     */
    @ExcelIgnore
    @TableField("update_time")
    private Date updateTime;

    /**
     * 创建者id
     */
    @ExcelIgnore
    @TableField("create_by")
    private Long createBy;

    /**
     * 修改者id
     */
    @ExcelIgnore
    @TableField("update_by")
    private Long updateBy;

    /**
     * mybatis的忽略这个字段
     */
    @ColumnWidth(20)
    @ExcelProperty("维修时间")
    @ExcelColumn("维修时间")
    @TableField(exist = false)
    private String repTimeChar;

    @ColumnWidth(20)
    @ExcelProperty("红灯时长")
    @ExcelColumn("红灯时长")
    @TableField(exist = false)
    private String redTimeChar;

}

后端代码control

纯导出不传值则@RequestParam Map<String, Object> params可不写

    /**
     * 根据时间导出,easyExcel
     * @param response
     * @param params 操作工,时间区间前后
     * @throws Exception
     */
    @RequestMapping("/outPutEasyExcel")
    public void outPutEasyExcel(HttpServletResponse response,@RequestParam Map<String, Object> params) throws Exception {
        // 这个是业务数据,根据你想查的数据传值查询
        List<Register> registerList = registerService.listByUserId(params);

        // 这里注意 有同学反应使用swagger 会导致各种问题,请直接用浏览器或者用postman
        response.setContentType("application/vnd.ms-excel");
        response.setCharacterEncoding("utf-8");
        // 这里URLEncoder.encode可以防止中文乱码 当然和easyexcel没有关系
        String fileName = URLEncoder.encode("测试", "UTF-8");
        response.setHeader("Content-disposition", "attachment;filename=" + fileName + ".xlsx");
        EasyExcel.write(response.getOutputStream(), Register.class).sheet("模板").doWrite(registerList);
    }

前端代码

printHandle 是放在method里的方法(异步请求)
this.$http是封装的方法,可以使用axis,方法大差不差

    <el-form
      :inline="true"
      :model="dataForm"
      @keyup.enter.native="printHandle()"
    >
      <el-form-item>
        <el-select
          size="small"
          v-model="userId"
          placeholder="请选择维修工"
          clearable=""
          filterable
        >
          <el-option
            v-for="d in users"
            :key="d.userId"
            :label="d.username"
            :value="d.userId"
          ></el-option>
        </el-select>
      </el-form-item>
      <el-form-item
        label=""
        prop="start"
      >
        <el-date-picker
          size="small"
          v-model="start"
          type="datetime"
          placeholder="筛选开始时间"
          value-format="yyyy-MM-dd HH:mm:ss"
        >
        </el-date-picker>
      </el-form-item>
      <el-form-item
        label=""
        prop="end"
      >
        <el-date-picker
          size="small"
          v-model="end"
          type="datetime"
          placeholder="筛选结束时间"
          value-format="yyyy-MM-dd HH:mm:ss"
        >
        </el-date-picker>
      </el-form-item>
      <el-form-item>
        <el-button
          type="success"
          round
          @click="printHandle()"
        >打印
        </el-button>
      </el-form-item>
    </el-form>



放在method里的方法(异步请求)
this.$http是封装的方法,可以使用axis,方法大差不差
    // 导出数据
    printHandle () {
      if (!this.start || !this.end) {
        this.$message.error('请选择开始时间和结束时间')
      } else if (this.start > this.end) {
        this.$message.error('开始时间要小于结束时间')
      } else {
        this.$http({

          url: this.$http.adornUrl('/register/outPutEasyExcel'),
          method: 'get',
          responseType: 'blob', // 指定响应类型为 blob,以便处理二进制数据
          params: this.$http.adornParams({
            'userId': !this.userId ? 0 : this.userId,
            'start': this.start,
            'end': this.end
          })
        }).then(({ data }) => {
          // 创建一个新的 Blob 对象
          const blob = new Blob([data], { type: 'application/vnd.ms-excel' })
          // 创建一个 <a> 标签
          const link = document.createElement('a')
          // 设置下载的文件名
          const fileName = '故障库.xlsx'
          link.href = window.URL.createObjectURL(blob)
          link.setAttribute('download', fileName)
          link.download = fileName
          document.body.appendChild(link)
          // 模拟点击下载链接
          link.click()
          // 释放 URL 对象
          window.URL.revokeObjectURL(link.href)
          document.body.removeChild(link)
          this.$message({
            message: '操作成功',
            type: 'success',
            duration: 1500
          })
        })
      }
    },

poi3.17导出后端

前端用的同一个

    /**
     * 根据时间导出,poi3.17导出
     * @param response
     * @param params 操作工,时间区间前后
     * @throws Exception
     */
    @RequestMapping("/outPutExcel")
    public void outPutExcel(HttpServletResponse response,@RequestParam Map<String, Object> params) throws Exception {
        // 这个是业务数据
        List<Register> tmps = registerService.listByUserId(params);

        // 每次写100行数据,就刷新数据出缓存
        Workbook wb = new SXSSFWorkbook(100); // keep 100 rows in memory,
        Sheet sh = wb.createSheet("sheet1");

        String[] titles = { "主键id", "维修申请单id" , "故障表现", "维修方案", "维修开始时间", "维修结束时间红灯结束时间", "维修时间", "红灯开始时间", "红灯时长", "设备故障码", "技术工姓名", "联系方式", "创建时间"};
        Row row = sh.createRow(0);
        // 第一行设置标题
        for (int i = 0; i < titles.length; i++) {
            String title = titles[i];
            Cell cell1 = row.createCell(i);
            cell1.setCellValue(title);
        }

        // 导出数据
        for (int rowNum = 0; rowNum < tmps.size(); rowNum++) {

            Row rowData = sh.createRow(rowNum + 1);
            // 根据业务来进行填写数据
            Register tmp = tmps.get(rowNum);
            // 第一列
            Cell cellDataA = rowData.createCell(0);
            cellDataA.setCellValue(tmp.getId());
            // 第二列
            Cell cellDataB = rowData.createCell(1);
            cellDataB.setCellValue(tmp.getNoteId());

            Cell cellDataC = rowData.createCell(2);
            cellDataC.setCellValue(tmp.getFaultBehavior());

            Cell cellDataD = rowData.createCell(3);
            cellDataD.setCellValue(tmp.getRepPlan());

            DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            Cell cellDataE = rowData.createCell(4);
            if (null != tmp.getRepStartTime())
                cellDataE.setCellValue(df.format(tmp.getRepStartTime()));

            Cell cellDataF = rowData.createCell(5);
            if (null != tmp.getEndTime())
                cellDataF.setCellValue(df.format(tmp.getEndTime()));

            Cell cellDataG = rowData.createCell(6);
            cellDataG.setCellValue(tmp.getRepTimeChar());

            Cell cellDataH = rowData.createCell(7);
            if (null != tmp.getRedStartTime())
                cellDataH.setCellValue(df.format(tmp.getRedStartTime()));

            Cell cellDataI = rowData.createCell(8);
            cellDataI.setCellValue(tmp.getRedTimeChar());

            Cell cellDataJ = rowData.createCell(9);
            cellDataJ.setCellValue(tmp.getFaultCode());

            Cell cellDataK = rowData.createCell(10);
            cellDataK.setCellValue(tmp.getSysUsername());

            Cell cellDataL = rowData.createCell(11);
            cellDataL.setCellValue(tmp.getPhone());

            Cell cellDataM = rowData.createCell(12);
            cellDataM.setCellValue(tmp.getCreateTime());
            if (null != tmp.getCreateTime())
                cellDataM.setCellValue(df.format(tmp.getCreateTime()));


        }

        String fileName = "文件名称.xlsx";
        //这是导出xls格式
//        response.setContentType("application/vnd.ms-excel");
        //这是导出xlsx格式
        response.setCharacterEncoding("utf-8");
        response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
        response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8"));
        wb.write(response.getOutputStream());
        wb.close();
    }

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值