java简易excel导入导出工具(封装POI)
Octopus
Octopus 是一个简单的java excel导入导出工具.
如何导入excel
下面是一个excel文件中sheet的数据,有四个学生信息.
| studentId | name | sex | inTime | score |
|---|---|---|---|---|
| 20134123 | John | M | 2013-9-1 | 89 |
| 20124524 | Joyce | F | 20123-8-31 | 79 |
| 20156243 | P | 2015-5-15 | 94 | |
| 20116522 | Nemo | F | 2011-2-26 |
一个学生类,用来保存从excel中读取的学生信息.
//lombok annotations
@Getter
@Setter
@NoArgsConstructor
@ToString
public class Student {
@ModelLineNumber
private int lineNum;
@ModelProperty(value = "id",blankable = false)
private String studentId;
@ModelProperty(value = "name",defaultValue = "anonymous")
private String name;
@ModelProperty(value = "sex",wrongMsg = "sex must be M or F",pattern = "^M|F$")
private String sex;
@ModelProperty(value = "admission",wrongMsg = "admission must be a date")
private LocalDate inTime;
@ModelProperty(value = "score",wrongMsg = "score must be numeric",defaultValue = "100")
private Double score;
}
用代码读取excel,并输出学生信息:
InputStream is = getClass().getResourceAsStream("/test.xlsx");
Workbook workbook = WorkbookFactory.create(is);
Sheet sheet = workbook.getSheetAt(0);
//read students with ReusableSheetReader
SheetReader<ModelEntity<Student>> students = new ReusableSheetReader<>(sheet,1,0,Student.class);
//print students information
for (ModelEntity<Student> student:students) {
System.out.println(student.toString());
}
输出的学生信息
SimpleModelEntity(entity=Student(lineNum=2, studentId=20134123, name=John, sex=M, inTime=2013-09-01, score=89.0, gradeAndClazz=null), exceptions=[])
SimpleModelEntity(entity=Student(lineNum=3, studentId=20124524, name=Joyce, sex=F, inTime=null, score=79.0, gradeAndClazz=null), exceptions=[cn.chenhuanming.octopus.exception.DataFormatException: in cell (3,4) ,20123-8-31 can not be formatted to class java.time.LocalDate])
SimpleModelEntity(entity=Student(lineNum=4, studentId=20156243, name=anonymous, sex=null, inTime=2015-05-15, score=94.0, gradeAndClazz=null), exceptions=[cn.chenhuanming.octopus.exception.PatternNotMatchException: P and ^M|F$ don't match!])
SimpleModelEntity(entity=Student(lineNum=5, studentId=20116522, name=Nemo, sex=F, inTime=2011-02-26, score=100.0, gradeAndClazz=null), exceptions=[])
通过ModelEntity<Student>,可以获取更多异常信息,例如@ModelProperty的配置信息和所发生的异常.
完整的测试用例:src/test/cn/chenhuanming/octopus/core/SheetReaderTest
如何导出excel
为了说明导出的特性,我们给Student类增加一个属性GradeAndClazz用来表示年级和班级.下面是最终的Student类,可以用来导入导出.
@Getter
@Setter
@NoArgsConstructor
@ToString
public class Student {
@ModelLineNumber
private int lineNum;
@ModelProperty(value = "id",blankable = false)
private String studentId;
@ModelProperty(value = "name",defaultValue = "anonymous")
private String name;
@ModelProperty(value = "sex",wrongMsg = "sex must be M or F",pattern = "^M|F$")
private String sex;
//jackson annotation to format output
@JsonFormat(pattern = "yyyy-MM-dd")
@ModelProperty(value = "admission",wrongMsg = "admission must be a date")
private LocalDate inTime;
@ModelProperty(value = "score",wrongMsg = "score must be numeric",defaultValue = "100")
private Double score;
@ModelIgnore
private GradeAndClazz gradeAndClazz;
public Student(String studentId, String name, String sex, LocalDate inTime, Double score,GradeAndClazz gradeAndClazz) {
this.studentId = studentId;
this.name = name;
this.sex = sex;
this.inTime = inTime;
this.score = score;
this.gradeAndClazz = gradeAndClazz;
}
}
GradeAndClazz类,只有年级和班级两个信息.
@Getter
@Setter
@AllArgsConstructor
public class GradeAndClazz{
private String grade;
private String clazz;
}
需要一个xml来配置导出的属性和属性描述作为表头
<?xml version="1.0" encoding="UTF-8"?>
<ExportModel class="entity.Student">
<Field name="studentId" description="id"></Field>
<Field name="name" description="name"></Field>
<Field name="sex" description="sex"></Field>
<Field name="inTime" description="admission"></Field>
<Field name="score" description="score"></Field>
<Field name="gradeAndClazz" description="class info">
<Field name="grade" description="grade"></Field>
<Field name="clazz" description="class"></Field>
</Field>
</ExportModel>
用代码导出学生信息
//prepare workbook and stuednts objects
Workbook workbook = new XSSFWorkbook();
String rootPath = this.getClass().getClassLoader().getResource("").getPath();
FileOutputStream os = new FileOutputStream(rootPath+"/export.xlsx");
GradeAndClazz gradeAndClazz = new GradeAndClazz("2014","R6");
Student student1 = new Student("201223","John","M", LocalDate.now(),98.00,gradeAndClazz);
Student student2 = new Student("204354","Tony","M", LocalDate.now(),87.00,gradeAndClazz);
Student student3 = new Student("202432","Joyce","F", LocalDate.now(),90.00,gradeAndClazz);
//write excel with OneSheetExcelWriter
ExcelWriter<Student> studentExcelWriter = new OneSheetExcelWriter<>(getClass().getClassLoader().getResourceAsStream("studentExport.xml"));
studentExcelWriter.write(workbook,Arrays.asList(student1,student2,student3));
workbook.write(os);
导出结果
| class info |
id name M admission score |---------|----------|
| grade | class |
---------------------------------------------------------------|
201223 John M 2017-07-06 98.0 | 2014 | R6 |
204354 Tony M 2017-07-06 87.0 | 2014 | R6 |
202432 Joyce F 2017-07-06 90.0 | 2014 | R6 |
可以看到,对于gradeAndClazz属性,会用一个合并单元格来表示.admission因为被@JsonFormat标记,因此会格式化输出日期。事实上Octopus会调用jackson来格式化json后再写入excel.
详细例子在 src/test/cn/chenhuanming/octopus/core/OneSheetExcelWriterTest
github项目地址
java简易excel导入导出工具(封装POI)的更多相关文章
- java中excel导入\导出工具类
1.导入工具 package com.linrain.jcs.test; import jxl.Cell; import jxl.Sheet; import jxl.Workbook; import ...
- 一个基于POI的通用excel导入导出工具类的简单实现及使用方法
前言: 最近PM来了一个需求,简单来说就是在录入数据时一条一条插入到系统显得非常麻烦,让我实现一个直接通过excel导入的方法一次性录入所有数据.网上关于excel导入导出的例子很多,但大多相互借鉴. ...
- Java基础学习总结(49)——Excel导入导出工具类
在项目的pom文件中引入 <dependency> <groupId>net.sourceforge.jexcelapi</groupId> <artifac ...
- Octopus——excel导入导出工具
Octopus Octopus是一个简易的Excel导入导出工具.目前主要就两个功能: 导入:将excel中一行数据转换为指定的java对象,并通过指定的正则表达式检查合法性. 导出:按照给定的xml ...
- Excel导入导出工具(简单、好用且轻量级的海量Excel文件导入导出解决方案.)
Excel导入导出工具(简单.好用且轻量级的海量Excel文件导入导出解决方案.) 置顶 2019-09-07 16:47:10 $9420 阅读数 261更多 分类专栏: java 版权声明:本 ...
- JAVA实现Excel导入/导出【转】
JAVA实现Excel导入/导出[转] POI的下载与安装 请到网站http://www.apache.org/dyn/closer.cgi/poi/右击超链接2.5.1.zip下载压缩包poi-bi ...
- java jxl excel 导入导出的 总结(建立超链接,以及目录sheet的索引)
最近项目要一个批量导出功能,而且要生成一个单独的sheet页,最后后面所有sheet的索引,并且可以点击进入连接.网上搜索了一下,找到一个方法,同时把相关的excel导入导出操作记录一下!以便以后使用 ...
- Excel导入导出工具——POI XSSF的使用
工具简介 POI是Apache提供的一款用于处理Microsoft Office的插件,它可以读写Excel.Word.PowerPoint.Visio等格式的文件. 其中XSSF是poi对Excel ...
- java Excel导入导出工具类
本文章,导入导出依赖提前定义好的模板 package com.shareworx.yjwy.utils; import java.io.File; import java.io.FileInputSt ...
随机推荐
- TestNG系列之二:TestNG套件测试
测试套件的测试是为了测试软件程序的行为或一系列行为的情况下,是一个集合.在TestNG,我们不能定义一套测试源代码,但它代表的套件是一个XML文件执行特征.这也允许灵活的配置要运行的测试.套件可以包含 ...
- 在Lucene或Solr中实现高亮的策略
一:功能背景 近期要做个高亮的搜索需求,曾经也搞过.所以没啥难度.仅仅只是原来用的是Lucene,如今要换成Solr而已,在Lucene4.x的时候,散仙在曾经的文章中也分析过怎样在搜索的时候实现高亮 ...
- SSL Pining Mode 设置iOS SSL 连接安全
一:SSL Ping Mode 使用SSL来进行网络通信成为了很多mobile app的默认选择.最近一些文章发现:一些app并没有采用“额外的措施”来保证窃听不可以发生:这个“额外的步骤“就是SSL ...
- mac git xcrun error active developer path 错误
一:情景: 在mac下使用git;xcode4.6的环境时,需要安装command line tools ,但是在装了xcode5之后,就不需要安装command line tools了,默认已经集成 ...
- webpack安装以及一些配置
在用webpack之前... 或说没有实现组件化之前的web1.0时代! 最终迈向web2..0之后的时代! ===============华丽的分割线================== 安装步骤有 ...
- Hibernate关系映射(三) 多对一和一对多
一.多对一 学生Student和班级Grade实现多对一,多个学生对应一个班级. Student.java实体类,映射了班级的属性. package com.lxit.entity; import j ...
- 使用VisualSVN建立SVN服务器
原地址:http://blog.csdn.net/happyjiang2009/article/details/5719988 以前使用官方Subversion搭建SVN版本控制环境,感觉很繁琐,需要 ...
- Android 文件存储 和 权限管理
转载请标明出处: :http://blog.csdn.net/huaiyiheyuan/article/details/52473984 android SD卡主要有两种存储方式 Internal . ...
- springmvc 数据回显功能
按下 修改数据之后 修改功能实现-转向修改页面 2)控制层实现准备数据,并转向修改页面 ~ PersonController.java package cn.itcast.springmvc.cont ...
- javascript常量的定义
例如可以使用 const PI = 3.14159265; 一般不推荐使用 const 关键字,因为它不是 ECMAScript 语法的一部分.当需要常量的时候一般是以命名习惯来约束的,亦即使用大写字 ...