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. 创建CSS3警示框渐变动画

    来源:GBin1.com 在线演示   在线下载 现代的网页设计技术已经允许开发人员在大多数浏览器中快速实现所支持的动画,其中消息警示是非常普遍的.由于默认的JavaScript警示框往往设计不佳和过 ...

  2. LeetCode Add Binary |My Solution

    Given two binary strings, return their sum (also a binary string). For example, a = "11" b ...

  3. RGB和HSL色彩的相互转换

    转自: http://blog.csdn.net/aniven/article/details/2205851 RGB和HSL(也叫HSB/HSV)是两种色彩空间,即:红,绿,蓝(Red,Green, ...

  4. swipeRefreshLayout与webview滑动冲突

    遇到这么个bug,webview使用swipeRefreshLayout时,下拉时事件不会被webview捕获,而是执行swipeRefreshLayout的刷新,网上一大堆一大堆的解决办法,都是什么 ...

  5. 【iOS开发-33】学习手动内存管理临时抛弃ARC以及retain/assign知识——iOSproject师面试必考内容

    我们为什么须要内存管理?当使用内存达到40M和45M时候会发出警告,假设不处理,占用内存达到120M时直接强制关闭程序. 所以出现闪退除了是程序出现逻辑错误,还有可能是内存使用过大. (1)创建一个对 ...

  6. 转:BOOTSTRAP 增加、关闭、折叠TAB代码下载

    http://git.oschina.net/hbbcs/bootStrap-addTabs

  7. Python 实现字符串转换成列表 实现str转换list

    其中Python strip() 方法用于移除字符串头尾指定的字符 split()就是将一个字符串分裂成多个字符串组成的列表 >>> image ='1.jsp,2.jsp,3.js ...

  8. 教程:VS2010 之TFS入门指南(转载)

    [原文发表地址] Tutorial: Getting Started with TFS in VS2010 [原文发表时间] Wednesday, October 21, 2009 1:00 PM 本 ...

  9. fs 小计

    如果是export 就可以放到b-leg上 如果是set就可以对于a-leg

  10. 单双口RAM

    // Quartus II Verilog Template// Simple Dual Port RAM with separate read/write addresses and// singl ...