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

4 篇文章 0 订阅

后端部分

一、先在项目中添加依赖
	  <dependency>
          <groupId>com.alibaba</groupId>
          <artifactId>easyexcel</artifactId>
          <version>3.0.5</version>
      </dependency>
二、创建实体类(对应要导出的数据字段)
EasyExcel控制表格注解
//设置 row 高度,不包含表头
//标记在 类上
@ContentRowHeight(15) //设置行高

//设置 表头 高度(与 @ContentRowHeight 相反)
//标记在 类上
@HeadRowHeight(20)  //设置表头高度

//设置列宽
//标记在属性上
@ColumnWidth(20)  //设置列宽

//设置表头信息
//value: 表名称
//index: 列号
@ExcelProperty(index = 0, value = "学生名字")

@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<DownloadData>
    EasyExcel.write(response.getOutputStream(), SuppliersExportDto.class)
                .autoCloseStream(Boolean.FALSE)
                .sheet("供应商信息")
                .doWrite(exportSuppliers);

示例图:
在这里插入图片描述

* 忽略某字段不导出

在类的最上方加上@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)
          })

示例图:
在这里插入图片描述

展示效果

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

【新增】 导出为CVS格式

使用EasyExcel导出CSV格式的文件时,仅用在write的时候指定一下excelType即可。
具体看图
在这里插入图片描述

   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必读

  • 8
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
实现上传excel文件并将数据传输到数据库的步骤如下: 1. 前端实现文件上传功能:使用Vue.js开发前端页面,使用element-ui组件库实现文件上传组件。具体实现可以参考element-ui的文档和示例代码。 2. 后端实现文件上传功能:使用Spring Boot框架开发后端接口,使用Apache POI或者EasyExcel解析Excel文件并将数据存入数据库。具体实现可以参考Spring Boot官方文档和EasyExcel的官方文档。 3. 前后端交互:前端页面通过Ajax请求后端接口上传文件,并将文件数据以form-data格式传输到后端。后端接口接收到请求后,解析Excel文件并将数据存入数据库,最后返回上传结果给前端。 下面是一个简单的示例代码,仅供参考: 前端代码: ```vue <template> <el-upload class="upload-demo" drag action="/api/upload" :before-upload="beforeUpload" :on-success="onSuccess" :on-error="onError" > <i class="el-icon-upload"></i> <div class="el-upload__text">将 Excel 文件拖到此处,或点击上传</div> <div class="el-upload__tip" slot="tip">仅支持 .xls 和 .xlsx 格式的 Excel 文件</div> </el-upload> </template> <script> export default { methods: { beforeUpload(file) { const isExcel = file.type === 'application/vnd.ms-excel' || file.type === 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'; if (!isExcel) { this.$message.error('只能上传 .xls 或 .xlsx 格式的 Excel 文件'); } return isExcel; }, onSuccess(response) { if (response.code === 0) { this.$message.success('上传成功'); } else { this.$message.error(`上传失败: ${response.msg}`); } }, onError(error) { this.$message.error(`上传失败: ${error.message}`); }, }, }; </script> ``` 后端代码: ```java @RestController @RequestMapping("/api") public class UploadController { @PostMapping("/upload") public Result<?> upload(@RequestParam("file") MultipartFile file) throws IOException { if (file.isEmpty()) { return Result.error("上传失败: 文件为空"); } String filename = file.getOriginalFilename(); String ext = FilenameUtils.getExtension(filename); if (!"xls".equals(ext) && !"xlsx".equals(ext)) { return Result.error("上传失败: 仅支持 .xls 或 .xlsx 格式的 Excel 文件"); } List<User> userList = new ArrayList<>(); Workbook workbook = WorkbookFactory.create(file.getInputStream()); Sheet sheet = workbook.getSheetAt(0); for (int i = 1; i <= sheet.getLastRowNum(); i++) { Row row = sheet.getRow(i); if (row == null) { continue; } User user = new User(); user.setName(row.getCell(0).getStringCellValue()); user.setAge((int) row.getCell(1).getNumericCellValue()); user.setGender(row.getCell(2).getStringCellValue()); userList.add(user); } userService.saveAll(userList); return Result.ok(); } } ``` 上述代码中,`UploadController`是一个Spring MVC的控制器类,用于处理上传文件的请求。`upload`方法接收一个`MultipartFile`类型的参数,即前端上传的文件数据。在方法中,我们首先判断文件是否为空,然后根据文件的扩展名判断是否为Excel文件。如果不是Excel文件,则返回上传失败的结果。否则,我们使用Apache POI库解析Excel文件,将数据转换成`User`对象并存入数据库。最后,返回上传成功的结果。 需要注意的是,上述代码中的`User`对象是一个自定义的Java类,用于存储Excel中的数据。在实际开发中,需要根据实际情况定义相应的Java类来存储数据。同时,还需要在Spring Boot的配置文件中配置数据库连接信息、数据源等相关信息。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

哒不溜-w

别给我打手续费太贵

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值