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)的更多相关文章

  1. java中excel导入\导出工具类

    1.导入工具 package com.linrain.jcs.test; import jxl.Cell; import jxl.Sheet; import jxl.Workbook; import ...

  2. 一个基于POI的通用excel导入导出工具类的简单实现及使用方法

    前言: 最近PM来了一个需求,简单来说就是在录入数据时一条一条插入到系统显得非常麻烦,让我实现一个直接通过excel导入的方法一次性录入所有数据.网上关于excel导入导出的例子很多,但大多相互借鉴. ...

  3. Java基础学习总结(49)——Excel导入导出工具类

    在项目的pom文件中引入 <dependency> <groupId>net.sourceforge.jexcelapi</groupId> <artifac ...

  4. Octopus——excel导入导出工具

    Octopus Octopus是一个简易的Excel导入导出工具.目前主要就两个功能: 导入:将excel中一行数据转换为指定的java对象,并通过指定的正则表达式检查合法性. 导出:按照给定的xml ...

  5. Excel导入导出工具(简单、好用且轻量级的海量Excel文件导入导出解决方案.)

    Excel导入导出工具(简单.好用且轻量级的海量Excel文件导入导出解决方案.) 置顶 2019-09-07 16:47:10 $9420 阅读数 261更多 分类专栏: java   版权声明:本 ...

  6. JAVA实现Excel导入/导出【转】

    JAVA实现Excel导入/导出[转] POI的下载与安装 请到网站http://www.apache.org/dyn/closer.cgi/poi/右击超链接2.5.1.zip下载压缩包poi-bi ...

  7. java jxl excel 导入导出的 总结(建立超链接,以及目录sheet的索引)

    最近项目要一个批量导出功能,而且要生成一个单独的sheet页,最后后面所有sheet的索引,并且可以点击进入连接.网上搜索了一下,找到一个方法,同时把相关的excel导入导出操作记录一下!以便以后使用 ...

  8. Excel导入导出工具——POI XSSF的使用

    工具简介 POI是Apache提供的一款用于处理Microsoft Office的插件,它可以读写Excel.Word.PowerPoint.Visio等格式的文件. 其中XSSF是poi对Excel ...

  9. java Excel导入导出工具类

    本文章,导入导出依赖提前定义好的模板 package com.shareworx.yjwy.utils; import java.io.File; import java.io.FileInputSt ...

随机推荐

  1. automake连载--Linux下使用automake入门

    http://blog.csdn.net/shanzhizi/article/details/30246587 近来重要要总结一下automake的用法了,连载几篇网上已有的文章,以供参考. 作为Li ...

  2. zabbix_LAMP源码安装

    Zabbix源码包安装 Cenos5.3 Basic server 安装顺序 Libxml2 Libmcrypt Zlib Libpng Jpeg:需要创建目录jpeg /bin /lib /incl ...

  3. Linux命令之编辑

    vi是终端命令行里功能最强的文本编辑器了,但眼下须要用到的仅仅是文本编辑功能.与GCC.make等工具的整合应用如今还不须要,所以操作难度不大,习惯就好. Linux发行版所带的一般不是vi,而是vi ...

  4. windows print 自定义字体颜色【python】

    windows print 自定义字体颜色 import ctypes STD_INPUT_HANDLE = -10 STD_OUTPUT_HANDLE= -11 STD_ERROR_HANDLE = ...

  5. 从源代码制作iDempiere Server安装软件(Ubuntu Desktop 12.04 LTS 64位)

    怀揣着为中小企业量身定做一整套开源软件解决方案的梦想开始了一个网站的搭建.http://osssme.org/ 在Eclipse中寻找org.adempiere.server-feature项目 右击 ...

  6. 华为无线ap3010dn-agn刷成胖ap

    刚买的华为ap3010dn-agn 版本为 v200R007C20SPC500  默认不带命令 ap-mode-switch [Huawei]dis version Huawei Versatile ...

  7. linuxshell中"2>&1"含义

    http://blog.sina.com.cn/s/blog_652819220100wpvu.html

  8. mongodb - 集合重命名

    #创建新的集合yb > for(i=0;i<10;i++){db.yb.insert({'i':i})} WriteResult({ "nInserted" : 1 } ...

  9. python 2,3版本自动识别导入

     import sys if str(sys.version[0]) == "3":    from urllib.parse import quote_plus    from  ...

  10. VS创建、安装、调试 windows服务(windows service)

    1.创建 windows服务 项目   文件 -> 新建项目 -> 已安装的模板 -> Visual C# -> windows ,在右侧窗口选择"windows 服 ...