设计写入实体类

  1. @Data
  2. public class WriteData {
  3. @ExcelProperty("字符串")
  4. private String string;
  5. @ExcelProperty("日期")
  6. private Date date;
  7. @ExcelProperty("小数")
  8. private Double doubleData;
  9. @ExcelIgnore
  10. private String ignore;
  11. }

构造写入的数据

  1. /**
  2. * 初始化写入数据
  3. *
  4. * @return
  5. */
  6. public static List<WriteData> initData() {
  7. List<WriteData> list = new ArrayList<>();
  8. for (int i = 0; i < 10; i++) {
  9. WriteData data = new WriteData();
  10. data.setString("字符串" + i);
  11. data.setDate(new Date());
  12. data.setDoubleData(0.56);
  13. list.add(data);
  14. }
  15. return list;
  16. }

使用注解@ExcelProperty 标注列名
@ExcelIgnore注解忽略某一个属性

简单写入

指定class作为写入模板,会自动关闭写入流

  1. /**
  2. * 指定具体的class作为写入模板,并写入excel的第一个sheet中,文件流会自动关闭
  3. *
  4. * @param fileName
  5. * @param filePath
  6. * @param list
  7. */
  8. public static void simpleWrite(String fileName, String filePath, List<WriteData> list) {
  9. EasyExcel.write(filePath, WriteData.class).sheet(fileName).doWrite(list);
  10. }

构造写入

构造一张表,构造一个sheet,并将两个组合起来进行写入
注意这种方法必须手动将写入流关闭

  1. /**
  2. * 构造进行写入
  3. *
  4. * @param fileName
  5. * @param filePath
  6. * @param list
  7. */
  8. public static void buildExcelWrite(String fileName, String filePath, List<WriteData> list) {
  9. ExcelWriter writer = EasyExcel.write(filePath, WriteData.class).build();
  10. WriteSheet sheet = EasyExcel.writerSheet(fileName).build();
  11. writer.write(list, sheet);
  12. //该写法必须关闭写入流
  13. writer.finish();
  14. }

导出指定列

除了固定列之外,我们可以根据用户传递的参数进行动态配置导出列
排除列

  1. //排除指定列,可以传入列名,或者指定列的索引index
  2. Set<String> excludeColumn = new HashSet<>();
  3. excludeColumn.add("dateLabel");
  4. /**
  5. * 根据传递参数排除指定列
  6. */
  7. private static void excludeWrite(String fileName, String filePath, List<WriteData> list, Set<String> excludeColumn) {
  8. EasyExcel.write(filePath, WriteData.class).sheet(fileName).excludeColumnFiledNames(excludeColumn).doWrite(list);
  9. }

除了排除的列,其余列导出


导出列

  1. /**
  2. * 导出指定列
  3. *
  4. * @param fileName
  5. * @param filePath
  6. * @param list
  7. * @param includeColumn
  8. */
  9. private static void includeWrite(String fileName, String filePath, List<WriteData> list, Set<String> includeColumn) {
  10. EasyExcel.write(filePath, WriteData.class).sheet(fileName).includeColumnFiledNames(includeColumn).doWrite(list);
  11. }

除了指定的列,其余没有使用@ExcelIgnore 注解的列都会被导出

指定写入第几列

有些时候为了方便查看,我们可能会设置一些空行作为间隔

  1. @Data
  2. public class IndexData {
  3. @ExcelProperty(value = "字符串标题", index = 0)
  4. private String string;
  5. @ExcelProperty(value = "日期标题", index = 1)
  6. private Date date;
  7. /**
  8. * 这里设置3 会导致第二列空的
  9. */
  10. @ExcelProperty(value = "数字标题", index = 3)
  11. private Double doubleData;

写入方法

  1. private static void blankLineWrite(String fileName, String filePath, List<WriteData> list) {
  2. EasyExcel.write(filePath,BlankLineData.class).sheet(fileName).doWrite(list);
  3. }

只需要指定实体类的索引位置即可

复杂头部写入

在实体类中设置注解@ExcelProperty 的值的时候设置即可

  1. @Data
  2. public class ComplexHeader {
  3. @ExcelProperty({"主标题", "字符串标题"})
  4. private String string;
  5. @ExcelProperty({"主标题", "日期标题"})
  6. private Date date;
  7. @ExcelProperty({"主标题", "数字标题"})
  8. private Double doubleData;
  9. }

继续写入(不覆盖)

接着上面的内容往下写入,可以指定不同的sheet

写到同一个sheet

可以用来将数据分页导出

  1. /**
  2. * 重复写入
  3. *
  4. * @param filePath
  5. */
  6. private static void repeatWriteToOneSheet(String filePath) {
  7. ExcelWriter excelWriter = null;
  8. try {
  9. // 这里 需要指定写用哪个class去写
  10. excelWriter = EasyExcel.write(filePath, WriteData.class).build();
  11. // 这里注意 如果同一个sheet只要创建一次
  12. WriteSheet writeSheet = EasyExcel.writerSheet("重复写入").build();
  13. // 去调用写入,这里我调用了五次,实际使用时根据数据库分页的总的页数来
  14. for (int i = 0; i < 5; i++) {
  15. // 分页去数据库查询数据 这里可以去数据库查询每一页的数据
  16. List<WriteData> data = initData();
  17. excelWriter.write(data, writeSheet);
  18. }
  19. } finally {
  20. // 千万别忘记finish 会帮忙关闭流
  21. if (excelWriter != null) {
  22. excelWriter.finish();
  23. }
  24. }
  25. }

写到不同的sheet中

必须指定每一个sheet的名称和no

  1. private static void repeatWriteToDifferSheet(String filePath) {
  2. ExcelWriter excelWriter = null;
  3. try {
  4. // 这里 指定文件
  5. excelWriter = EasyExcel.write(filePath).build();
  6. // 去调用写入,这里我调用了五次,实际使用时根据数据库分页的总的页数来。这里最终会写到5个sheet里面
  7. for (int i = 0; i < 5; i++) {
  8. // 每次都要创建writeSheet 这里注意必须指定sheetNo 而且sheetName必须不一样。这里注意DemoData.class 可以每次都变,我这里为了方便 所以用的同一个class 实际上可以一直变
  9. WriteSheet writeSheet = EasyExcel.writerSheet(i, "模板" + i).head(WriteData.class).build();
  10. // 分页去数据库查询数据 这里可以去数据库查询每一页的数据
  11. List<WriteData> data = initData();
  12. excelWriter.write(data, writeSheet);
  13. }
  14. } finally {
  15. // 千万别忘记finish 会帮忙关闭流
  16. if (excelWriter != null) {
  17. excelWriter.finish();
  18. }
  19. }
  20. }

日期字符串转换

将数据格式转换成想要的格式
定义CustomConverter实现Converter

  1. public class CustomConverter implements Converter<String> {
  2. @Override
  3. public Class supportJavaTypeKey() {
  4. return String.class;
  5. }
  6. @Override
  7. public CellDataTypeEnum supportExcelTypeKey() {
  8. return CellDataTypeEnum.STRING;
  9. }
  10. @Override
  11. public String convertToJavaData(CellData cellData, ExcelContentProperty excelContentProperty, GlobalConfiguration globalConfiguration) throws Exception {
  12. return cellData.getStringValue();
  13. }
  14. @Override
  15. public CellData convertToExcelData(String s, ExcelContentProperty excelContentProperty, GlobalConfiguration globalConfiguration) throws Exception {
  16. return new CellData("自定义: " + s);
  17. }
  18. }

实体类

  1. @Data
  2. public class ConvertData {
  3. /**
  4. * 我想所有的 字符串起前面加上"自定义:"三个字
  5. */
  6. @ExcelProperty(value = "字符串标题", converter = CustomConverter.class)
  7. private String string;
  8. /**
  9. * 我想写到excel 用年月日的格式
  10. */
  11. @DateTimeFormat("yyyy年MM月dd日HH时mm分ss秒")
  12. @ExcelProperty("日期标题")
  13. private Date date;
  14. /**
  15. * 写到excel中 用百分比表示
  16. */
  17. @NumberFormat("#.##%")
  18. @ExcelProperty(value = "数字标题")
  19. private Double doubleData;
  20. }

运行

  1. List<ConvertData> convertData = initConvertData();
  2. convertWrite(fileName, filePath, convertData);
  3. //初始化数据
  4. public static List<ConvertData> initConvertData() {
  5. List<ConvertData> list = new ArrayList<>();
  6. for (int i = 0; i < 10; i++) {
  7. ConvertData data = new ConvertData();
  8. data.setString("字符串" + i);
  9. data.setDate(new Date());
  10. data.setDoubleData(0.56);
  11. list.add(data);
  12. }
  13. return list;
  14. }
  15. //执行转换写入
  16. private static void convertWrite(String fileName, String filePath, List<ConvertData> list) {
  17. EasyExcel.write(filePath, ConvertData.class).sheet(fileName).doWrite(list);
  18. }