JAva簡易excelエクスポートインポートツール(パッケージPOI)
6639 ワード
githubアドレス
Octopus
EXcelのインポート方法
次はexcelファイルのsheetのデータで、4人の学生情報があります.
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から読み出す学生情報を保存する学生クラス.
コードでexcelを読み込み、学生情報を出力します.
学生情報の出力
完全なテスト例:
導出特性を説明するために、
エクスポートされたプロパティとプロパティの説明をヘッダーとして構成するにはxmlが必要です.
コードによる学生情報のエクスポート
結果のエクスポート
gradeAndClazzプロパティでは、
詳細例
Octopus
Octopus
は簡単なjava excelインポートエクスポートツールである.EXcelのインポート方法
次はexcelファイルのsheetのデータで、4人の学生情報があります.
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> students = new ReusableSheetReader<>(sheet,1,0,Student.class);
//print students information
for (ModelEntity 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
により、より多くの異常情報、例えば@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
類で、学年とクラスの2つの情報しかありません.@Getter
@Setter
@AllArgsConstructor
public class GradeAndClazz{
private String grade;
private String clazz;
}
エクスポートされたプロパティとプロパティの説明をヘッダーとして構成するにはxmlが必要です.
コードによる学生情報のエクスポート
//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 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プロパティでは、
@JsonFormat
でマークされているため、出力日がフォーマットされます.実際にはOctopus
がjackson
を呼び出してjsonをフォーマットしてexcelに書き込む.詳細例
src/test/cn/chenhuanming/octopus/core/OneSheetExcelWriterTest