SpringBoot+VUE使用EasyExcel(alibaba)导出excel、cvs,并在浏览器下载文件、忽略某字段不导出、status字段转换

大纲

    • 后端部分
        • 一、先在项目中添加依赖
        • 二、创建实体类(对应要导出的数据字段)
        • 三、写方法、实现方法(controller、service、impl什么什么的我就不展示出来了)
      • * 忽略某字段不导出
      • * 状态字段值(0,1,2)转换成字符串("未知","状态2","状态3")
    • 前端部分
      • 调用后台方法
      • 展示效果
  • 【新增】 导出为CVS格式

后端部分

一、先在项目中添加依赖

	  <dependency>
          <groupId>com.alibabagroupId>
          <artifactId>easyexcelartifactId>
          <version>3.0.5version>
      dependency>

二、创建实体类(对应要导出的数据字段)

@ExcelProperty(value = "合同编号") value中的值对应导出excel表的表头
@JsonFormat 处理Date 类型

import com.alibaba.excel.annotation.ExcelProperty;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;

import java.util.Date;

/**
 * 供应商导出信息
 * author: 哒不溜
 */
@Data
public class SuppliersExportDto {

    @ExcelProperty(value = "合同编号")
    private String supplierCode;

    @ExcelProperty(value = "供应商ID")
    private Long supplierId;

    @ExcelProperty(value = "公司名称")
    private String companyName;

    @ExcelProperty(value = "店铺")
    private String supplierName;

    @ExcelProperty(value = "地址")
    private String address;

    @ExcelProperty(value = "绑定手机号")
    private String mobile;

    @ExcelProperty(value = "客服电话")
    private String tel;

    @ExcelProperty(value = "供应商分类")
    private String taxType;

    @ExcelProperty(value = "供应商状态")
    private String supplierStatus;

    @ExcelProperty(value = "审核状态")
    private String aduitingStatus;

    @JsonFormat(
            pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8"
    )
    @ExcelProperty(value = "申请时间")
    private Date aduitingCreateTime;

    @ExcelProperty(value = "银行名称")
    private String bank;

    @ExcelProperty(value = "账户名字")
    private String bankName;

    @ExcelProperty(value = "银行账号")
    private String bankCode;

    @ExcelProperty(value = "开户银行网点")
    private String bankOutlets;

}

三、写方法、实现方法(controller、service、impl什么什么的我就不展示出来了)

实现方法:具体可看:easyExcel官方文档

	// 这里的 ContentType 要和前端请求携带的 ContentType 相对应
    response.setContentType("application/vnd.ms-excel;charset=utf-8");
    response.setCharacterEncoding("utf-8");
    // DownloadData 是实体类,sheet 里面是 sheet 名称,doWrite 里面放要写入的数据,类型为 List
    EasyExcel.write(response.getOutputStream(), SuppliersExportDto.class)
                .autoCloseStream(Boolean.FALSE)
                .sheet("供应商信息")
                .doWrite(exportSuppliers);

示例图:
SpringBoot+VUE使用EasyExcel(alibaba)导出excel、cvs,并在浏览器下载文件、忽略某字段不导出、status字段转换_第1张图片

* 忽略某字段不导出

在类的最上方加上@ExcelIgnoreUnannotated 注解即可;
这个注解的意思是:忽略不加@ExcelProperty的字段进行输出

@ExcelIgnoreUnannotated
public class HsbSettlementDto {
	// 加了@ExcelProperty注解的字段就导出,没加的不会导出
    private String none;

    @ExcelProperty(value = "会导出")
    private String outStr;
    
	...
}

* 状态字段值(0,1,2)转换成字符串(“未知”,“状态2”,“状态3”)

写一个内部类或者新建一个类 以下导入的包都是com.alibaba.excel.里的

	/**
     * 导出 状态转换
     */
    @Data
    public static class statusConverter implements Converter<Integer> {
        public statusConverter() {}
        @Override
        public Class supportJavaTypeKey() {
            return Integer.class;
        }

        @Override
        public CellDataTypeEnum supportExcelTypeKey() {
            return CellDataTypeEnum.STRING;
        }
	   @Override
	   public Integer convertToJavaData(CellData cellData, ExcelContentProperty excelContentProperty, GlobalConfiguration globalConfiguration) throws Exception {
        // 将excel的数据类型转为java数据类型
        //我这里没用到就没写了,之后用到再记录
	       return null;
	   }
	   // 转换值
	   @Override
	   public WriteCellData<String> convertToExcelData(Integer value, ExcelContentProperty contentProperty, GlobalConfiguration globalConfiguration) {
	           String str = "未知";
	           if (value.equals(0)) {
	               str = "待支付";
	           } else if (value.equals(1)) {
	               str = "待分账";
	           } else if (value.equals(2)) {
	               str = "已分账";
	           }
	           return new WriteCellData<>(str);
	       }
    }

然后再在字段上引用: converter = 新建类类名.class

	/**
     * 分账状态
     */
    @ExcelProperty(value = "结算状态", converter = statusConverter.class)
    private Integer status;

前端部分

写个导出按钮绑定点击事件就不展示代码了

调用后台方法

          this.$http({
          	// 调用后台路径
            url: '/supplier/supplierAuditing/exportSupplierData',
            method: 'POST',
            data:{ //data传入你需要的数据,不用管我的个人行为
              supplierIds: ids.join(","),
              param: this.searchForm 
            },
              responseType: 'blob' // 解决文件下载乱码问题
          }).then(({ data }) => {            
            let objectUrl = data
            // 这里的type和后端请求携带的 ContentType 相对应
            const blob = new Blob([data], {type:'application/vnd.ms-excel;charset=utf-8'});
            objectUrl = URL.createObjectURL(blob);
            const a = document.createElement("a");
            a.href = objectUrl;
            // 定义文件名
            a.download = "供应商列表.xlsx";
            a.click();
            a.remove();
            URL.revokeObjectURL(objectUrl)
          })

示例图:
SpringBoot+VUE使用EasyExcel(alibaba)导出excel、cvs,并在浏览器下载文件、忽略某字段不导出、status字段转换_第2张图片

展示效果

SpringBoot+VUE使用EasyExcel(alibaba)导出excel、cvs,并在浏览器下载文件、忽略某字段不导出、status字段转换_第3张图片
SpringBoot+VUE使用EasyExcel(alibaba)导出excel、cvs,并在浏览器下载文件、忽略某字段不导出、status字段转换_第4张图片
SpringBoot+VUE使用EasyExcel(alibaba)导出excel、cvs,并在浏览器下载文件、忽略某字段不导出、status字段转换_第5张图片

【新增】 导出为CVS格式

使用EasyExcel导出CSV格式的文件时,仅用在write的时候指定一下excelType即可。
具体看图
SpringBoot+VUE使用EasyExcel(alibaba)导出excel、cvs,并在浏览器下载文件、忽略某字段不导出、status字段转换_第6张图片

   EasyExcel.write(fileName, DemoData.class)
            // 指定导出类型为csv			有乱码情况可以设置一下编码格式
            .excelType(ExcelTypeEnum.CSV).charset(Charset.forName("GBK"))
            .sheet("模板")
            .doWrite(() -> {
                // 分页查询数据
                return data();
            });

兼容性问题 读取文件务必使用2.0.5+
2.0.0-beta1到2.0.2有小概率会丢失数字

具体可看:easyExcel必读

你可能感兴趣的:(java,vue,spring,boot,vue.js,javascript)