java简易excel导入导出工具(封装POI)

news/2024/7/24 12:59:24
  • Octopus
    • 如何导入excel
    • 如何导出excel

Octopus

Octopus 是一个简单的java excel导入导出工具.

如何导入excel

下面是一个excel文件中sheet的数据,有四个学生信息.

studentIdnamesexinTimescore
20134123JohnM2013-9-189
20124524JoyceF20123-8-3179
20156243P2015-5-1594
20116522NemoF2011-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


http://www.niftyadmin.cn/n/625375.html

相关文章

Java面板基础:JPanel和JScrollPane

面板有两种&#xff0c;一种是普通面板(JPanel)&#xff0c;另一种是滚动面板(JScrollPane)。 JPanel 面板是一种通用容器&#xff0c;JPanel的作用是实现界面的层次结构&#xff0c;在它上面放入一些组件&#xff0c;也可以在上面绘画&#xff0c;将放有组件和有画的JPanel…

<input> 标签的 accept 属性

在项目中有些时候需要进行文件的上传&#xff0c;这时候在前端页面可以使用 标签的 accept 属性&#xff0c;定义和用法 accept 属性只能与 配合使用。它规定能够通过文件上传进行提交的文件类型。 <input accept"value">比如&#xff1a;输入字段可以接受 gi…

Springboot+Vue整合笔记【超详细】

| 作者&#xff1a;江夏 | 微信公众号&#xff1a;1024笔记 | 知乎&#xff1a;https://www.zhihu.com/people/qing-ni-chi-you-zi-96 | GitHub&#xff1a;https://github.com/JiangXia-1024?tabrepositories Part 1 目前很多公司的开发模式都是前后的分离的分工模式&#…

几个必须掌握的SQL优化技巧(一):查看SQL语句的执行频率

part 1 在应用的开发过程中&#xff0c;由于开发初期的数据量一般都比较小&#xff0c;所以开发过程中一般都比较注重功能上的实现&#xff0c;但是当完成了一个应用或者系统之后&#xff0c;随着生产数据量的急剧增长&#xff0c;那么之前的很多sql语句的写法就会显现出一定的…

安装python包遇到ModuleNotFoundError: No module named ‘pip‘的解决办法

今天在使用python的过程中遇到一些小问题。一开始是想安装pandas库&#xff0c;但是在安装过程中提示需要使用新版本的pip命令&#xff1a; 然后使用了 pip install --upgrade pip命令对pip进行升级&#xff0c;结果又出现了以下问题: 这时候不知道怎么回事就使用升级命令&am…

MySQL日志必知必会

part 1 在日常的开发中&#xff0c;我们都会习惯记录日志&#xff0c;通过日志我们可以记录程序在何时何种情况发生过何种事情&#xff0c;有助于我们快速地定位bug和修复bug。在任何一种数据库中&#xff0c;也有着各种各样的日志&#xff0c;记录着数据库工作的方方面面&…

Spring Boot开发图片上传并添加水印接口

| 知乎&#xff1a;https://www.zhihu.com/people/qing-ni-chi-you-zi-96 | GitHub&#xff1a;https://github.com/JiangXia-1024?tabrepositories | 博客地址&#xff1a;https://blog.csdn.net/qq_41153943 | 微信公众号&#xff1a;搜索【1024笔记】 现在知识文化领域越来…

Java注解(Annotation)的基本原理以及实现自定义注解

在我们使用springboot的时候我们知道因为注解的存在&#xff0c;使得我们的开发变得格外的方便、快捷。之前的文章Spring常用注解大全&#xff0c;值得你的收藏&#xff01;&#xff01;&#xff01;对于spring中各类注解也进行过介绍。然而注解也并不是因为spring框架的兴起才…