文章目录
介绍
easyexcel是阿里巴巴开源的,基于Java开发的一款简单、高效、省内存的excel工具类。
其他工具类
【Java常用工具类】日期类
【Java常用工具类】数学计算
【Java常用工具类】字符串
【Java常用工具类】集合操作常用方法
基本使用
1、简单写
@Test
public void simpleWrite() {
String fileName = "D:\\easyexcel_demo\\simpleWrite.xlsx";
EasyExcel.write(fileName, ExcelDataEntity.class).sheet("演示sheet名称").doWrite(getData());
}
private List<ExcelDataEntity> getData() {
List<ExcelDataEntity> list = new ArrayList<>();
for (int i = 1; i <= 10; i++) {
ExcelDataEntity entity = new ExcelDataEntity();
entity.setIndexData("index " + i);
entity.setStringData("string " + i);
entity.setDate(new Date());
entity.setDoubleData((double) i);
list.add(entity);
}
return list;
}
@Data
// 指定列宽、行高等样式
@ContentRowHeight(25)
@HeadRowHeight(25)
@ColumnWidth(25)
public class ExcelDataEntity {
@ExcelProperty("演示字符串标题")
private String stringData;
@ExcelProperty("演示日期标题")
// 可以单独设置
@ColumnWidth(50)
private Date date;
@ExcelProperty("演示数值标题")
private Double doubleData;
@ExcelProperty(value = "指定下标在第1列", index = 0)
private String indexData;
}
2、过滤指定列
@Test
public void excludeColumnWrite() {
String fileName = "D:\\easyexcel_demo\\excludeColumnWrite.xlsx";
// 可以按列的名称过滤
//Set<String> excludeColumnsName = new HashSet<>();
//excludeColumnsName.add("stringData");
// 可以按照列的下标过滤
Set<Integer> excludeColumnsIndex = new HashSet<>();
excludeColumnsIndex.add(1);
EasyExcel.write(fileName, ExcelDataEntity.class)
//.excludeColumnFiledNames(excludeColumnsName)
.excludeColumnIndexes(excludeColumnsIndex)
.sheet()
.doWrite(getData());
}
3、 重复写入列
@Test
public void repeatedWrite() {
String fileName = "D:\\easyexcel_demo\\repeatedWrite.xlsx";
ExcelWriter excelWriter = EasyExcel.write(fileName, ExcelDataEntity.class).build();
// 创建一个sheet
WriteSheet writeSheet = EasyExcel.writerSheet("sheet01").build();
// 重复写入2次,共产生20条数据
for (int i = 0; i < 2; i++) {
List<ExcelDataEntity> list = getData();
excelWriter.write(list, writeSheet);
}
// 写完需要关闭资源
excelWriter.finish();
}
4、重复写入不同的sheet
@Test
public void repeatedWrite2() {
String fileName = "D:\\easyexcel_demo\\repeatedWrite2.xlsx";
ExcelWriter excelWriter = EasyExcel.write(fileName, ExcelDataEntity.class).build();
// 重复写入2次,共产生20条数据
for (int i = 0; i < 2; i++) {
// 把sheet放入循环里面即可
WriteSheet writeSheet = EasyExcel.writerSheet("sheet" + i).build();
List<ExcelDataEntity> list = getData();
excelWriter.write(list, writeSheet);
}
// 写完需要关闭资源
excelWriter.finish();
}
产生了2个sheet页,数据是一样的
5、多级表头写入
@Test
public void multilevelHeadWrite() {
String fileName = "D:\\easyexcel_demo\\multilevelHeadWrite.xlsx";
EasyExcel.write(fileName, MultilevelHeadEntity.class).sheet().doWrite(getMultilevelData());
}
private List<MultilevelHeadEntity> getMultilevelData() {
List<MultilevelHeadEntity> list = new ArrayList<>();
for (int i = 1; i <= 10; i++) {
MultilevelHeadEntity entity = new MultilevelHeadEntity();
entity.setS1("" + i);
entity.setS2("" + i);
entity.setS3("" + i);
entity.setS4("" + i);
list.add(entity);
}
return list;
}
@Data
@ContentRowHeight(25)
@HeadRowHeight(25)
@ColumnWidth(25)
public class MultilevelHeadEntity {
@ExcelProperty({
"一级标题","二级标题-1","三级标题-1"})
private String s1;
@ExcelProperty({
"一级标题","二级标题-1","三级标题-2"})
private String s2;
@ExcelProperty({
"一级标题","二级标题-2","三级标题-1"})
private String s3;
@ExcelProperty({
"一级标题","二级标题-2","三级标题-2"})
private String s4;
}
6、字段格式化
@Test
public void formatWrite() {
String fileName = "D:\\easyexcel_demo\\formatWrite.xlsx";
EasyExcel.write(fileName, FormatEntity.class).sheet().doWrite(getFormatDate());
}
private List<FormatEntity> getFormatDate() {
List<FormatEntity> list = new ArrayList<>();
for (int i = 1; i <= 10; i++) {
FormatEntity entity = new FormatEntity();
entity.setDate(new Date());
entity.setD1(i / 3d);
entity.setD2(i / 3d);
entity.setD3(i / 3d);
entity.setD4(i / 3d);
list.add(entity);
}
return list;
}
@Data
@ContentRowHeight(25)
@HeadRowHeight(25)
@ColumnWidth(25)
public class FormatEntity {
@DateTimeFormat("yyyy-MM-dd")
@ExcelProperty("日期标题")
private Date date;
@NumberFormat("#.##%")
@ExcelProperty(value = "百分比")
private Double d1;
@NumberFormat("#.###")
@ExcelProperty(value = "保留三位小数")
private Double d2;
@NumberFormat("#.##")
@ExcelProperty(value = "默认四舍五入")
private Double d3;
@NumberFormat(value = "#.##", roundingMode = RoundingMode.DOWN)
@ExcelProperty(value = "直接截取")
private Double d4;
}
7、合并单元格
@Test
public void mergeCellWrite() {
String fileName = "D:\\easyexcel_demo\\mergeCellWrite.xlsx";
// LoopMergeStrategy构建方法参数中,2:表示每两行进行合并,0:表示合并下标为0的列,也就是第一列
LoopMergeStrategy loopMergeStrategy = new LoopMergeStrategy(2, 0);
EasyExcel.write(fileName, FormatEntity.class)
.registerWriteHandler(loopMergeStrategy)
.sheet()
.doWrite(getFormatDate());
}
8、模板写入
@Test
// 先把simpleWrite.xlsx数据写入templateWrite.xlsx中,然后再写入其他的数据到templateWrite.xlsx中
public void templateWrite() {
String fileName = "D:\\easyexcel_demo\\templateWrite.xlsx";
String templateFileName = "D:\\easyexcel_demo\\simpleWrite.xlsx";
ExcelWriter excelWriter = EasyExcel.write(fileName).withTemplate(templateFileName).build();
WriteSheet writeSheet = EasyExcel.writerSheet("演示sheet名称").build();
// 再写一点自己的数据
excelWriter.write(getTemplateData(), writeSheet);
// 关闭资源
excelWriter.finish();
}
private List<ExcelDataEntity> getTemplateData() {
List<ExcelDataEntity> list = new ArrayList<>();
for (int i = 1; i <= 10; i++) {
ExcelDataEntity entity = new ExcelDataEntity();
entity.setIndexData("template index " + i);
entity.setStringData("template string " + i);
entity.setDate(new Date());
entity.setDoubleData((double) i);
list.add(entity);
}
return list;
}
9、自定义样式
@Test
public void styleWrite() {
String fileName = "D:\\easyexcel_demo\\styleWrite.xlsx";
// 设置头部样式
WriteCellStyle headWriteCellStyle = new WriteCellStyle();
// 头部背景色
headWriteCellStyle.setFillForegroundColor(IndexedColors.RED.getIndex());
WriteFont headWriteFont = new WriteFont();
// 字体大小
headWriteFont.setFontHeightInPoints((short) 18);
headWriteCellStyle.setWriteFont(headWriteFont);
// 设置内容样式
WriteCellStyle contentWriteCellStyle = new WriteCellStyle();
// 指定FillPatternType.SOLID_FOREGROUND不然无法显示背景颜色,头部默认了这个属性所以可以不指定
contentWriteCellStyle.setFillPatternType(FillPatternType.SOLID_FOREGROUND);
contentWriteCellStyle.setFillForegroundColor(IndexedColors.GREEN.getIndex());
WriteFont contentWriteFont = new WriteFont();
contentWriteFont.setFontHeightInPoints((short) 12);
contentWriteCellStyle.setWriteFont(contentWriteFont);
// 构建头部和内容的样式
HorizontalCellStyleStrategy horizontalCellStyleStrategy =
new HorizontalCellStyleStrategy(headWriteCellStyle, contentWriteCellStyle);
EasyExcel.write(fileName, ExcelDataEntity.class).registerWriteHandler(horizontalCellStyleStrategy).sheet("")
.doWrite(getData());
}
10、简单的读
@Test
public void simpleRead() {
String fileName = "D:\\easyexcel_demo\\simpleWrite.xlsx";
EasyExcel.read(fileName, ExcelReadDataEntity.class, new SimpleReadListener()).sheet().doRead();
}
@Data
public class ExcelReadDataEntity {
// 用列的名称去匹配
@ExcelProperty("演示字符串标题")
private String stringData;
@ExcelProperty("演示日期标题")
private Date date;
@ExcelProperty("演示数值标题")
private Double doubleData;
// 用index匹配列,index=0,对应下标第一列
@ExcelProperty(index = 0)
private String indexData;
}
@Slf4j
public class SimpleReadListener extends AnalysisEventListener<ExcelReadDataEntity> {
List<ExcelReadDataEntity> list = new ArrayList<>();
@Override
public void invoke(ExcelReadDataEntity excelDataEntity, AnalysisContext analysisContext) {
log.info("解析到一条数据:" + excelDataEntity.toString());
list.add(excelDataEntity);
if (list.size() >= 3) {
saveDataBase();
list.clear();
}
}
private void saveDataBase() {
log.info("插入数据库: " + list);
}
@Override
public void doAfterAllAnalysed(AnalysisContext analysisContext) {
// 真正操作数据库时,一般使用spring管理的bean,需要通过构造方法的方式传进来
saveDataBase();
}
}
11、web文件下载
@GetMapping("download")
public void download(HttpServletResponse response) throws IOException {
response.setContentType("application/vnd.ms-excel");
response.setCharacterEncoding("utf-8");
String fileName = URLEncoder.encode("web文件上传", "UTF-8");
response.setHeader("Content-disposition", "attachment;filename=" + fileName + ".xlsx");
EasyExcel.write(response.getOutputStream(), DownloadData.class).sheet().doWrite(data());
}
12、web文件上传
@PostMapping("upload")
@ResponseBody
public void upload(MultipartFile file) throws Exception {
EasyExcel.read(file.getInputStream(), ExcelReadDataEntity.class, new UploadListener()).sheet().doRead();
}
@Data
public class ExcelReadDataEntity {
// 用列的名称去匹配
@ExcelProperty("演示字符串标题")
private String stringData;
@ExcelProperty("演示日期标题")
private Date date;
@ExcelProperty("演示数值标题")
private Double doubleData;
// 用index匹配列,index=0,对应下标第一列
@ExcelProperty(index = 0)
private String indexData;
}
@Slf4j
public class UploadListener extends AnalysisEventListener<ExcelReadDataEntity> {
List<ExcelReadDataEntity> list = new ArrayList<>();
@Override
public void invoke(ExcelReadDataEntity excelReadDataEntity, AnalysisContext analysisContext) {
log.info("解析到一条数据:" + excelReadDataEntity.toString());
list.add(excelReadDataEntity);
if (list.size() >= 3) {
saveDataBase();
list.clear();
}
}
private void saveDataBase() {
log.info("插入数据库: " + list);
}
@Override
public void doAfterAllAnalysed(AnalysisContext analysisContext) {
// 真正操作数据库时,一般使用spring管理的bean,需要通过构造方法的方式传进来
saveDataBase();
}
}