MyExcelは、インポート、エクスポート、暗号化、Excel、およびJavaツールキットの他の多くの機能のセットです。
更新内容は、以下のとおり
- SaxExcelReader元インターフェイスは、.xlsファイルは、ファイルタイプ、自動識別を指定する必要はありませんサポートしています。
- DefaultExcelReader並列ストリームの読み取りインタフェースを削除します。
- エクセル日付型のSimpleDateFormatキャッシュ増加へのデータのインポートは、作成、パフォーマンスを向上させるために繰り返される大規模なオブジェクトのデータの読み出しを避けるために、
- FileSystemNotFoundException問題に関するリペアThymeleafExcelBuilder。
- 問題のあるソースファイルにつながる可能性関連のリソースを閉じていない修理Excelのインポートは使用できません。
もっと会場:https://github.com/liaochong/myexcel/wik
輸出:
/**
* 方式一:普通方式导出
*/
@GetMapping("/default/excel/example")
public void defaultBuild(HttpServletResponse response) throws Exception {
List<ArtCrowd> dataList = this.getDataList();
Workbook workbook = DefaultExcelBuilder.of(ArtCrowd.class)
.build(dataList);
AttachmentExportUtil.export(workbook, "艺术生信息", response);
// 加密导出 AttachmentExportUtil.encryptExport(workbook, "艺术生信息", response,"123456");
}
/**
* 方式二:生产者消费者模式导出,分批获取数据,分批写入Excel,真正意义上实现海量数据导出
*/
@GetMapping("/default/excel/stream/example")
public void streamBuild(HttpServletResponse response) throws Exception {
// 显式标明开始构建
DefaultStreamExcelBuilder defaultExcelBuilder = DefaultStreamExcelBuilder.of(ArtCrowd.class)
.threadPool(Executors.newFixedThreadPool(10))
.start();
// 多线程异步获取数据并追加至excel,join等待线程执行完成
List<CompletableFuture> futures = new ArrayList<>();
for (int i = 0; i < 100; i++) {
CompletableFuture future = CompletableFuture.runAsync(() -> {
List<ArtCrowd> dataList = this.getDataList();
// 数据追加
defaultExcelBuilder.append(dataList);
});
futures.add(future);
}
futures.forEach(CompletableFuture::join);
// 最终构建
Workbook workbook = defaultExcelBuilder.build();
AttachmentExportUtil.export(workbook, "艺术生信息", response);
}
インポート:
URL htmlToExcelEampleURL = this.getClass().getResource("/templates/read_example.xlsx");
Path path = Paths.get(htmlToExcelEampleURL.toURI());
// 方式一:全部读取后处理
List<ArtCrowd> result = DefaultExcelReader.of(ArtCrowd.class)
.sheet(0) // 0代表第一个,如果为0,可省略该操作
.rowFilter(row -> row.getRowNum() > 0) // 如无需过滤,可省略该操作,0代表第一行
.beanFilter(ArtCrowd::isDance) // bean过滤
.read(path.toFile());// 可接收inputStream
// 方式二:读取一行处理一行,可自行决定终止条件
DefaultExcelReader.of(ArtCrowd.class)
.sheet(0) // 0代表第一个,如果为0,可省略该操作
.rowFilter(row -> row.getRowNum() > 0) // 如无需过滤,可省略该操作,0代表第一行
.beanFilter(ArtCrowd::isDance) // bean过滤
.readThen(path.toFile() ,artCrowd -> System.out.println(artCrowd.getName));// 可接收inputStream
// 方式三:全部读取后处理,SAX模式,避免OOM,建议大量数据使用
List<ArtCrowd> result = SaxExcelReader.of(ArtCrowd.class)
.sheet(0) // 0代表第一个,如果为0,可省略该操作
.rowFilter(row -> row.getRowNum() > 0) // 如无需过滤,可省略该操作,0代表第一行
.beanFilter(ArtCrowd::isDance) // bean过滤
.read(path.toFile());// 可接收inputStream
// 方式四:读取一行处理一行,可自行决定终止条件,SAX模式,避免OOM,建议大量数据使用
SaxExcelReader.of(ArtCrowd.class)
.sheet(0) // 0代表第一个,如果为0,可省略该操作
.rowFilter(row -> row.getRowNum() > 0) // 如无需过滤,可省略该操作,0代表第一行
.beanFilter(ArtCrowd::isDance) // bean过滤
.readThen(path.toFile() ,artCrowd -> System.out.println(artCrowd.getName));// 可接收inputStream
public class ArtCrowd {
// index代表列索引,从0开始
@ExcelColumn(index = 0)
private String name;
@ExcelColumn(index = 1)
private String age;
@ExcelColumn(index = 2,dateFormatPattern="yyyy-MM-dd")
private Date birthday;
}
効果: