easypoi以最简单的方式实现多级表头导入导出
导出效果图:数据导入效果图:存入mysql库效果图:效果也看到了,基本能满足所需要求,这种复杂的表头都是自定义的,根据模板直接使用,特别容易上手。1,导入所需依赖<!--导入导出--><dependency><groupId>cn.afterturn</groupId><artifactId>easypoi-base</artifa
导出效果图:
数据导入效果图:
存入mysql库效果图:
效果也看到了,基本能满足所需要求,这种复杂的表头都是自定义的,根据模板直接使用,特别容易上手。
1,导入所需依赖
<!--导入导出-->
<dependency>
<groupId>cn.afterturn</groupId>
<artifactId>easypoi-base</artifactId>
<version>4.2.0</version>
</dependency>
2,给数据库实体类添加@Excel注解
这是我测试创建的一个easypoi_test表,字段简单(无需特别关注)
实体类与数据库的表对应,这没什么好说的
EsaypoiTest .java
package com.myqxin.pojo;
import cn.afterturn.easypoi.excel.annotation.Excel;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.io.Serializable;
/**
* <p>
*
* </p>
*
* @author myqxin
* @since 2021-11-05
*/
@Data
@EqualsAndHashCode(callSuper = false)
@TableName("esaypoi_test")
public class EsaypoiTest implements Serializable {
private static final long serialVersionUID = 1L;
@TableId(value = "id", type = IdType.AUTO)
private Integer id;
@Excel(name = "名称1",groupName = "基本信息")
private String m1;
@Excel(name = "名称2",groupName = "名称15",replace = {"男_1","女_0"})
private String m2;
@Excel(name = "名称3")
private String m3;
@Excel(name = "名称4",groupName = "名称16")
private String m4;
@Excel(name = "名称5")
private String m5;
@Excel(name = "名称6")
private String m6;
@Excel(name = "名称7")
private String m7;
@Excel(name = "名称8")
private String m8;
@Excel(name = "名称9",groupName = "特殊信息")
private String m9;
@Excel(name = "名称10",groupName = "名称17")
private String m10;
@Excel(name = "名称11")
private String m11;
@Excel(name = "名称12",groupName = "名称18")
private String m12;
@Excel(name = "名称13")
private String m13;
@Excel(name = "名称14")
private String m14;
}
关于@Excel注解的详细说明,看官网:http://easypoi.mydoc.io
我这里对它做简单的解释:
属性 | 描述 |
---|---|
name | 与离表格数据最近的哪一行表头的名称 |
groupName | 一个组合,在第一个表头位置加上这个,下一个不用加,默认到结尾 |
replace | 文本替换 |
@Excel(name=“”):可以理解对应这个红框里面的值,离数据最近的一行表头
@Excel(groupName=“”):用来区分当前单元格所属那个表格范围
我这里用了三种颜色来标示,我说的应该能明白吧,那个groupName会从当前单元格开始,一直包容这之后的单元格,但他不会对同级的进行包容,例如m8(名称8)就是和“基本信息”处在同级。基本信息包含了m1~m7(名称1-名称7)。名称15就只包含了m2,m3(名称2,名称3)。名称16就包含了m4,m5,m6(名称4,名称5,名称6)
@Excel(replace = {“”}):用于文本替换的
导入的时候就会自动给我替换成想要的值了
3,execl数据导入,案例:
@PostMapping("/import")
public void importData(MultipartFile file) throws Exception {
ImportParams params = new ImportParams();
params.setTitleRows(1);
// 从第几行开始,因为第一个大标题被上面的参数给占了,所以不是4
params.setHeadRows(3);
List<EsaypoiTest> list = ExcelImportUtil.importExcel(file.getInputStream(), EsaypoiTest.class, params);
list.forEach(System.out::println);
for (EsaypoiTest esaypoiTest : list) {
esaypoiTestService.save(esaypoiTest);
}
}
导入相对简单,数据入库效果:
4,数据库数据导出到excel表
- 设置导出格式模板
在自定义的模板下,设置成这样的形式,可以了,表头与导入时保持一致。只是导出的时候,导出的模板没有数据,只有属性值,用来接收数据的
代码实现:
@GetMapping("/export")
public void exportData(HttpServletResponse response) throws Exception {
List<EsaypoiTest> list = esaypoiTestService.list();
// 模板路径
String path = "C:\\Users\\myqxin\\Desktop\\poi\\模板测试.xlsx";
TemplateExportParams temp = new TemplateExportParams(path);
HashMap<String, Object> map = new HashMap<>();
map.put("maplist", list);
Workbook workbook = ExcelExportUtil.exportExcel(temp, map);
if (workbook == null) {
//读取模板失败
}
// 设置excel的文件名称
String fileName = "模板测试成功" + ".xlsx";
// 重置响应对象
response.reset();
try {
response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8"));
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
response.setContentType("textml;charset=utf-8");
response.setHeader("Pragma", "no-cache");
response.setHeader("Cache-Control", "no-cache");
response.setDateHeader("Expires", 0);
// 写出数据输出流到页面
try {
OutputStream output = response.getOutputStream();
BufferedOutputStream bufferedOutPut = new BufferedOutputStream(output);
workbook.write(bufferedOutPut);
bufferedOutPut.flush();
bufferedOutPut.close();
output.close();
} catch (IOException e) {
e.printStackTrace();
}
}
注意事项:在遍历的列中不能有空单元格
如非要留着占用,可以使用&NULL&进行占位
更多问题参考这里:https://blog.csdn.net/weixin_38312502/article/details/105627498
更多推荐
所有评论(0)