目录
1 easypoi相关注解
@Excel 作用到field上,是对Excel一列的一个描述
@ExcelCollection 表示一个集合,主要针对一对多的导出
@ExcelEntity 表示一个继续深入导出的实体,但没太多实际意义,只是告诉系统这个对象里面有通样导出的字段
@ExcelIgnore 和名字一样表示这个字段被忽略导出过程
@EcxelTarget 这个是作用于最外层的对象,描述这个对象的id,支持这个对象可以针对不同的导出做出不同处理
@Excel注解相关属性 :
用在field属性上面,是对于excel的一个描述
name:[String]生成excel表中的列名
needMerge: [boolean]是否需要纵向合并单元格
orderNum:[String]用于指定Excel列中的顺序
savepath:【String】指定导出excel中图片的保存路径
type: 【String】导出类型 1文本 2图片 3函数 4数字 ,默认是文本
width: 【Double】指定导出excel列的宽度
isImportField:【boolean】 是否是导入的字段,如果没有说明是错误的excel
exportFormat:【String】导出excel的时间格式
importFormat:【String】导入excel的时间格式
format:【String】 相当于同时设置了exportFormat和importFormat
imageType:【int】导出类型 1从filed读取 2是从数据库中读取 默认是文件
suffix:【String】文字后缀,如%98变为98%
2 easypoi的导出
模拟将一个集合对象到处到excel表格中
User类:
@ExcelTarget("users")
public class User implements Serializable {
@Excel(name = "编号")
private Integer id;
@Excel(name = "姓名")
private String name;
@Excel(name = "年龄",suffix = "*") //在列的后面加上"*"
private Integer age;
@Excel(name = "生日",width = 35.0,format = "yyyy-MM-dd")
private Date bir;
@Excel(name = "状态",replace = {"未删除_1","删除_0"}) //用"未删除替换1"
private String status;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public Date getBir() {
return bir;
}
public void setBir(Date bir) {
this.bir = bir;
}
public String getStatus() {
return status;
}
public void setStatus(String status) {
this.status = status;
}
}
测试类:
/**
* 模拟数据库中的数据
* @return
*/
public List<User> getUsers(){
List<User> users = new ArrayList<>();
for (int i = 0; i < 5; i++) {
User user = new User();
user.setId(i);
user.setName("小王"+i);
user.setAge(i);
user.setBir(new Date());
if(i%2 == 0){
user.setStatus("1");
}else {
user.setStatus("0");
}
users.add(user);
}
return users;
}
@Test
public void testExport() throws Exception{
//获取数据
List<User> users = getUsers();
//导出excel
//参数1:ExportParams导出配置对象 参数2:导出的类型 参数3:导出的数据集合
Workbook workbook = ExcelExportUtil.exportExcel(new ExportParams("用户信息列表", "用户信息"), User.class, users);
//将excel写入指定位置
FileOutputStream fileOutputStream = new FileOutputStream("C:\\Users\\LiuBuJun\\Desktop\\预约信息表格\\aa.xls");
workbook.write(fileOutputStream);
fileOutputStream.close();
workbook.close();
}
测试结果:
注意:
2 easypoi的导入
我们将我们刚刚导出的数据再次导入让其输出:
实体类:
@ExcelTarget("emps")
public class Emp {
@Excel(name = "编号")
private Integer id;
@Excel(name = "姓名")
private String name;
@Excel(name = "年龄",suffix = "*") //在列的后面加上"*"
private Integer age;
@Excel(name = "生日",width = 35.0,format = "yyyy-MM-dd")
private Date bir;
@Excel(name = "状态",replace = {"未删除_1","删除_0"}) //用"未删除替换1"
private String status;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public Date getBir() {
return bir;
}
public void setBir(Date bir) {
this.bir = bir;
}
public String getStatus() {
return status;
}
public void setStatus(String status) {
this.status = status;
}
@Override
public String toString() {
return "Emp{" +
"id=" + id +
", name='" + name + '\'' +
", age=" + age +
", bir=" + bir +
", status='" + status + '\'' +
'}';
}
}
测试类:
@Test
public void testImport() throws Exception{
ImportParams params = new ImportParams();
params.setTitleRows(1);//标题占几行 告诉熊哪行开始读取
params.setHeadRows(1);//header占几行
//params.setStartSheetIndex(2);从第一个sheet开始读物,默认是1
List<Emp> emps = ExcelImportUtil.importExcel(new FileInputStream("C:\\Users\\LiuBuJun\\Desktop\\预约信息表格\\aa.xls"), Emp.class, params);
emps.forEach(System.out::println);
}
测试结果:
由此可见easypoi相比apach的poi而言还是较为方便的。包含了许多功能,有时间再继续验。
另外在说一下最近遇到的小问题,就是可能公司与第三方合作的时候,他们会发送表格数据来让我们排查问题,这个时候我们得根据excel表格中的某一列中的数据数据去我们数据库中做一个in查询,但是当表格中的数据量太大时,我们将列中国的数据一个粘贴复制太费事费力。
换句话说就是将表格中元素用单引号引起来并且用逗号隔开、
代码如下:
@Test
public void testImport() throws Exception{
ImportParams params = new ImportParams();
params.setTitleRows(1);//标题占几行 告诉熊哪行开始读取
params.setHeadRows(1);//header占几行
//params.setStartSheetIndex(2);从第一个sheet开始读物,默认是1
List<Emp> emps = ExcelImportUtil.importExcel(new FileInputStream("C:\\Users\\LiuBuJun\\Desktop\\预约信息表格\\aa.xls"), Emp.class, params);
StringBuffer buffer = new StringBuffer();
String collect = emps.stream().map(emp -> "\'" + emp.getAge() + "\'").collect(Collectors.joining(","));
System.out.println(collect);
}
测试结果:
着样的话我们就不用一个个粘贴复制excel表格中的数据了。有关poi使用链接:poi导入/导出_set sail_2021的博客-CSDN博客