前言
在之前的博客:
中给大家介绍了Apache POI在本地写入Excel的基本操作。
但可能很多朋友就会问了:在实际操作中,我们一般都是采用实体类集合来写入数据的吧。总不可能一个单元格一个单元格去填写吧?
是的。所以今天给大家带来一个进阶版,通过实体类集合来写入数据。
开整
话不多说,在上篇博客的环境基础之上>(点击进入上篇博客),我们直接开始编写代码:
实体类
首先,既然是通过实体类集合来写入数据,我们当然需要一个实体类:
package com.guqueyue.entity;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;
//lombok插件的注解
@Data // 若未使用lombok插件,请自行生成getter、setter以及toString方法
@AllArgsConstructor // 若未使用lombok插件,请自行生成有参构造方法
@NoArgsConstructor // 若未使用lombok插件,请自行生成无参构造方法
@Accessors(chain = true) // 开启链式编程
public class DemoData {
/**
* 书名
*/
private String bookName;
/**
* 作者
*/
private String author;
/**
* 时间
*/
private String dateTime;
}
Excel拆分
一般来说,Excel表格可以分为两个部分,一个为列名部分,一个为数据部分:
列名部分
列名部分我们用一个数组表示好了:
/**
* 列名部分
*/
private static final String[] rowNameArray = {"书名", "作者", "时间"};
数据部分
数据部分我们用个方法批量生成就好了:
/**
* 数据部分
*/
private List<DemoData> getData() {
List<DemoData> list = new ArrayList<>();
for (int i = 0; i < 10; i++) {
DemoData demoData = new DemoData();
demoData.setAuthor("路遥")
.setBookName("平凡的世界" + (i+1))
.setDateTime(new DateTime().toString("yyyy-MM-dd HH:mm:ss"));
list.add(demoData);
}
return list;
}
写个方法测试一下,生成了啥:
/**
* 查看生成的数据
*/
@Test
public void seeData() {
// 得到实体类集合
List<DemoData> list = getData();
// 遍历
list.forEach(demoData -> {
System.out.println(demoData);
});
}
运行,得:
完整代码
由于我们这里数据量并不庞大,所以直接生成03版本的Excel就好了。如若数据量超过65536行,可以生成07版本的excel。至于如何生成,可以 点击进入。
相信有了之前的铺垫,以下代码不难理解(当然,还需要一点点反射基础,我后续可能会出相关的博客,有需要的小伙伴可以关注我哦):
package com.guqueyue.excel;
import com.guqueyue.entity.DemoData;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.joda.time.DateTime;
import org.junit.Test;
import java.io.File;
import java.io.FileOutputStream;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.List;
/**
* @ClassName ExcelWriteTest3
* @Description 通过实体类集合写入Excel表格
* @Author 古阙月
* @Date 2020/11/1 16:55
* @Version 1.0
**/
public class ExcelWriteTest3 {
/**
* 需要写入excel的路径
*/
private static final String PATH = "C:\\project\\study_demo\\springboot_demo\\src\\main\\java\\com\\guqueyue\\excel";
/**
* 需要写入excel的文件名称
*/
private static final String FILENAME = "古阙月的书单03.xls";
/**
* 列名部分
*/
private static final String[] rowNameArray = {"书名", "作者", "时间"};
/**
* 数据部分
*/
private List<DemoData> getData() {
List<DemoData> list = new ArrayList<>();
for (int i = 0; i < 10; i++) {
DemoData demoData = new DemoData();
demoData.setAuthor("路遥")
.setBookName("平凡的世界" + (i+1))
.setDateTime(new DateTime().toString("yyyy-MM-dd HH:mm:ss"));
list.add(demoData);
}
return list;
}
/**
* 查看生成的数据
*/
@Test
public void seeData() {
// 得到实体类集合
List<DemoData> list = getData();
// 遍历
list.forEach(demoData -> {
System.out.println(demoData);
});
}
/**
* 用实体类集合生成Excel
*/
@Test
public void writeExcelTest() throws Exception {
// 生成一张工作簿
Workbook workbook = new HSSFWorkbook();
// 生成一张工作表
Sheet sheet = workbook.createSheet("古阙月的书单");
/**
* 写入列名部分
*/
Row row1 = sheet.createRow(0); // 生成第一行
for (int i = 0; i < rowNameArray.length; i++) {
row1.createCell(i).setCellValue(rowNameArray[i]);
}
/**
* 写入数据部分
*/
List<DemoData> list = getData(); // 得到实体类集合
for (int i = 0; i < list.size(); i++) {
// 生成第 i+2行
Row row = sheet.createRow(i + 1);
DemoData demoData = list.get(i);
// 用于标记当前的列
int j = 0;
// 获取当前实体类的属性集合
Field[] fields = demoData.getClass().getDeclaredFields();
// 遍历
for (Field field : fields) {
// 私有属性访问授权
field.setAccessible(true);
// 获取属性对应的值
String value = (String) field.get(demoData);
// 写入属性对应的值
row.createCell(j).setCellValue(value);
// 列号+1
j++;
}
}
// 生成一张excel表
FileOutputStream fileOutputStream = new FileOutputStream(PATH + File.separator + FILENAME);
// 写入
workbook.write(fileOutputStream);
// 关流
fileOutputStream.close();
System.out.println(FILENAME + "生成完毕!!!");
}
}
运行writeExcelTest()
方法,可以看到控制台一道绿光闪过,控制台打印出了古阙月的书单03.xls生成完毕!!!,也生成了名为古阙月的书单03.xls
的文件:
点开一看,非常完美:
下期博客将为大家介绍如何在Web即在浏览器端导出Excel,欢迎大家持续关注哦!!!
下期博客来了,点击进入 -> (点我也可):