关于java:笑小枫的SpringBoot系列十三JAVA使用EasyExcel导出excel

4次阅读

共计 7153 个字符,预计需要花费 18 分钟才能阅读完成。

性能背景

简略的说下这个性能的背景需要吧,有相似需要的能够复用,果然导入还没写完,导出的性能接踵而来,一块写了吧

  • 实现 excel 导出(仍旧废话 …)
  • 多个 sheet 页一起导出
  • 第一个 sheet 页数据表头信息有两行
  • 款式略微好看,列宽能够自定义等
  • 数据量略微有些大(多个 sheet 页总量 50w 左右)

我的项目引入依赖

如果是从上一篇看过去的,就不必看我的项目引入了🙈

gradle:

compile "com.alibaba:easyexcel:3.1.0"

maven:

<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>easyexcel</artifactId>
    <version>3.1.0</version>
</dependency>

留神:3+ 版本的的 easyexcel,应用 poi 5+ 版本时,须要手动排除:poi-ooxml-schemas,例如:

<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>easyexcel</artifactId>
    <version>3.1.0</version>
    <exclusions>
        <exclusion>
            <artifactId>poi-ooxml-schemas</artifactId>
            <groupId>org.apache.poi</groupId>
        </exclusion>
    </exclusions>
</dependency>

我的项目编码

如多个表格款式雷同,可编写一个父类,将款式定义在父类上,子类继承父类即可。

  • config.bean.excel 包下定义经销商信息对象ExportCompany.java,代码如下👇
package com.maple.demo.config.bean.excel;

import com.alibaba.excel.annotation.ExcelProperty;
import com.alibaba.excel.annotation.write.style.ColumnWidth;
import com.alibaba.excel.annotation.write.style.ContentFontStyle;
import com.alibaba.excel.annotation.write.style.HeadFontStyle;
import com.alibaba.excel.annotation.write.style.HeadStyle;
import com.alibaba.excel.enums.poi.FillPatternTypeEnum;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.util.Date;

/**
 * @author 笑小枫
 * @date 2022/7/22
 */
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@HeadStyle(fillPatternType = FillPatternTypeEnum.SOLID_FOREGROUND, fillForegroundColor = 40)
@HeadFontStyle(fontHeightInPoints = 12)
@ContentFontStyle(fontHeightInPoints = 11)
@ColumnWidth(20)
public class ExportCompany {

    // -------------------- 根本信息 start -------------

    @ExcelProperty({"根本信息", "公司名称"})
    private String companyName;

    @ExcelProperty({"根本信息", "省份"})
    private String province;

    @ExcelProperty({"根本信息", "成立工夫"})
    private Date startDate;

    @ExcelProperty({"根本信息", "企业状态"})
    private String entStatus;

    @ColumnWidth(30)
    @ExcelProperty({"根本信息", "博客地址"})
    private String csdnAddress;

    // ---------------- 根本信息 end ---------------------

    // ---------------- 经营信息 start ---------------------

    @ExcelProperty({"经营信息", "员工数"})
    private String employeeMaxCount;

    @ExcelProperty({"经营信息", "网站地址"})
    private String netAddress;

    @ExcelProperty({"经营信息", "所属区域省"})
    private String businessProvinceName;

    @ExcelProperty({"经营信息", "所属区域市"})
    private String businessCityName;

    @ExcelProperty({"经营信息", "所属区域区县"})
    private String businessAreaName;

    // ---------------- 经营信息 end ---------------------
}
  • config.bean.excel 包下定义联系人信息对象ExportContact.java,代码如下👇
package com.maple.demo.config.bean.excel;

import com.alibaba.excel.annotation.ExcelProperty;
import com.alibaba.excel.annotation.write.style.ColumnWidth;
import com.alibaba.excel.annotation.write.style.ContentFontStyle;
import com.alibaba.excel.annotation.write.style.HeadFontStyle;
import com.alibaba.excel.annotation.write.style.HeadStyle;
import com.alibaba.excel.enums.poi.FillPatternTypeEnum;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

/**
 * @author 笑小枫
 * @date 2022/7/22
 */
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@HeadStyle(fillPatternType = FillPatternTypeEnum.SOLID_FOREGROUND, fillForegroundColor = 40)
@HeadFontStyle(fontHeightInPoints = 12)
@ContentFontStyle(fontHeightInPoints = 11)
@ColumnWidth(20)
public class ExportContact {@ExcelProperty("公司名称")
    private String companyName;

    @ExcelProperty("姓名")
    private String name;

    @ExcelProperty("身份证号码")
    private String idCard;

    @ExcelProperty("电话号码")
    private String mobile;

    @ExcelProperty("职位")
    private String contactPostName;
}
  • controller 包下编写 TestExportExcelController.java 进行测试,代码如下:
package com.maple.demo.controller;

import com.alibaba.excel.EasyExcelFactory;
import com.alibaba.excel.ExcelWriter;
import com.alibaba.excel.write.metadata.WriteSheet;
import com.maple.demo.config.bean.excel.ExportCompany;
import com.maple.demo.config.bean.excel.ExportContact;
import io.swagger.annotations.Api;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpServletResponse;
import java.io.OutputStream;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

/**
 * @author 笑小枫
 * @date 2022/7/22
 */
@Slf4j
@RestController
@RequestMapping("/example")
@Api(tags = "实例演示 - 导出 Excel")
public class TestExportExcelController {@GetMapping("/exportExcel")
    public void exportExcel(HttpServletResponse response) {try (OutputStream out = response.getOutputStream()) {response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
            response.setCharacterEncoding("utf-8");
            String fileName = URLEncoder.encode("笑小枫测试导出", "UTF-8").replaceAll("\\+", "%20");
            response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + fileName + ".xlsx");
            handleExcel(out);
            out.flush();} catch (Exception e) {log.error(e.getMessage());
        }
    }

    private void handleExcel(OutputStream out) {try (ExcelWriter excelWriter = EasyExcelFactory.write(out).build()) {WriteSheet dealerSheet = EasyExcelFactory.writerSheet(0, "经销商信息").head(ExportCompany.class).build();
            WriteSheet contactSheet = EasyExcelFactory.writerSheet(1, "联系人").head(ExportContact.class).build();
            excelWriter.write(getCompany(), dealerSheet);
            excelWriter.write(getContact(), contactSheet);
        }
    }

    private List<ExportCompany> getCompany() {List<ExportCompany> companyList = new ArrayList<>();
        for (int i = 0; i < 5; i++) {companyList.add(ExportCompany.builder()
                    .companyName("笑小枫公司" + i)
                    .province("上海市")
                    .businessProvinceName("山东省")
                    .businessCityName("临沂市")
                    .businessAreaName("河东区")
                    .entStatus("营业")
                    .netAddress("www.xiaoxiaofeng.site")
                    .csdnAddress("https://zhangfz.blog.csdn.net")
                    .employeeMaxCount("100")
                    .startDate(new Date())
                    .build());
        }
        return companyList;
    }

    private List<ExportContact> getContact() {List<ExportContact> contactList = new ArrayList<>();
        for (int i = 0; i < 5; i++) {contactList.add(ExportContact.builder()
                    .companyName("笑小枫公司" + i)
                    .name("笑小枫" + i)
                    .mobile("183000000000")
                    .idCard("371324199011111111")
                    .contactPostName("后端")
                    .build());
        }
        return contactList;
    }
}

测试后果

浏览器申请:http://localhost:8080/example/exportExcel

经销商 sheet 页信息:

联系人 sheet 页信息:

相干属性解读

注解

  • ExcelProperty index 指定写到第几列,默认依据成员变量排序。value指定写入的名称,默认成员变量的名字,多个 value 能够参照疾速开始中的简单头
  • ExcelIgnore 默认所有字段都会写入 excel,这个注解会疏忽这个字段
  • DateTimeFormat 日期转换,将 Date 写到 excel 会调用这个注解。外面的 value 参照java.text.SimpleDateFormat
  • NumberFormat 数字转换,用 Number 写 excel 会调用这个注解。外面的 value 参照java.text.DecimalFormat
  • ExcelIgnoreUnannotated 默认不加ExcelProperty 的注解的都会参加读写,加了不会参加

参数

通用参数

WriteWorkbook,WriteSheet ,WriteTable都会有的参数,如果为空,默认应用下级。

  • converter 转换器,默认加载了很多转换器。也能够自定义。
  • writeHandler 写的处理器。能够实现WorkbookWriteHandler,SheetWriteHandler,RowWriteHandler,CellWriteHandler,在写入 excel 的不同阶段会调用
  • relativeHeadRowIndex 间隔多少行后开始。也就是结尾空几行
  • needHead 是否导出头
  • headclazz 二选一。写入文件的头列表,倡议应用 class。
  • clazzhead 二选一。写入文件的头对应的 class,也能够应用注解。
  • autoTrim 字符串、表头等数据主动 trim

WriteWorkbook(了解成 excel 对象)参数

  • excelType 以后 excel 的类型 默认xlsx
  • outputStreamfile 二选一。写入文件的流
  • fileoutputStream 二选一。写入的文件
  • templateInputStream 模板的文件流
  • templateFile 模板文件
  • autoCloseStream 主动敞开流。
  • password 写的时候是否须要应用明码
  • useDefaultStyle 写的时候是否是应用默认头

WriteSheet(就是 excel 的一个 Sheet)参数

  • sheetNo 须要写入的编码。默认 0
  • sheetName 须要些的 Sheet 名称,默认同sheetNo

WriteTable(就把 excel 的一个 Sheet, 一块区域看一个 table)参数

  • tableNo 须要写入的编码。默认 0

写在最初

本文只是用到局部性能,简略的做了一下总结,更多的性能,能够去官网查阅。

官网文档:https://www.yuque.com/easyexcel/doc/read

应用 EasyExcel 导入 excel:https://www.xiaoxiaofeng.com/archives/springboot12

对于笑小枫💕

本章到这里完结了,喜爱的敌人关注一下我呦😘😘

微信公众号:笑小枫

本文源码:https://github.com/hack-feng/maple-demo

正文完
 0