首先maven项目应该先进行pom引入
<dependency>
<groupId>cn.afterturn</groupId>
<artifactId>easypoi-base</artifactId>
<version>4.4.0</version>
</dependency>
<dependency>
<groupId>cn.afterturn</groupId>
<artifactId>easypoi-web</artifactId>
<version>4.4.0</version>
</dependency>
<dependency>
<groupId>cn.afterturn</groupId>
<artifactId>easypoi-annotation</artifactId>
<version>4.4.0</version>
</dependency>
or SpringBoot的版本
<dependency>
<groupId>cn.afterturn</groupId>
<artifactId>easypoi-spring-boot-starter</artifactId>
<version>4.4.0</version>
</dependency>
这个是1多N的做法 1对1 只需要在对象里面去除对应的List 实体:
!!! 1对多的情况下 导入数据解析 要设置HeadRows ,不然无法解析子对象信息
!!! 还有一种 是 注意模板的表头,多的字段的表头是@ExcelCollection注解的name值加下划线加多的一方字段上@Excel注解上的name值.
如表头xx_子xx 也能解析 但是不推荐 不好用 - -、
以下是easy poi 包带的几个默认注解:
@Excel 作用到filed上面,是对Excel一列的一个描述
@ExcelCollection 表示一个集合,主要针对一对多的导出,比如一个老师对应多个科目,科目就可以用集合表示
@ExcelEntity 表示一个继续深入导出的实体,但他没有太多的实际意义,只是告诉系统这个对象里面同样有导出的字段
@ExcelIgnore 和名字一样表示这个字段被忽略跳过这个导导出
@ExcelTarget 这个是作用于最外层的对象,描述这个对象的id,以便支持一个对象可以针对不同导出做出不同处理
注解中的ID的用法
1.导出 (无模板类型)直接上代码:
public class test2 {
public static void main(String[] args) throws Exception{
String path = "G:\\JavaTest\\file";
ExportParams params = new ExportParams(null, "测试");
Workbook workbook = null;
List<MsgClient> list = new ArrayList<>();
List<MsgClientGroup> groups = new ArrayList<>();
for (int i = 0; i < 10; i++) {
MsgClient client = new MsgClient();
client.setClientName("小明" + i);
client.setClientPhone("18797" + i);
client.setCreateBy("JueYue");
client.setId("1" + i);
client.setRemark("测试" + i);
if (i == 1 || i == 3){
MsgClientGroup group = new MsgClientGroup();
group.setGroupName("测试" + i);
group.setBirthday(new Date());
groups.add(group);
client.setGroup(groups);
}
list.add(client);
}
// 重点代码 调用的是普通导出
workbook = ExcelExportUtil.exportExcel(params,MsgClient.class,list);
File savefile = new File(path);
if (!savefile.exists()) {
savefile.mkdirs();
}
FileOutputStream fos = new FileOutputStream(path+"\\1.xlsx");
workbook.write(fos);
fos.close();
}
}
2、导入
public class test1 {
public static void main(String[] args) {
String path = "G:\\JavaTest\\file\\1.xlsx";
File file = new File(path);
Date start = new Date();
ImportParams params = new ImportParams();
// 重点标注 如果不设置HeadRows 则子对象可能会出现无法读取的问题
params.setHeadRows(2);
params.setTitleRows(0);
List<MsgClient> result = ExcelImportUtil.importExcel(
new File(path),
MsgClient.class, params);
System.out.println(result);
}
}
实体
@Data
public class MsgClient implements java.io.Serializable {
/** id */
private String id;
// 电话号码(主键)
@Excel(name = "电话号码",needMerge = true,width = 40)
private String clientPhone = null;
// 客户姓名
@Excel(name = "姓名",needMerge = true,width = 40)
private String clientName = null;
// 备注
@Excel(name = "备注",needMerge = true,width = 40)
private String remark = null;
// 所属分组
@ExcelCollection(name = "子数据")
private List<MsgClientGroup> group = new ArrayList<>();
// 创建人
private String createBy = null;
}
子实体
@Data
public class MsgClientGroup implements Serializable {
/**
*
*/
private static final long serialVersionUID = 6946265640897464878L;
// 组名
@Excel(name = "二级分组",width = 40)
private String groupName = null;
/**
* 创建人
*/
private String createBy;
// 生日
@Excel(name = "出生日期", format = "yyyy-MM-dd", width = 20)
private Date birthday = null;
}
以下是模板样式:
如果要对easypoi 要有更深度的 请移步官网
将会有大数据形式,多线程等更多的介绍
以上是我的踩坑结果
以上路径是我本地写死
导出在开发中可能遇到最多的浏览器下载:
// Excel 导出 通过浏览器下载的形式
public static void export(HttpServletResponse response, Workbook workbook, String fileName) throws IOException {
response.setHeader("Content-Disposition",
"attachment;filename=" + new String(fileName.getBytes("UTF-8"), "iso8859-1"));
response.setContentType("application/vnd.ms-excel;charset=UTF-8");
response.setHeader("Pragma", "no-cache");
response.setHeader("Cache-Control", "no-cache");
response.setDateHeader("Expires", 0);
BufferedOutputStream bufferedOutPut = new BufferedOutputStream(response.getOutputStream());
workbook.write(bufferedOutPut);
bufferedOutPut.flush();
bufferedOutPut.close();
}