• Java根据模板生成excel文件【Java】【EasyExcel】【xls】


    转载地址:https://blog.csdn.net/qq_42761569/article/details/119025171

    背景

    前两天客户反应对数据导出的文件格式不太满意,然后给了我们模板,
    让我们按照模板导出数据。于是一通修改(excel数据量有限制他们也不管,之前我们给的csv格式)。
    
    Java操作excel常用的有poi和阿里开源的easyexcel两种方式,
    poi太麻烦了这里用的easyexcel。
    
    根据模板生成文件还是比较简单的,因为我们不需要在代码中再设置各种格式、
    样式,模板设置好所有格式、样式以及占位符,只用写数据就行了,easyexcel使用个数据类非常方便。

    1、简介

    如下图所示,template目录下是准备好的模板,export目录下是生成数据文件。
    我们这里以第一个模板theUser蒸汽历史数据.xls为例进行测试,
    theUser为占位符,生成的文件中会被替换成对应的用户名。
    
    我这里的代码逻辑是根据选取的用户、起始时间导出用户的历史数据,
    一个用户一个excel文件,所有用户数据文件在一个目录下,
    最后把这个目录再压缩成zip,最后用户点击导出的就是这个压缩文件。

    2、模板格式

    占位符这里分两种:

    • {字段名} :{theUser} 和 {reportDate}
    • {自定义名称.字段名}:数据类字段占位符,字段对应第二个图中的类HistoryData的字段,hisData在代码中定义。

     

    3、代码

    这里的数据都是模拟测试的,代码中使用了Hutool工具类。没有文件压缩等代码。我的另一篇博客已经介绍过了文件压缩的方法【Java导出MySQL数据成csv文件并压缩成zip】。 

     1     public static void main(String[] args) {
     2         String reportDate = DateUtil.date().toString("yyyy年MM月dd日");
     3         // 模板文件
     4         String templateFile = "data/template/theUser蒸汽历史数据.xls";
     5         // 结果文件,省去了根据模板文件生成的步骤
     6         String resultFile = "data/export/明邦建材蒸汽历史数据.xls";
     7         // 根据模板文件生成目标文件
     8         ExcelWriter excelWriter = EasyExcel
     9                 .write(resultFile)
    10                 .withTemplate(templateFile)
    11                 // 单独设置单元格格式
    12 //                .registerWriteHandler(new CellStyleHandler())
    13                 .build();
    14         WriteSheet writeSheet = EasyExcel.writerSheet().build();
    15         // 每次都会重新生成新的一行,而不是使用下面的空行
    16         FillConfig fillConfig = FillConfig.builder().forceNewRow(Boolean.TRUE).build();
    17         // 第一种占位符替换
    18         Map<String, Object> map = new HashMap<>();
    19         map.put("reportDate", reportDate);
    20         excelWriter.fill(map, writeSheet);
    21         // 第二种占位符替换,这里定义了 hisData
    22         excelWriter.fill(new FillWrapper("hisData", hisData()), fillConfig, writeSheet);
    23         excelWriter.finish();
    24     }
    25 
    26     private static List<HistoryData> hisData(){
    27         List<HistoryData> resList = new ArrayList<>();
    28         String today = DateUtil.now();
    29         String yesterday = DateUtil.yesterday().toString();
    30         HistoryData yesData = HistoryData.builder()
    31                 .time(today)
    32                 .temp(34.211)
    33                 .press(1.222)
    34                 .insFlow(34.211)
    35                 .accFlow(233.125)
    36                 .insHeat(20.532)
    37                 .accHeat(112.562)
    38                 .build();
    39         HistoryData nowData = HistoryData.builder()
    40                 .time(yesterday)
    41                 .temp(34.211)
    42                 .press(1.222)
    43                 .insFlow(34.211)
    44                 .accFlow(233.125)
    45                 .insHeat(20.532)
    46                 .accHeat(112.562)
    47                 .build();
    48         resList.add(yesData);
    49         resList.add(nowData);
    50         return resList;
    51     }

    4、代码执行结果

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

    5、单独设置单元格格式 CellStyleHandler

    .registerWriteHandler(new CellStyleHandler()) 上面代码中的注释部分。

     1 package com.cloudansys.hawkeye.modules.report.schedule;
     2 
     3 import com.alibaba.excel.metadata.CellData;
     4 import com.alibaba.excel.metadata.Head;
     5 import com.alibaba.excel.write.handler.CellWriteHandler;
     6 import com.alibaba.excel.write.metadata.holder.WriteSheetHolder;
     7 import com.alibaba.excel.write.metadata.holder.WriteTableHolder;
     8 import org.apache.poi.ss.usermodel.*;
     9 
    10 import java.util.List;
    11 
    12 public class CellStyleHandler implements CellWriteHandler {
    13     @Override
    14     public void beforeCellCreate(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, Row row, Head head, Integer integer, Integer integer1, Boolean aBoolean) {
    15 
    16     }
    17 
    18     @Override
    19     public void afterCellCreate(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, Cell cell, Head head, Integer integer, Boolean aBoolean) {
    20 
    21     }
    22 
    23     @Override
    24     public void afterCellDataConverted(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, CellData cellData, Cell cell, Head head, Integer integer, Boolean aBoolean) {
    25 
    26     }
    27 
    28     @Override
    29     public void afterCellDispose(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, List<CellData> list, Cell cell, Head head, Integer integer, Boolean aBoolean) {
    30         Workbook workbook = writeSheetHolder.getSheet().getWorkbook();
    31         CellStyle cellStyle = workbook.createCellStyle();
    32         Font font = workbook.createFont();
    33         font.setFontName("Times New Roman");
    34         cellStyle.setFont(font);
    35         cell.setCellStyle(cellStyle);
    36     }
    37 }
  • 相关阅读:
    Python 认识元组
    Python 认识字典
    Python 字符串中常见的一些方法续
    python 打印 A ~ Z
    Python3的print怎么让它不换行
    Python 中的 lstrip、rstrip、strip
    Python判断一个字符串是否包含指定字符串的方法
    Python 字符串中常见的一些方法
    Python 认识字符串
    苹果电脑MacbookPro双开微信!
  • 原文地址:https://www.cnblogs.com/lidar/p/16199449.html
Copyright © 2020-2023  润新知