Java使用EasyExcel导出Excel

功能背景

简单的说下这个功能的背景需求吧,有类似需求的可以复用,果然导入还没写完,导出的功能接踵而来,一块写了吧

  • 实现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>
</dependency>

项目编码

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

  • 定义经销商信息对象,代码如下:
package org.cango.dealer.manage.model.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 xiaoxiaofeng
 * @date 2022/6/6
 */
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@HeadStyle(fillPatternType = FillPatternTypeEnum.SOLID_FOREGROUND, fillForegroundColor = 40)
@HeadFontStyle(fontHeightInPoints = 12)
@ContentFontStyle(fontHeightInPoints = 11)
@ColumnWidth(20)
public class ExcelCompany {

    // -------------------- 基本信息 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 ---------------------
}

  • 定义联系人信息对象,代码如下:
package org.cango.dealer.manage.model.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 xiaoxiaofeng
 * @date 2022/6/6
 */
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@HeadStyle(fillPatternType = FillPatternTypeEnum.SOLID_FOREGROUND, fillForegroundColor = 40)
@HeadFontStyle(fontHeightInPoints = 12)
@ContentFontStyle(fontHeightInPoints = 11)
@ColumnWidth(20)
public class ExcelContact {
    @ExcelProperty("公司名称")
    private String companyName;

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

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

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

    @ExcelProperty("职位")
    private String contactPostName;
}
  • 编写controller进行测试,代码如下:
package org.cango.dealer.manage.controller;

import com.alibaba.excel.EasyExcelFactory;
import com.alibaba.excel.ExcelWriter;
import com.alibaba.excel.write.metadata.WriteSheet;
import lombok.extern.slf4j.Slf4j;
import org.cango.dealer.manage.model.excel.ExcelCompany;
import org.cango.dealer.manage.model.excel.ExcelContact;
import org.springframework.web.bind.annotation.GetMapping;
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 zhangfuzeng
 * @date 2022/6/9
 */
@Slf4j
@RestController
public class ExportExcelController {

    @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);
            excelWriter.finish();
            out.flush();
        } catch (Exception e) {
            log.error(e.getMessage());
        }
    }

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

    private List<ExcelCompany> getCompany() {
        List<ExcelCompany> companyList = new ArrayList<>();
        for (int i = 0; i < 5; i++) {
            companyList.add(ExcelCompany.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<ExcelContact> getContact() {
        List<ExcelContact> contactList = new ArrayList<>();
        for (int i = 0; i < 5; i++) {
            contactList.add(ExcelContact.builder()
                    .companyName("笑小枫公司" + i)
                    .name("笑小枫" + i)
                    .mobile("183000000000")
                    .idCard("371324199011111111")
                    .contactPostName("后端")
                    .build());
        }
        return contactList;
    }
}

测试结果

浏览器请求:http://localhost:8080/exportExcel

经销商sheet页信息:

image-20220610102736604

联系人sheet页信息:

image-20220610102750478

相关属性解读

image-20220610104915216

注解

  • 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 是否导出头
head 与clazz二选一。写入文件的头列表,建议使用class。
clazz 与head二选一。写入文件的头对应的class,也可以使用注解。
autoTrim 字符串、表头等数据自动trim
WriteWorkbook(理解成excel对象)参数
excelType 当前excel的类型 默认xlsx
outputStream 与file二选一。写入文件的流
file 与outputStream二选一。写入的文件
templateInputStream 模板的文件流
templateFile 模板文件
autoCloseStream 自动关闭流。
password 写的时候是否需要使用密码
useDefaultStyle 写的时候是否是使用默认头
WriteSheet(就是excel的一个Sheet)参数
sheetNo 需要写入的编码。默认0
sheetName 需要些的Sheet名称,默认同sheetNo
WriteTable(就把excel的一个Sheet,一块区域看一个table)参数
tableNo 需要写入的编码。默认0

  • 2
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
### 回答1: Java easyexcel 导出示例代码如下: ``` import com.alibaba.excel.ExcelWriter; import com.alibaba.excel.metadata.Sheet; import com.alibaba.excel.metadata.Table; import com.alibaba.excel.support.ExcelTypeEnum; import java.io.FileOutputStream; import java.util.ArrayList; import java.util.List; public class EasyExcelExportExample { public static void main(String[] args) throws Exception { // 准备数据 List<List<String>> data = new ArrayList<>(); for (int i = 0; i < 10; i++) { List<String> item = new ArrayList<>(); item.add("字符串" + i); item.add("数字" + i); data.add(item); } // 写入数据 FileOutputStream out = new FileOutputStream("easyexcel-export.xlsx"); ExcelWriter writer = new ExcelWriter(out, ExcelTypeEnum.XLSX); Sheet sheet1 = new Sheet(1, 0); sheet1.setSheetName("sheet1"); Table table1 = new Table(1); table1.setHead(new String[]{"字符串列", "数字列"}); writer.write0(data, sheet1, table1); writer.finish(); out.close(); } } ``` 这是一个简单的导出示例,其中写入了10行2列的数据,分别是 "字符串列" 和 "数字列"。示例代码会生成一个名为 "easyexcel-export.xlsx" 的 XLSX 格式的 Excel 文件。 ### 回答2: Java EasyExcel是一种用于Excel导入和导出的开源组件。它提供了简单易用的API,可以方便地创建、读取和写入Excel文件。 以下是一个使用Java EasyExcel进行导出的示例: 首先,需要在项目中引入Java EasyExcel的依赖。可以在项目的pom.xml文件中添加以下依赖配置: ``` <dependency> <groupId>com.alibaba</groupId> <artifactId>easyexcel</artifactId> <version>2.2.2</version> </dependency> ``` 接下来,创建一个POJO类来表示Excel中的每一行数据。假设我们要导出一个包含学生信息的Excel文件,可以创建一个Student类,包含姓名、年龄和性别等属性。 然后,在导出时,可以通过EasyExcel的API来创建一个ExcelWriter对象,并指定导出的文件名和sheet名称。 ``` ExcelWriter excelWriter = EasyExcel.write("output.xlsx").build(); ``` 接下来,可以通过ExcelWriter对象的sheet()方法创建一个Sheet对象,并指定该sheet的名称和对应的实体类。 ``` Sheet sheet = new Sheet(1, 0, Student.class); sheet.setSheetName("学生信息"); excelWriter.write(dataList, sheet); ``` 为了将数据写入Excel文件,需要将数据封装到List中,然后通过ExcelWriter对象的write()方法进行写入。 最后,调用ExcelWriter对象的finish()方法将数据写入到Excel文件中,并关闭ExcelWriter对象。 ``` excelWriter.finish(); ``` 以上就是一个使用Java EasyExcel进行导出的示例。通过简单的几步操作,就可以方便地将数据导出Excel文件中。Java EasyExcel的易用性使得Excel导入和导出变得更加简单。 ### 回答3: Java easyexcel是一种用于导出Excel文件的简化工具,它可以帮助我们在Java程序中快速实现Excel文件的导出功能。 使用Java easyexcel导出示例的基本步骤如下: 1. 首先,我们需要在项目的依赖中添加Java easyexcel的相关库。可以通过Maven或者Gradle等工具来管理依赖。 2. 在Java程序中创建一个实体类,用来存储要导出Excel中的数据。这个实体类需要使用注解来设置Excel的表头、列宽等属性。 3. 在Java程序中创建一个导出的方法,该方法使用Java easyexcel提供的API来生成Excel文件。我们可以在该方法中设置Excel的标题、表头、数据源等。 4. 调用导出方法,将Excel文件保存到指定的路径或者输出流中,即可完成Excel文件的导出过程。 下面是一个简单的Java easyexcel导出示例: ```java // 引入Java easyexcel的相关包 import com.alibaba.excel.EasyExcel; // 定义要导出Excel中的数据实体类 public class Student { @ExcelProperty("姓名") private String name; @ExcelProperty("年龄") private int age; // 省略 getter 和 setter 方法 } // 导出方法 public void exportExcel(List<Student> data, String filePath) { // 设置Excel的标题和表头 List<List<String>> head = new ArrayList<List<String>>(); List<String> title = new ArrayList<String>(); title.add("姓名"); title.add("年龄"); head.add(title); // 将数据导出Excel文件中 EasyExcel.write(filePath) // 设置导出文件路径 .head(head) // 设置表头 .sheet("Sheet1") // 设置Sheet名称 .doWrite(data); // 导出数据 System.out.println("Excel导出成功!"); } // 测试导出方法 public static void main(String[] args) { // 创建要导出的数据列表 List<Student> data = new ArrayList<Student>(); data.add(new Student("张三", 20)); data.add(new Student("李四", 22)); data.add(new Student("王五", 18)); // 调用导出方法 exportExcel(data, "D:/student.xlsx"); } ``` 通过上述示例,我们可以看到,使用Java easyexcel导出Excel文件非常简单且高效。只需要少量的代码,就可以实现复杂的Excel导出功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

风小筝123

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值