Java根据模板生成excel文件【Java】【EasyExcel】【xls】
easyexcel
快速、简洁、解决大文件内存溢出的java处理Excel工具
项目地址:https://gitcode.com/gh_mirrors/ea/easyexcel
免费下载资源
·
Background
- 前两天客户反应对数据导出的文件格式不太满意,然后给了我们模板,让我们按照模板导出数据。于是一通修改(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】。
public static void main(String[] args) {
String reportDate = DateUtil.date().toString("yyyy年MM月dd日");
// 模板文件
String templateFile = "data/template/theUser蒸汽历史数据.xls";
// 结果文件,省去了根据模板文件生成的步骤
String resultFile = "data/export/明邦建材蒸汽历史数据.xls";
// 根据模板文件生成目标文件
ExcelWriter excelWriter = EasyExcel
.write(resultFile)
.withTemplate(templateFile)
// 单独设置单元格格式
// .registerWriteHandler(new CellStyleHandler())
.build();
WriteSheet writeSheet = EasyExcel.writerSheet().build();
// 每次都会重新生成新的一行,而不是使用下面的空行
FillConfig fillConfig = FillConfig.builder().forceNewRow(Boolean.TRUE).build();
// 第一种占位符替换
Map<String, Object> map = new HashMap<>();
map.put("reportDate", reportDate);
excelWriter.fill(map, writeSheet);
// 第二种占位符替换,这里定义了 hisData
excelWriter.fill(new FillWrapper("hisData", hisData()), fillConfig, writeSheet);
excelWriter.finish();
}
private static List<HistoryData> hisData(){
List<HistoryData> resList = new ArrayList<>();
String today = DateUtil.now();
String yesterday = DateUtil.yesterday().toString();
HistoryData yesData = HistoryData.builder()
.time(today)
.temp(34.211)
.press(1.222)
.insFlow(34.211)
.accFlow(233.125)
.insHeat(20.532)
.accHeat(112.562)
.build();
HistoryData nowData = HistoryData.builder()
.time(yesterday)
.temp(34.211)
.press(1.222)
.insFlow(34.211)
.accFlow(233.125)
.insHeat(20.532)
.accHeat(112.562)
.build();
resList.add(yesData);
resList.add(nowData);
return resList;
}
4、代码执行结果
5、单独设置单元格格式 CellStyleHandler
.registerWriteHandler(new CellStyleHandler()) 上面代码中的注释部分。
package com.cloudansys.hawkeye.modules.report.schedule;
import com.alibaba.excel.metadata.CellData;
import com.alibaba.excel.metadata.Head;
import com.alibaba.excel.write.handler.CellWriteHandler;
import com.alibaba.excel.write.metadata.holder.WriteSheetHolder;
import com.alibaba.excel.write.metadata.holder.WriteTableHolder;
import org.apache.poi.ss.usermodel.*;
import java.util.List;
public class CellStyleHandler implements CellWriteHandler {
@Override
public void beforeCellCreate(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, Row row, Head head, Integer integer, Integer integer1, Boolean aBoolean) {
}
@Override
public void afterCellCreate(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, Cell cell, Head head, Integer integer, Boolean aBoolean) {
}
@Override
public void afterCellDataConverted(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, CellData cellData, Cell cell, Head head, Integer integer, Boolean aBoolean) {
}
@Override
public void afterCellDispose(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, List<CellData> list, Cell cell, Head head, Integer integer, Boolean aBoolean) {
Workbook workbook = writeSheetHolder.getSheet().getWorkbook();
CellStyle cellStyle = workbook.createCellStyle();
Font font = workbook.createFont();
font.setFontName("Times New Roman");
cellStyle.setFont(font);
cell.setCellStyle(cellStyle);
}
}
GitHub 加速计划 / ea / easyexcel
31.64 K
7.47 K
下载
快速、简洁、解决大文件内存溢出的java处理Excel工具
最近提交(Master分支:3 个月前 )
c42183df
Bugfix 3 个月前
efa7dff6 * 重新加回 `commons-io`
3 个月前
更多推荐
已为社区贡献10条内容
所有评论(0)