Browse Source

* 读写支持`不使用 try-with-resources`语法糖

pull/2472/head
Jiaju Zhuang 3 years ago
parent
commit
93d3f256f6
  1. 23
      easyexcel-core/src/main/java/com/alibaba/excel/ExcelReader.java
  2. 22
      easyexcel-core/src/main/java/com/alibaba/excel/ExcelWriter.java
  3. 2
      easyexcel-core/src/main/java/com/alibaba/excel/util/ClassUtils.java
  4. 276
      easyexcel-test/src/test/java/com/alibaba/easyexcel/test/demo/fill/FillTest.java
  5. 29
      easyexcel-test/src/test/java/com/alibaba/easyexcel/test/demo/read/ReadTest.java
  6. 117
      easyexcel-test/src/test/java/com/alibaba/easyexcel/test/demo/write/WriteTest.java
  7. 2
      easyexcel-test/src/test/java/com/alibaba/easyexcel/test/temp/simple/Wirte.java
  8. 1
      update.md

23
easyexcel-core/src/main/java/com/alibaba/excel/ExcelReader.java

@ -1,5 +1,7 @@
package com.alibaba.excel; package com.alibaba.excel;
import java.io.Closeable;
import java.io.IOException;
import java.util.Arrays; import java.util.Arrays;
import java.util.List; import java.util.List;
@ -18,8 +20,7 @@ import org.slf4j.LoggerFactory;
* *
* @author jipengfei * @author jipengfei
*/ */
public class ExcelReader { public class ExcelReader implements Closeable {
private static final Logger LOGGER = LoggerFactory.getLogger(ExcelReader.class);
/** /**
* Analyser * Analyser
@ -50,8 +51,7 @@ public class ExcelReader {
/** /**
* Parse the specified sheetSheetNo start from 0 * Parse the specified sheetSheetNo start from 0
* *
* @param readSheet * @param readSheet Read sheet
* Read sheet
*/ */
public ExcelReader read(ReadSheet... readSheet) { public ExcelReader read(ReadSheet... readSheet) {
return read(Arrays.asList(readSheet)); return read(Arrays.asList(readSheet));
@ -68,7 +68,6 @@ public class ExcelReader {
return this; return this;
} }
/** /**
* Context for the entire execution process * Context for the entire execution process
* *
@ -88,7 +87,6 @@ public class ExcelReader {
} }
/** /**
*
* @return * @return
* @deprecated please use {@link #analysisContext()} * @deprecated please use {@link #analysisContext()}
*/ */
@ -106,17 +104,8 @@ public class ExcelReader {
} }
} }
/**
* Prevents calls to {@link #finish} from freeing the cache
*
*/
@Override @Override
protected void finalize() { public void close() {
try { finish();
finish();
} catch (Throwable e) {
LOGGER.warn("Destroy object failed", e);
}
} }
} }

22
easyexcel-core/src/main/java/com/alibaba/excel/ExcelWriter.java

@ -1,5 +1,7 @@
package com.alibaba.excel; package com.alibaba.excel;
import java.io.Closeable;
import java.io.IOException;
import java.util.Collection; import java.util.Collection;
import java.util.function.Supplier; import java.util.function.Supplier;
@ -25,8 +27,7 @@ import org.slf4j.LoggerFactory;
* *
* @author jipengfei * @author jipengfei
*/ */
public class ExcelWriter { public class ExcelWriter implements Closeable {
private static final Logger LOGGER = LoggerFactory.getLogger(ExcelWriter.class);
private ExcelBuilder excelBuilder; private ExcelBuilder excelBuilder;
@ -144,18 +145,6 @@ public class ExcelWriter {
} }
} }
/**
* Prevents calls to {@link #finish} from freeing the cache
*/
@Override
protected void finalize() {
try {
finish();
} catch (Throwable e) {
LOGGER.warn("Destroy object failed", e);
}
}
/** /**
* The context of the entire writing process * The context of the entire writing process
* *
@ -164,4 +153,9 @@ public class ExcelWriter {
public WriteContext writeContext() { public WriteContext writeContext() {
return excelBuilder.writeContext(); return excelBuilder.writeContext();
} }
@Override
public void close() {
finish();
}
} }

2
easyexcel-core/src/main/java/com/alibaba/excel/util/ClassUtils.java

@ -162,7 +162,7 @@ public class ClassUtils {
Class<? extends Converter<?>> convertClazz = excelProperty.converter(); Class<? extends Converter<?>> convertClazz = excelProperty.converter();
if (convertClazz != AutoConverter.class) { if (convertClazz != AutoConverter.class) {
try { try {
Converter<?> converter = convertClazz.newInstance(); Converter<?> converter = convertClazz.getDeclaredConstructor().newInstance();
excelContentProperty.setConverter(converter); excelContentProperty.setConverter(converter);
} catch (Exception e) { } catch (Exception e) {
throw new ExcelCommonException( throw new ExcelCommonException(

276
easyexcel-test/src/test/java/com/alibaba/easyexcel/test/demo/fill/FillTest.java

@ -83,14 +83,28 @@ public class FillTest {
return data(); return data();
}); });
// 方案3 分多次 填充 会使用文件缓存(省内存) // 方案3.1 分多次 填充 会使用文件缓存(省内存) 使用 try-with-resources @since 3.1.0
fileName = TestFileUtil.getPath() + "listFill" + System.currentTimeMillis() + ".xlsx"; fileName = TestFileUtil.getPath() + "listFill" + System.currentTimeMillis() + ".xlsx";
ExcelWriter excelWriter = EasyExcel.write(fileName).withTemplate(templateFileName).build(); try (ExcelWriter excelWriter = EasyExcel.write(fileName).withTemplate(templateFileName).build()) {
WriteSheet writeSheet = EasyExcel.writerSheet().build(); WriteSheet writeSheet = EasyExcel.writerSheet().build();
excelWriter.fill(data(), writeSheet); excelWriter.fill(data(), writeSheet);
excelWriter.fill(data(), writeSheet); excelWriter.fill(data(), writeSheet);
// 千万别忘记关闭流 }
excelWriter.finish();
// 方案3.2 分多次 填充 会使用文件缓存(省内存) 不使用 try-with-resources
fileName = TestFileUtil.getPath() + "listFill" + System.currentTimeMillis() + ".xlsx";
ExcelWriter excelWriter = null;
try {
excelWriter = EasyExcel.write(fileName).withTemplate(templateFileName).build();
WriteSheet writeSheet = EasyExcel.writerSheet().build();
excelWriter.fill(data(), writeSheet);
excelWriter.fill(data(), writeSheet);
} finally {
// 千万别忘记close 会帮忙关闭流
if (excelWriter != null) {
excelWriter.close();
}
}
} }
/** /**
@ -106,20 +120,44 @@ public class FillTest {
TestFileUtil.getPath() + "demo" + File.separator + "fill" + File.separator + "complex.xlsx"; TestFileUtil.getPath() + "demo" + File.separator + "fill" + File.separator + "complex.xlsx";
String fileName = TestFileUtil.getPath() + "complexFill" + System.currentTimeMillis() + ".xlsx"; String fileName = TestFileUtil.getPath() + "complexFill" + System.currentTimeMillis() + ".xlsx";
ExcelWriter excelWriter = EasyExcel.write(fileName).withTemplate(templateFileName).build(); // 方案1 : 使用 try-with-resources @since 3.1.0
WriteSheet writeSheet = EasyExcel.writerSheet().build(); try (ExcelWriter excelWriter = EasyExcel.write(fileName).withTemplate(templateFileName).build()) {
// 这里注意 入参用了forceNewRow 代表在写入list的时候不管list下面有没有空行 都会创建一行,然后下面的数据往后移动。默认 是false,会直接使用下一行,如果没有则创建。 WriteSheet writeSheet = EasyExcel.writerSheet().build();
// forceNewRow 如果设置了true,有个缺点 就是他会把所有的数据都放到内存了,所以慎用 // 这里注意 入参用了forceNewRow 代表在写入list的时候不管list下面有没有空行 都会创建一行,然后下面的数据往后移动。默认 是false,会直接使用下一行,如果没有则创建。
// 简单的说 如果你的模板有list,且list不是最后一行,下面还有数据需要填充 就必须设置 forceNewRow=true 但是这个就会把所有数据放到内存 会很耗内存 // forceNewRow 如果设置了true,有个缺点 就是他会把所有的数据都放到内存了,所以慎用
// 如果数据量大 list不是最后一行 参照下一个 // 简单的说 如果你的模板有list,且list不是最后一行,下面还有数据需要填充 就必须设置 forceNewRow=true 但是这个就会把所有数据放到内存 会很耗内存
FillConfig fillConfig = FillConfig.builder().forceNewRow(Boolean.TRUE).build(); // 如果数据量大 list不是最后一行 参照下一个
excelWriter.fill(data(), fillConfig, writeSheet); FillConfig fillConfig = FillConfig.builder().forceNewRow(Boolean.TRUE).build();
excelWriter.fill(data(), fillConfig, writeSheet); excelWriter.fill(data(), fillConfig, writeSheet);
Map<String, Object> map = MapUtils.newHashMap(); excelWriter.fill(data(), fillConfig, writeSheet);
map.put("date", "2019年10月9日13:28:28"); Map<String, Object> map = MapUtils.newHashMap();
map.put("total", 1000); map.put("date", "2019年10月9日13:28:28");
excelWriter.fill(map, writeSheet); map.put("total", 1000);
excelWriter.finish(); excelWriter.fill(map, writeSheet);
}
// 方案2 : 不使用 try-with-resources
ExcelWriter excelWriter = null;
try {
excelWriter = EasyExcel.write(fileName).withTemplate(templateFileName).build();
WriteSheet writeSheet = EasyExcel.writerSheet().build();
// 这里注意 入参用了forceNewRow 代表在写入list的时候不管list下面有没有空行 都会创建一行,然后下面的数据往后移动。默认 是false,会直接使用下一行,如果没有则创建。
// forceNewRow 如果设置了true,有个缺点 就是他会把所有的数据都放到内存了,所以慎用
// 简单的说 如果你的模板有list,且list不是最后一行,下面还有数据需要填充 就必须设置 forceNewRow=true 但是这个就会把所有数据放到内存 会很耗内存
// 如果数据量大 list不是最后一行 参照下一个
FillConfig fillConfig = FillConfig.builder().forceNewRow(Boolean.TRUE).build();
excelWriter.fill(data(), fillConfig, writeSheet);
excelWriter.fill(data(), fillConfig, writeSheet);
Map<String, Object> map = MapUtils.newHashMap();
map.put("date", "2019年10月9日13:28:28");
map.put("total", 1000);
excelWriter.fill(map, writeSheet);
} finally {
// 千万别忘记close 会帮忙关闭流
if (excelWriter != null) {
excelWriter.close();
}
}
} }
/** /**
@ -138,32 +176,70 @@ public class FillTest {
TestFileUtil.getPath() + "demo" + File.separator + "fill" + File.separator + "complexFillWithTable.xlsx"; TestFileUtil.getPath() + "demo" + File.separator + "fill" + File.separator + "complexFillWithTable.xlsx";
String fileName = TestFileUtil.getPath() + "complexFillWithTable" + System.currentTimeMillis() + ".xlsx"; String fileName = TestFileUtil.getPath() + "complexFillWithTable" + System.currentTimeMillis() + ".xlsx";
ExcelWriter excelWriter = EasyExcel.write(fileName).withTemplate(templateFileName).build();
WriteSheet writeSheet = EasyExcel.writerSheet().build(); // 方案1 : 使用 try-with-resources @since 3.1.0
// 直接写入数据 try (ExcelWriter excelWriter = EasyExcel.write(fileName).withTemplate(templateFileName).build()) {
excelWriter.fill(data(), writeSheet); WriteSheet writeSheet = EasyExcel.writerSheet().build();
excelWriter.fill(data(), writeSheet); // 直接写入数据
excelWriter.fill(data(), writeSheet);
// 写入list之前的数据 excelWriter.fill(data(), writeSheet);
Map<String, Object> map = new HashMap<String, Object>();
map.put("date", "2019年10月9日13:28:28"); // 写入list之前的数据
excelWriter.fill(map, writeSheet); Map<String, Object> map = new HashMap<String, Object>();
map.put("date", "2019年10月9日13:28:28");
// list 后面还有个统计 想办法手动写入 excelWriter.fill(map, writeSheet);
// 这里偷懒直接用list 也可以用对象
List<List<String>> totalListList = ListUtils.newArrayList(); // list 后面还有个统计 想办法手动写入
List<String> totalList = ListUtils.newArrayList(); // 这里偷懒直接用list 也可以用对象
totalListList.add(totalList); List<List<String>> totalListList = ListUtils.newArrayList();
totalList.add(null); List<String> totalList = ListUtils.newArrayList();
totalList.add(null); totalListList.add(totalList);
totalList.add(null); totalList.add(null);
// 第四列 totalList.add(null);
totalList.add("统计:1000"); totalList.add(null);
// 这里是write 别和fill 搞错了 // 第四列
excelWriter.write(totalListList, writeSheet); totalList.add("统计:1000");
excelWriter.finish(); // 这里是write 别和fill 搞错了
// 总体上写法比较复杂 但是也没有想到好的版本 异步的去写入excel 不支持行的删除和移动,也不支持备注这种的写入,所以也排除了可以 excelWriter.write(totalListList, writeSheet);
// 新建一个 然后一点点复制过来的方案,最后导致list需要新增行的时候,后面的列的数据没法后移,后续会继续想想解决方案 // 总体上写法比较复杂 但是也没有想到好的版本 异步的去写入excel 不支持行的删除和移动,也不支持备注这种的写入,所以也排除了可以
// 新建一个 然后一点点复制过来的方案,最后导致list需要新增行的时候,后面的列的数据没法后移,后续会继续想想解决方案
}
// 方案2 : 不使用 try-with-resources
ExcelWriter excelWriter = null;
try {
excelWriter = EasyExcel.write(fileName).withTemplate(templateFileName).build();
WriteSheet writeSheet = EasyExcel.writerSheet().build();
// 直接写入数据
excelWriter.fill(data(), writeSheet);
excelWriter.fill(data(), writeSheet);
// 写入list之前的数据
Map<String, Object> map = new HashMap<String, Object>();
map.put("date", "2019年10月9日13:28:28");
excelWriter.fill(map, writeSheet);
// list 后面还有个统计 想办法手动写入
// 这里偷懒直接用list 也可以用对象
List<List<String>> totalListList = ListUtils.newArrayList();
List<String> totalList = ListUtils.newArrayList();
totalListList.add(totalList);
totalList.add(null);
totalList.add(null);
totalList.add(null);
// 第四列
totalList.add("统计:1000");
// 这里是write 别和fill 搞错了
excelWriter.write(totalListList, writeSheet);
// 总体上写法比较复杂 但是也没有想到好的版本 异步的去写入excel 不支持行的删除和移动,也不支持备注这种的写入,所以也排除了可以
// 新建一个 然后一点点复制过来的方案,最后导致list需要新增行的时候,后面的列的数据没法后移,后续会继续想想解决方案
} finally {
// 千万别忘记close 会帮忙关闭流
if (excelWriter != null) {
excelWriter.close();
}
}
} }
/** /**
@ -179,18 +255,36 @@ public class FillTest {
TestFileUtil.getPath() + "demo" + File.separator + "fill" + File.separator + "horizontal.xlsx"; TestFileUtil.getPath() + "demo" + File.separator + "fill" + File.separator + "horizontal.xlsx";
String fileName = TestFileUtil.getPath() + "horizontalFill" + System.currentTimeMillis() + ".xlsx"; String fileName = TestFileUtil.getPath() + "horizontalFill" + System.currentTimeMillis() + ".xlsx";
ExcelWriter excelWriter = EasyExcel.write(fileName).withTemplate(templateFileName).build(); // 方案1 : 使用 try-with-resources @since 3.1.0
WriteSheet writeSheet = EasyExcel.writerSheet().build(); try (ExcelWriter excelWriter = EasyExcel.write(fileName).withTemplate(templateFileName).build()) {
FillConfig fillConfig = FillConfig.builder().direction(WriteDirectionEnum.HORIZONTAL).build(); WriteSheet writeSheet = EasyExcel.writerSheet().build();
excelWriter.fill(data(), fillConfig, writeSheet); FillConfig fillConfig = FillConfig.builder().direction(WriteDirectionEnum.HORIZONTAL).build();
excelWriter.fill(data(), fillConfig, writeSheet); excelWriter.fill(data(), fillConfig, writeSheet);
excelWriter.fill(data(), fillConfig, writeSheet);
Map<String, Object> map = new HashMap<String, Object>();
map.put("date", "2019年10月9日13:28:28"); Map<String, Object> map = new HashMap<>();
excelWriter.fill(map, writeSheet); map.put("date", "2019年10月9日13:28:28");
excelWriter.fill(map, writeSheet);
// 别忘记关闭流 }
excelWriter.finish();
// 方案2 : 不使用 try-with-resources
ExcelWriter excelWriter = null;
try {
excelWriter = EasyExcel.write(fileName).withTemplate(templateFileName).build();
WriteSheet writeSheet = EasyExcel.writerSheet().build();
FillConfig fillConfig = FillConfig.builder().direction(WriteDirectionEnum.HORIZONTAL).build();
excelWriter.fill(data(), fillConfig, writeSheet);
excelWriter.fill(data(), fillConfig, writeSheet);
Map<String, Object> map = new HashMap<String, Object>();
map.put("date", "2019年10月9日13:28:28");
excelWriter.fill(map, writeSheet);
} finally {
// 千万别忘记close 会帮忙关闭流
if (excelWriter != null) {
excelWriter.close();
}
}
} }
/** /**
@ -206,25 +300,51 @@ public class FillTest {
TestFileUtil.getPath() + "demo" + File.separator + "fill" + File.separator + "composite.xlsx"; TestFileUtil.getPath() + "demo" + File.separator + "fill" + File.separator + "composite.xlsx";
String fileName = TestFileUtil.getPath() + "compositeFill" + System.currentTimeMillis() + ".xlsx"; String fileName = TestFileUtil.getPath() + "compositeFill" + System.currentTimeMillis() + ".xlsx";
ExcelWriter excelWriter = EasyExcel.write(fileName).withTemplate(templateFileName).build();
WriteSheet writeSheet = EasyExcel.writerSheet().build(); // 方案1 : 使用 try-with-resources @since 3.1.0
FillConfig fillConfig = FillConfig.builder().direction(WriteDirectionEnum.HORIZONTAL).build(); try (ExcelWriter excelWriter = EasyExcel.write(fileName).withTemplate(templateFileName).build()) {
// 如果有多个list 模板上必须有{前缀.} 这里的前缀就是 data1,然后多个list必须用 FillWrapper包裹 WriteSheet writeSheet = EasyExcel.writerSheet().build();
excelWriter.fill(new FillWrapper("data1", data()), fillConfig, writeSheet); FillConfig fillConfig = FillConfig.builder().direction(WriteDirectionEnum.HORIZONTAL).build();
excelWriter.fill(new FillWrapper("data1", data()), fillConfig, writeSheet); // 如果有多个list 模板上必须有{前缀.} 这里的前缀就是 data1,然后多个list必须用 FillWrapper包裹
excelWriter.fill(new FillWrapper("data2", data()), writeSheet); excelWriter.fill(new FillWrapper("data1", data()), fillConfig, writeSheet);
excelWriter.fill(new FillWrapper("data2", data()), writeSheet); excelWriter.fill(new FillWrapper("data1", data()), fillConfig, writeSheet);
excelWriter.fill(new FillWrapper("data3", data()), writeSheet); excelWriter.fill(new FillWrapper("data2", data()), writeSheet);
excelWriter.fill(new FillWrapper("data3", data()), writeSheet); excelWriter.fill(new FillWrapper("data2", data()), writeSheet);
excelWriter.fill(new FillWrapper("data3", data()), writeSheet);
Map<String, Object> map = new HashMap<String, Object>(); excelWriter.fill(new FillWrapper("data3", data()), writeSheet);
//map.put("date", "2019年10月9日13:28:28");
map.put("date", new Date()); Map<String, Object> map = new HashMap<String, Object>();
//map.put("date", "2019年10月9日13:28:28");
excelWriter.fill(map, writeSheet); map.put("date", new Date());
// 别忘记关闭流 excelWriter.fill(map, writeSheet);
excelWriter.finish(); }
// 方案2 : 不使用 try-with-resources
ExcelWriter excelWriter = null;
try {
excelWriter = EasyExcel.write(fileName).withTemplate(templateFileName).build();
WriteSheet writeSheet = EasyExcel.writerSheet().build();
FillConfig fillConfig = FillConfig.builder().direction(WriteDirectionEnum.HORIZONTAL).build();
// 如果有多个list 模板上必须有{前缀.} 这里的前缀就是 data1,然后多个list必须用 FillWrapper包裹
excelWriter.fill(new FillWrapper("data1", data()), fillConfig, writeSheet);
excelWriter.fill(new FillWrapper("data1", data()), fillConfig, writeSheet);
excelWriter.fill(new FillWrapper("data2", data()), writeSheet);
excelWriter.fill(new FillWrapper("data2", data()), writeSheet);
excelWriter.fill(new FillWrapper("data3", data()), writeSheet);
excelWriter.fill(new FillWrapper("data3", data()), writeSheet);
Map<String, Object> map = new HashMap<String, Object>();
//map.put("date", "2019年10月9日13:28:28");
map.put("date", new Date());
excelWriter.fill(map, writeSheet);
} finally {
// 千万别忘记close 会帮忙关闭流
if (excelWriter != null) {
excelWriter.close();
}
}
} }
private List<FillData> data() { private List<FillData> data() {

29
easyexcel-test/src/test/java/com/alibaba/easyexcel/test/demo/read/ReadTest.java

@ -98,7 +98,17 @@ public class ReadTest {
// 这里 需要指定读用哪个class去读,然后读取第一个sheet 文件流会自动关闭 // 这里 需要指定读用哪个class去读,然后读取第一个sheet 文件流会自动关闭
EasyExcel.read(fileName, DemoData.class, new DemoDataListener()).sheet().doRead(); EasyExcel.read(fileName, DemoData.class, new DemoDataListener()).sheet().doRead();
// 写法4: // 写法4: 使用 try-with-resources @since 3.1.0
fileName = TestFileUtil.getPath() + "demo" + File.separator + "demo.xlsx";
// 一个文件一个reader
try (ExcelReader excelReader = EasyExcel.read(fileName, DemoData.class, new DemoDataListener()).build()) {
// 构建一个sheet 这里可以指定名字或者no
ReadSheet readSheet = EasyExcel.readSheet(0).build();
// 读取一个sheet
excelReader.read(readSheet);
}
// 写法5: 不使用 try-with-resources
fileName = TestFileUtil.getPath() + "demo" + File.separator + "demo.xlsx"; fileName = TestFileUtil.getPath() + "demo" + File.separator + "demo.xlsx";
// 一个文件一个reader // 一个文件一个reader
ExcelReader excelReader = null; ExcelReader excelReader = null;
@ -111,7 +121,7 @@ public class ReadTest {
} finally { } finally {
if (excelReader != null) { if (excelReader != null) {
// 这里千万别忘记关闭,读的时候会创建临时文件,到时磁盘会崩的 // 这里千万别忘记关闭,读的时候会创建临时文件,到时磁盘会崩的
excelReader.finish(); excelReader.close();
} }
} }
} }
@ -151,6 +161,19 @@ public class ReadTest {
// 读取部分sheet // 读取部分sheet
fileName = TestFileUtil.getPath() + "demo" + File.separator + "demo.xlsx"; fileName = TestFileUtil.getPath() + "demo" + File.separator + "demo.xlsx";
// 写法1: 使用 try-with-resources @since 3.1.0
try (ExcelReader excelReader = EasyExcel.read(fileName).build()) {
// 这里为了简单 所以注册了 同样的head 和Listener 自己使用功能必须不同的Listener
ReadSheet readSheet1 =
EasyExcel.readSheet(0).head(DemoData.class).registerReadListener(new DemoDataListener()).build();
ReadSheet readSheet2 =
EasyExcel.readSheet(1).head(DemoData.class).registerReadListener(new DemoDataListener()).build();
// 这里注意 一定要把sheet1 sheet2 一起传进去,不然有个问题就是03版的excel 会读取多次,浪费性能
excelReader.read(readSheet1, readSheet2);
}
// 写法2: 不使用 try-with-resources
ExcelReader excelReader = null; ExcelReader excelReader = null;
try { try {
excelReader = EasyExcel.read(fileName).build(); excelReader = EasyExcel.read(fileName).build();
@ -165,7 +188,7 @@ public class ReadTest {
} finally { } finally {
if (excelReader != null) { if (excelReader != null) {
// 这里千万别忘记关闭,读的时候会创建临时文件,到时磁盘会崩的 // 这里千万别忘记关闭,读的时候会创建临时文件,到时磁盘会崩的
excelReader.finish(); excelReader.close();
} }
} }
} }

117
easyexcel-test/src/test/java/com/alibaba/easyexcel/test/demo/write/WriteTest.java

@ -86,7 +86,15 @@ public class WriteTest {
// 如果这里想使用03 则 传入excelType参数即可 // 如果这里想使用03 则 传入excelType参数即可
EasyExcel.write(fileName, DemoData.class).sheet("模板").doWrite(data()); EasyExcel.write(fileName, DemoData.class).sheet("模板").doWrite(data());
// 写法3 // 写法3:使用 try-with-resources @since 3.1.0
fileName = TestFileUtil.getPath() + "simpleWrite" + System.currentTimeMillis() + ".xlsx";
// 这里 需要指定写用哪个class去写
try (ExcelWriter excelWriter = EasyExcel.write(fileName, DemoData.class).build()) {
WriteSheet writeSheet = EasyExcel.writerSheet("模板").build();
excelWriter.write(data(), writeSheet);
}
// 写法4: 不使用 try-with-resources
fileName = TestFileUtil.getPath() + "simpleWrite" + System.currentTimeMillis() + ".xlsx"; fileName = TestFileUtil.getPath() + "simpleWrite" + System.currentTimeMillis() + ".xlsx";
// 这里 需要指定写用哪个class去写 // 这里 需要指定写用哪个class去写
ExcelWriter excelWriter = null; ExcelWriter excelWriter = null;
@ -95,9 +103,9 @@ public class WriteTest {
WriteSheet writeSheet = EasyExcel.writerSheet("模板").build(); WriteSheet writeSheet = EasyExcel.writerSheet("模板").build();
excelWriter.write(data(), writeSheet); excelWriter.write(data(), writeSheet);
} finally { } finally {
// 千万别忘记finish 会帮忙关闭流 // 千万别忘记close 会帮忙关闭流
if (excelWriter != null) { if (excelWriter != null) {
excelWriter.finish(); excelWriter.close();
} }
} }
} }
@ -177,52 +185,95 @@ public class WriteTest {
*/ */
@Test @Test
public void repeatedWrite() { public void repeatedWrite() {
// 方法1 如果写到同一个sheet // 方法1.1: 如果写到同一个sheet 使用 try-with-resources @since 3.1.0
String fileName = TestFileUtil.getPath() + "repeatedWrite" + System.currentTimeMillis() + ".xlsx"; String fileName = TestFileUtil.getPath() + "repeatedWrite" + System.currentTimeMillis() + ".xlsx";
ExcelWriter excelWriter = null; // 这里 需要指定写用哪个class去写
try (ExcelWriter excelWriter = EasyExcel.write(fileName, DemoData.class).build()) {
// 这里注意 如果同一个sheet只要创建一次
WriteSheet writeSheet = EasyExcel.writerSheet("模板").build();
// 去调用写入,这里我调用了五次,实际使用时根据数据库分页的总的页数来
for (int i = 0; i < 5; i++) {
// 分页去数据库查询数据 这里可以去数据库查询每一页的数据
List<DemoData> data = data();
excelWriter.write(data, writeSheet);
}
}
// 方法1.2: 如果写到同一个sheet 不使用 try-with-resources
fileName = TestFileUtil.getPath() + "repeatedWrite" + System.currentTimeMillis() + ".xlsx";
ExcelWriter writer = null;
try { try {
// 这里 需要指定写用哪个class去写 // 这里 需要指定写用哪个class去写
excelWriter = EasyExcel.write(fileName, DemoData.class).build(); writer = EasyExcel.write(fileName, DemoData.class).build();
// 这里注意 如果同一个sheet只要创建一次 // 这里注意 如果同一个sheet只要创建一次
WriteSheet writeSheet = EasyExcel.writerSheet("模板").build(); WriteSheet writeSheet = EasyExcel.writerSheet("模板").build();
// 去调用写入,这里我调用了五次,实际使用时根据数据库分页的总的页数来 // 去调用写入,这里我调用了五次,实际使用时根据数据库分页的总的页数来
for (int i = 0; i < 5; i++) { for (int i = 0; i < 5; i++) {
// 分页去数据库查询数据 这里可以去数据库查询每一页的数据 // 分页去数据库查询数据 这里可以去数据库查询每一页的数据
List<DemoData> data = data(); List<DemoData> data = data();
excelWriter.write(data, writeSheet); writer.write(data, writeSheet);
} }
} finally { } finally {
// 千万别忘记finish 会帮忙关闭流 // 千万别忘记close 会帮忙关闭流
if (excelWriter != null) { if (writer != null) {
excelWriter.finish(); writer.finish();
}
}
// 方法2.1: 如果写到不同的sheet 同一个对象 使用 try-with-resources @since 3.1.0
fileName = TestFileUtil.getPath() + "repeatedWrite" + System.currentTimeMillis() + ".xlsx";
// 这里 指定文件
try (ExcelWriter excelWriter = EasyExcel.write(fileName, DemoData.class).build()) {
// 去调用写入,这里我调用了五次,实际使用时根据数据库分页的总的页数来。这里最终会写到5个sheet里面
for (int i = 0; i < 5; i++) {
// 每次都要创建writeSheet 这里注意必须指定sheetNo 而且sheetName必须不一样
WriteSheet writeSheet = EasyExcel.writerSheet(i, "模板" + i).build();
// 分页去数据库查询数据 这里可以去数据库查询每一页的数据
List<DemoData> data = data();
excelWriter.write(data, writeSheet);
} }
} }
// 方法2 如果写到不同的sheet 同一个对象 // 方法2.2: 如果写到不同的sheet 同一个对象 不使用 try-with-resources
fileName = TestFileUtil.getPath() + "repeatedWrite" + System.currentTimeMillis() + ".xlsx"; fileName = TestFileUtil.getPath() + "repeatedWrite" + System.currentTimeMillis() + ".xlsx";
try { try {
// 这里 指定文件 // 这里 指定文件
excelWriter = EasyExcel.write(fileName, DemoData.class).build(); writer = EasyExcel.write(fileName, DemoData.class).build();
// 去调用写入,这里我调用了五次,实际使用时根据数据库分页的总的页数来。这里最终会写到5个sheet里面 // 去调用写入,这里我调用了五次,实际使用时根据数据库分页的总的页数来。这里最终会写到5个sheet里面
for (int i = 0; i < 5; i++) { for (int i = 0; i < 5; i++) {
// 每次都要创建writeSheet 这里注意必须指定sheetNo 而且sheetName必须不一样 // 每次都要创建writeSheet 这里注意必须指定sheetNo 而且sheetName必须不一样
WriteSheet writeSheet = EasyExcel.writerSheet(i, "模板" + i).build(); WriteSheet writeSheet = EasyExcel.writerSheet(i, "模板" + i).build();
// 分页去数据库查询数据 这里可以去数据库查询每一页的数据 // 分页去数据库查询数据 这里可以去数据库查询每一页的数据
List<DemoData> data = data(); List<DemoData> data = data();
excelWriter.write(data, writeSheet); writer.write(data, writeSheet);
} }
} finally { } finally {
// 千万别忘记finish 会帮忙关闭流 // 千万别忘记close 会帮忙关闭流
if (excelWriter != null) { if (writer != null) {
excelWriter.finish(); writer.finish();
} }
} }
// 方法3 如果写到不同的sheet 不同的对象 // 方法3.1 如果写到不同的sheet 不同的对象 使用 try-with-resources @since 3.1.0
fileName = TestFileUtil.getPath() + "repeatedWrite" + System.currentTimeMillis() + ".xlsx";
// 这里 指定文件
try (ExcelWriter excelWriter = EasyExcel.write(fileName).build()) {
// 去调用写入,这里我调用了五次,实际使用时根据数据库分页的总的页数来。这里最终会写到5个sheet里面
for (int i = 0; i < 5; i++) {
// 每次都要创建writeSheet 这里注意必须指定sheetNo 而且sheetName必须不一样。这里注意DemoData.class 可以每次都变,我这里为了方便 所以用的同一个class
// 实际上可以一直变
WriteSheet writeSheet = EasyExcel.writerSheet(i, "模板" + i).head(DemoData.class).build();
// 分页去数据库查询数据 这里可以去数据库查询每一页的数据
List<DemoData> data = data();
excelWriter.write(data, writeSheet);
}
}
// 方法3.2 如果写到不同的sheet 不同的对象 不使用 try-with-resources
fileName = TestFileUtil.getPath() + "repeatedWrite" + System.currentTimeMillis() + ".xlsx"; fileName = TestFileUtil.getPath() + "repeatedWrite" + System.currentTimeMillis() + ".xlsx";
try { try {
// 这里 指定文件 // 这里 指定文件
excelWriter = EasyExcel.write(fileName).build(); writer = EasyExcel.write(fileName).build();
// 去调用写入,这里我调用了五次,实际使用时根据数据库分页的总的页数来。这里最终会写到5个sheet里面 // 去调用写入,这里我调用了五次,实际使用时根据数据库分页的总的页数来。这里最终会写到5个sheet里面
for (int i = 0; i < 5; i++) { for (int i = 0; i < 5; i++) {
// 每次都要创建writeSheet 这里注意必须指定sheetNo 而且sheetName必须不一样。这里注意DemoData.class 可以每次都变,我这里为了方便 所以用的同一个class // 每次都要创建writeSheet 这里注意必须指定sheetNo 而且sheetName必须不一样。这里注意DemoData.class 可以每次都变,我这里为了方便 所以用的同一个class
@ -230,12 +281,12 @@ public class WriteTest {
WriteSheet writeSheet = EasyExcel.writerSheet(i, "模板" + i).head(DemoData.class).build(); WriteSheet writeSheet = EasyExcel.writerSheet(i, "模板" + i).head(DemoData.class).build();
// 分页去数据库查询数据 这里可以去数据库查询每一页的数据 // 分页去数据库查询数据 这里可以去数据库查询每一页的数据
List<DemoData> data = data(); List<DemoData> data = data();
excelWriter.write(data, writeSheet); writer.write(data, writeSheet);
} }
} finally { } finally {
// 千万别忘记finish 会帮忙关闭流 // 千万别忘记close 会帮忙关闭流
if (excelWriter != null) { if (writer != null) {
excelWriter.finish(); writer.finish();
} }
} }
} }
@ -269,7 +320,7 @@ public class WriteTest {
String imagePath = TestFileUtil.getPath() + "converter" + File.separator + "img.jpg"; String imagePath = TestFileUtil.getPath() + "converter" + File.separator + "img.jpg";
try (InputStream inputStream = FileUtils.openInputStream(new File(imagePath))) { try (InputStream inputStream = FileUtils.openInputStream(new File(imagePath))) {
List<ImageDemoData> list = ListUtils.newArrayList(); List<ImageDemoData> list = ListUtils.newArrayList();
ImageDemoData imageDemoData = new ImageDemoData(); ImageDemoData imageDemoData = new ImageDemoData();
list.add(imageDemoData); list.add(imageDemoData);
// 放入五种类型的图片 实际使用只要选一种即可 // 放入五种类型的图片 实际使用只要选一种即可
@ -598,7 +649,21 @@ public class WriteTest {
@Test @Test
public void tableWrite() { public void tableWrite() {
String fileName = TestFileUtil.getPath() + "tableWrite" + System.currentTimeMillis() + ".xlsx"; String fileName = TestFileUtil.getPath() + "tableWrite" + System.currentTimeMillis() + ".xlsx";
// 这里直接写多个table的案例了,如果只有一个 也可以直一行代码搞定,参照其他案例 // 方法1 这里直接写多个table的案例了,如果只有一个 也可以直一行代码搞定,参照其他案, 使用 try-with-resources @since 3.1.0
// 这里 需要指定写用哪个class去写
try (ExcelWriter excelWriter = EasyExcel.write(fileName, DemoData.class).build()) {
// 把sheet设置为不需要头 不然会输出sheet的头 这样看起来第一个table 就有2个头了
WriteSheet writeSheet = EasyExcel.writerSheet("模板").needHead(Boolean.FALSE).build();
// 这里必须指定需要头,table 会继承sheet的配置,sheet配置了不需要,table 默认也是不需要
WriteTable writeTable0 = EasyExcel.writerTable(0).needHead(Boolean.TRUE).build();
WriteTable writeTable1 = EasyExcel.writerTable(1).needHead(Boolean.TRUE).build();
// 第一次写入会创建头
excelWriter.write(data(), writeSheet, writeTable0);
// 第二次写如也会创建头,然后在第一次的后面写入数据
excelWriter.write(data(), writeSheet, writeTable1);
}
// 方法2 这里直接写多个table的案例了,如果只有一个 也可以直一行代码搞定,参照其他案, 不使用 try-with-resources
// 这里 需要指定写用哪个class去写 // 这里 需要指定写用哪个class去写
ExcelWriter excelWriter = null; ExcelWriter excelWriter = null;
try { try {
@ -613,9 +678,9 @@ public class WriteTest {
// 第二次写如也会创建头,然后在第一次的后面写入数据 // 第二次写如也会创建头,然后在第一次的后面写入数据
excelWriter.write(data(), writeSheet, writeTable1); excelWriter.write(data(), writeSheet, writeTable1);
} finally { } finally {
// 千万别忘记finish 会帮忙关闭流 // 千万别忘记close 会帮忙关闭流
if (excelWriter != null) { if (excelWriter != null) {
excelWriter.finish(); excelWriter.close();
} }
} }
} }

2
easyexcel-test/src/test/java/com/alibaba/easyexcel/test/temp/simple/Wirte.java

@ -104,7 +104,7 @@ public class Wirte {
// 第一次写入会创建头 // 第一次写入会创建头
excelWriter.write(data(), writeSheet, writeTable0); excelWriter.write(data(), writeSheet, writeTable0);
// 第二次写如也会创建头,然后在第一次的后面写入数据 // 第二次写如也会创建头,然后在第一次的后面写入数据
/// 千万别忘记finish 会帮忙关闭流 /// 千万别忘记close 会帮忙关闭流
excelWriter.finish(); excelWriter.finish();
} }

1
update.md

@ -12,6 +12,7 @@
* 增加部分`xls`容错 [Issue #2236](https://github.com/alibaba/easyexcel/issues/2236) * 增加部分`xls`容错 [Issue #2236](https://github.com/alibaba/easyexcel/issues/2236)
* 修复读取csv文件时`autoTrim`配置失效 [Issue #2227](https://github.com/alibaba/easyexcel/issues/2227) * 修复读取csv文件时`autoTrim`配置失效 [Issue #2227](https://github.com/alibaba/easyexcel/issues/2227)
* csv支持设置读写编码 [Issue #2404](https://github.com/alibaba/easyexcel/issues/2404) * csv支持设置读写编码 [Issue #2404](https://github.com/alibaba/easyexcel/issues/2404)
* 读写支持`不使用 try-with-resources`语法糖
# 3.0.5 # 3.0.5

Loading…
Cancel
Save