From 99f041e9cdd2845d855ba902681486ade6ce5550 Mon Sep 17 00:00:00 2001 From: zhuangjiaju Date: Tue, 6 Aug 2019 13:19:38 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96=E8=AF=BB=E5=86=99=E9=80=BB?= =?UTF-8?q?=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 15 ++- .../java/com/alibaba/excel/EasyExcel.java | 8 ++ .../com/alibaba/excel/EasyExcelFactory.java | 18 ++-- .../read/builder/ExcelReaderSheetBuilder.java | 14 +-- .../builder/ExcelWriterSheetBuilder.java | 9 +- .../builder/ExcelWriterTableBuilder.java | 9 +- .../core/annotation/AnnotationDataTest.java | 8 +- .../AnnotationIndexAndNameDataTest.java | 8 +- .../compatibility/CompatibilityDataTest.java | 4 +- .../CompatibilityParameterDataTest.java | 18 ++-- .../core/converter/ConverterDataTest.java | 11 +- .../core/exception/ExceptionDataTest.java | 8 +- .../test/core/head/ComplexHeadDataTest.java | 6 +- .../test/core/head/ListHeadDataTest.java | 6 +- .../test/core/head/NoHeadDataTest.java | 7 +- .../test/core/large/LargeDataTest.java | 6 +- .../core/parameter/ParameterDataTest.java | 58 +++++------ .../core/repetition/RepetitionDataTest.java | 20 ++-- .../test/core/simple/SimpleDataTest.java | 12 +-- .../test/core/style/StyleDataTest.java | 16 +-- .../test/core/template/TemplateDataTest.java | 18 ++-- .../test/demo/read/ConverterData.java | 31 ++++++ .../test/demo/read/ConverterDataListener.java | 49 +++++++++ .../read/CustomStringStringConverter.java | 59 +++++++++++ .../easyexcel/test/demo/read/ReadTest.java | 97 +++++++++++++++++- .../easyexcel/test/demo/web/WebTest.java | 5 +- .../easyexcel/test/demo/write/WriteTest.java | 17 ++- src/test/resources/demo/demo.xlsx | Bin 9139 -> 10112 bytes 28 files changed, 377 insertions(+), 160 deletions(-) create mode 100644 src/main/java/com/alibaba/excel/EasyExcel.java create mode 100644 src/test/java/com/alibaba/easyexcel/test/demo/read/ConverterData.java create mode 100644 src/test/java/com/alibaba/easyexcel/test/demo/read/ConverterDataListener.java create mode 100644 src/test/java/com/alibaba/easyexcel/test/demo/read/CustomStringStringConverter.java diff --git a/README.md b/README.md index 1358e53b..0cf42e02 100644 --- a/README.md +++ b/README.md @@ -45,8 +45,8 @@ DEMO代码地址:[https://github.com/alibaba/easyexcel/blob/master/src/test/ja @Test public void simpleRead() { String fileName = TestFileUtil.getPath() + "demo" + File.separator + "demo.xlsx"; - // 这里 需要指定读用哪个class去读,然后读取第一个sheet 然后千万别忘记 finish - EasyExcelFactory.read(fileName, DemoData.class, new DemoDataListener()).sheet().doRead().finish(); + // 这里 需要指定读用哪个class去读,然后读取第一个sheet 文件流会自动关闭 + EasyExcel.read(fileName, DemoData.class, new DemoDataListener()).sheet().doRead(); } ``` @@ -60,10 +60,10 @@ DEMO代码地址:[https://github.com/alibaba/easyexcel/blob/master/src/test/ja */ @Test public void simpleWrite() { - String fileName = TestFileUtil.getPath() + "write.xlsx"; - // 这里 需要指定写用哪个class去读,然后写到第一个sheet,名字为模板 然后千万别忘记 finish + String fileName = TestFileUtil.getPath() + "write" + System.currentTimeMillis() + ".xlsx"; + // 这里 需要指定写用哪个class去读,然后写到第一个sheet,名字为模板 然后文件流会自动关闭 // 如果这里想使用03 则 传入excelType参数即可 - EasyExcelFactory.write(fileName, DemoData.class).sheet("模板").doWrite(data()).finish(); + EasyExcel.write(fileName, DemoData.class).sheet("模板").doWrite(data()); } ``` @@ -81,7 +81,7 @@ DEMO代码地址:[https://github.com/alibaba/easyexcel/blob/master/src/test/ja response.setContentType("application/vnd.ms-excel"); response.setCharacterEncoding("utf-8"); response.setHeader("Content-disposition", "attachment;filename=demo.xlsx"); - EasyExcelFactory.write(response.getOutputStream(), DownloadData.class).sheet("模板").doWrite(data()).finish(); + EasyExcel.write(response.getOutputStream(), DownloadData.class).sheet("模板").doWrite(data()); } /** @@ -93,8 +93,7 @@ DEMO代码地址:[https://github.com/alibaba/easyexcel/blob/master/src/test/ja @PostMapping("upload") @ResponseBody public String upload(MultipartFile file) throws IOException { - EasyExcelFactory.read(file.getInputStream(), UploadData.class, new UploadDataListener()).sheet().doRead() - .finish(); + EasyExcel.read(file.getInputStream(), UploadData.class, new UploadDataListener()).sheet().doRead(); return "success"; } ``` diff --git a/src/main/java/com/alibaba/excel/EasyExcel.java b/src/main/java/com/alibaba/excel/EasyExcel.java new file mode 100644 index 00000000..897b9091 --- /dev/null +++ b/src/main/java/com/alibaba/excel/EasyExcel.java @@ -0,0 +1,8 @@ +package com.alibaba.excel; + +/** + * This is actually {@link EasyExcelFactory}, and it's nice to have a short name + * + * @author jipengfei + */ +public class EasyExcel extends EasyExcelFactory {} diff --git a/src/main/java/com/alibaba/excel/EasyExcelFactory.java b/src/main/java/com/alibaba/excel/EasyExcelFactory.java index 3fb81358..c1789c13 100644 --- a/src/main/java/com/alibaba/excel/EasyExcelFactory.java +++ b/src/main/java/com/alibaba/excel/EasyExcelFactory.java @@ -47,7 +47,7 @@ public class EasyExcelFactory { * @param sheet * read sheet. * @return analysis result. - * @deprecated please use 'EasyExcelFactory.read(in).sheet(sheetNo).doReadSync();' + * @deprecated please use 'EasyExcel.read(in).sheet(sheetNo).doReadSync();' */ @Deprecated public static List read(InputStream in, Sheet sheet) { @@ -73,7 +73,7 @@ public class EasyExcelFactory { * read sheet. * @param listener * Callback method after each row is parsed. - * @deprecated please use 'EasyExcelFactory.read(in,head,listener).sheet(sheetNo).doRead().finish();' + * @deprecated please use 'EasyExcel.read(in,head,listener).sheet(sheetNo).doRead().finish();' */ @Deprecated public static void readBySax(InputStream in, Sheet sheet, AnalysisEventListener listener) { @@ -88,7 +88,7 @@ public class EasyExcelFactory { * @param listener * Callback method after each row is parsed. * @return ExcelReader. - * @deprecated please use {@link EasyExcelFactory#read()} build 'ExcelReader' + * @deprecated please use {@link EasyExcel#read()} build 'ExcelReader' */ @Deprecated public static ExcelReader getReader(InputStream in, AnalysisEventListener listener) { @@ -101,7 +101,7 @@ public class EasyExcelFactory { * @param outputStream * the java OutputStream you wish to write the value to. * @return new ExcelWriter. - * @deprecated please use {@link EasyExcelFactory#write()} + * @deprecated please use {@link EasyExcel#write()} */ @Deprecated public static ExcelWriter getWriter(OutputStream outputStream) { @@ -118,7 +118,7 @@ public class EasyExcelFactory { * @param needHead * Do you need to write the header to the file? * @return new ExcelWriter - * @deprecated please use {@link EasyExcelFactory#write()} + * @deprecated please use {@link EasyExcel#write()} */ @Deprecated public static ExcelWriter getWriter(OutputStream outputStream, ExcelTypeEnum typeEnum, boolean needHead) { @@ -137,7 +137,7 @@ public class EasyExcelFactory { * @param typeEnum * 03 or 07 * @return new ExcelWriter - * @deprecated please use {@link EasyExcelFactory#write()} + * @deprecated please use {@link EasyExcel#write()} */ @Deprecated public static ExcelWriter getWriterWithTemp(InputStream temp, OutputStream outputStream, ExcelTypeEnum typeEnum, @@ -160,7 +160,7 @@ public class EasyExcelFactory { * @param handler * User-defined callback * @return new ExcelWriter - * @deprecated please use {@link EasyExcelFactory#write()} + * @deprecated please use {@link EasyExcel#write()} */ @Deprecated public static ExcelWriter getWriterWithTempAndHandler(InputStream temp, OutputStream outputStream, @@ -300,7 +300,7 @@ public class EasyExcelFactory { if (sheetName != null) { excelWriterSheetBuilder.sheetName(sheetName); } - return new ExcelWriterSheetBuilder(); + return excelWriterSheetBuilder; } /** @@ -502,6 +502,6 @@ public class EasyExcelFactory { if (sheetName != null) { excelReaderSheetBuilder.sheetName(sheetName); } - return new ExcelReaderSheetBuilder(); + return excelReaderSheetBuilder; } } diff --git a/src/main/java/com/alibaba/excel/read/builder/ExcelReaderSheetBuilder.java b/src/main/java/com/alibaba/excel/read/builder/ExcelReaderSheetBuilder.java index 8f657fab..eb03981d 100644 --- a/src/main/java/com/alibaba/excel/read/builder/ExcelReaderSheetBuilder.java +++ b/src/main/java/com/alibaba/excel/read/builder/ExcelReaderSheetBuilder.java @@ -152,23 +152,11 @@ public class ExcelReaderSheetBuilder { * * @return */ - public ExcelReaderSheetBuilder doRead() { + public void doRead() { if (excelReader == null) { throw new ExcelGenerateException("Must use 'EasyExcelFactory.read().sheet()' to call this method"); } excelReader.read(build()); - return new ExcelReaderSheetBuilder(excelReader); - } - - /** - * Sax read - * - * @return - */ - public void finish() { - if (excelReader == null) { - throw new ExcelAnalysisException("Must use 'EasyExcelFactory.read().sheet()' to call this method"); - } excelReader.finish(); } diff --git a/src/main/java/com/alibaba/excel/write/builder/ExcelWriterSheetBuilder.java b/src/main/java/com/alibaba/excel/write/builder/ExcelWriterSheetBuilder.java index f80ce10d..bab837d6 100644 --- a/src/main/java/com/alibaba/excel/write/builder/ExcelWriterSheetBuilder.java +++ b/src/main/java/com/alibaba/excel/write/builder/ExcelWriterSheetBuilder.java @@ -127,18 +127,11 @@ public class ExcelWriterSheetBuilder { return writeSheet; } - public ExcelWriterSheetBuilder doWrite(List data) { + public void doWrite(List data) { if (excelWriter == null) { throw new ExcelGenerateException("Must use 'EasyExcelFactory.write().sheet()' to call this method"); } excelWriter.write(data, build()); - return new ExcelWriterSheetBuilder(excelWriter); - } - - public void finish() { - if (excelWriter == null) { - throw new ExcelGenerateException("Must use 'EasyExcelFactory.write().sheet()' to call this method"); - } excelWriter.finish(); } diff --git a/src/main/java/com/alibaba/excel/write/builder/ExcelWriterTableBuilder.java b/src/main/java/com/alibaba/excel/write/builder/ExcelWriterTableBuilder.java index 5e6356a9..14f755ab 100644 --- a/src/main/java/com/alibaba/excel/write/builder/ExcelWriterTableBuilder.java +++ b/src/main/java/com/alibaba/excel/write/builder/ExcelWriterTableBuilder.java @@ -121,18 +121,11 @@ public class ExcelWriterTableBuilder { return writeTable; } - public ExcelWriterTableBuilder doWrite(List data) { + public void doWrite(List data) { if (excelWriter == null) { throw new ExcelGenerateException("Must use 'EasyExcelFactory.write().sheet().table()' to call this method"); } excelWriter.write(data, writeSheet, build()); - return new ExcelWriterTableBuilder(excelWriter, writeSheet); - } - - public void finish() { - if (excelWriter == null) { - throw new ExcelGenerateException("Must use 'EasyExcelFactory.write().sheet()' to call this method"); - } excelWriter.finish(); } diff --git a/src/test/java/com/alibaba/easyexcel/test/core/annotation/AnnotationDataTest.java b/src/test/java/com/alibaba/easyexcel/test/core/annotation/AnnotationDataTest.java index 3feaa172..62fea8ac 100644 --- a/src/test/java/com/alibaba/easyexcel/test/core/annotation/AnnotationDataTest.java +++ b/src/test/java/com/alibaba/easyexcel/test/core/annotation/AnnotationDataTest.java @@ -8,7 +8,7 @@ import org.junit.BeforeClass; import org.junit.Test; import com.alibaba.easyexcel.test.util.TestFileUtil; -import com.alibaba.excel.EasyExcelFactory; +import com.alibaba.excel.EasyExcel; import com.alibaba.excel.util.DateUtils; /** @@ -37,9 +37,9 @@ public class AnnotationDataTest { } private void readAndWrite(File file) throws Exception { - EasyExcelFactory.write().file(file).head(AnnotationData.class).sheet().doWrite(data()).finish(); - EasyExcelFactory.read().file(file).head(AnnotationData.class).registerReadListener(new AnnotationDataListener()) - .sheet().doRead().finish(); + EasyExcel.write().file(file).head(AnnotationData.class).sheet().doWrite(data()); + EasyExcel.read().file(file).head(AnnotationData.class).registerReadListener(new AnnotationDataListener()) + .sheet().doRead(); } private List data() throws Exception { diff --git a/src/test/java/com/alibaba/easyexcel/test/core/annotation/AnnotationIndexAndNameDataTest.java b/src/test/java/com/alibaba/easyexcel/test/core/annotation/AnnotationIndexAndNameDataTest.java index fa64ef5f..148f7194 100644 --- a/src/test/java/com/alibaba/easyexcel/test/core/annotation/AnnotationIndexAndNameDataTest.java +++ b/src/test/java/com/alibaba/easyexcel/test/core/annotation/AnnotationIndexAndNameDataTest.java @@ -8,7 +8,7 @@ import org.junit.BeforeClass; import org.junit.Test; import com.alibaba.easyexcel.test.util.TestFileUtil; -import com.alibaba.excel.EasyExcelFactory; +import com.alibaba.excel.EasyExcel; /** * Annotation data test @@ -37,9 +37,9 @@ public class AnnotationIndexAndNameDataTest { } private void readAndWrite(File file) { - EasyExcelFactory.write(file, AnnotationIndexAndNameData.class).sheet().doWrite(data()).finish(); - EasyExcelFactory.read(file, AnnotationIndexAndNameData.class, new AnnotationIndexAndNameDataListener()).sheet() - .doRead().finish(); + EasyExcel.write(file, AnnotationIndexAndNameData.class).sheet().doWrite(data()); + EasyExcel.read(file, AnnotationIndexAndNameData.class, new AnnotationIndexAndNameDataListener()).sheet() + .doRead(); } private List data() { diff --git a/src/test/java/com/alibaba/easyexcel/test/core/compatibility/CompatibilityDataTest.java b/src/test/java/com/alibaba/easyexcel/test/core/compatibility/CompatibilityDataTest.java index f390f4c9..49af7fe9 100644 --- a/src/test/java/com/alibaba/easyexcel/test/core/compatibility/CompatibilityDataTest.java +++ b/src/test/java/com/alibaba/easyexcel/test/core/compatibility/CompatibilityDataTest.java @@ -16,7 +16,7 @@ import org.junit.BeforeClass; import org.junit.Test; import com.alibaba.easyexcel.test.util.TestFileUtil; -import com.alibaba.excel.EasyExcelFactory; +import com.alibaba.excel.EasyExcel; import com.alibaba.excel.ExcelReader; import com.alibaba.excel.ExcelWriter; import com.alibaba.excel.metadata.Font; @@ -91,7 +91,7 @@ public class CompatibilityDataTest { out.close(); InputStream inputStream = new FileInputStream(file); - List data = EasyExcelFactory.read(inputStream, new Sheet(1, 1)); + List data = EasyExcel.read(inputStream, new Sheet(1, 1)); Assert.assertEquals(data.size(), 1); List dataList = (List)data.get(0); Assert.assertEquals(dataList.get(0), "字符串00"); diff --git a/src/test/java/com/alibaba/easyexcel/test/core/compatibility/CompatibilityParameterDataTest.java b/src/test/java/com/alibaba/easyexcel/test/core/compatibility/CompatibilityParameterDataTest.java index 69f96471..d075f336 100644 --- a/src/test/java/com/alibaba/easyexcel/test/core/compatibility/CompatibilityParameterDataTest.java +++ b/src/test/java/com/alibaba/easyexcel/test/core/compatibility/CompatibilityParameterDataTest.java @@ -12,7 +12,7 @@ import org.junit.BeforeClass; import org.junit.Test; import com.alibaba.easyexcel.test.util.TestFileUtil; -import com.alibaba.excel.EasyExcelFactory; +import com.alibaba.excel.EasyExcel; import com.alibaba.excel.ExcelReader; import com.alibaba.excel.ExcelWriter; import com.alibaba.excel.metadata.Sheet; @@ -42,7 +42,7 @@ public class CompatibilityParameterDataTest { private void readAndWrite1(File file) throws Exception { OutputStream out = new FileOutputStream(file); - ExcelWriter writer = EasyExcelFactory.getWriter(out); + ExcelWriter writer = EasyExcel.getWriter(out); Sheet sheet1 = new Sheet(1, 0); sheet1.setSheetName("第一个sheet"); writer.write0(data(), sheet1); @@ -50,13 +50,13 @@ public class CompatibilityParameterDataTest { out.close(); InputStream inputStream = new FileInputStream(file); - EasyExcelFactory.readBySax(inputStream, new Sheet(1, 0), new CompatibilityDataListener()); + EasyExcel.readBySax(inputStream, new Sheet(1, 0), new CompatibilityDataListener()); inputStream.close(); } private void readAndWrite2(File file) throws Exception { OutputStream out = new FileOutputStream(file); - ExcelWriter writer = EasyExcelFactory.getWriter(out, null, false); + ExcelWriter writer = EasyExcel.getWriter(out, null, false); Sheet sheet1 = new Sheet(1, 0); sheet1.setSheetName("第一个sheet"); writer.write0(data(), sheet1); @@ -64,7 +64,7 @@ public class CompatibilityParameterDataTest { out.close(); InputStream inputStream = new FileInputStream(file); - EasyExcelFactory.readBySax(inputStream, new Sheet(1, 0), new CompatibilityDataListener()); + EasyExcel.readBySax(inputStream, new Sheet(1, 0), new CompatibilityDataListener()); inputStream.close(); } @@ -101,7 +101,7 @@ public class CompatibilityParameterDataTest { private void readAndWrite5(File file) throws Exception { OutputStream out = new FileOutputStream(file); - ExcelWriter writer = EasyExcelFactory.getWriterWithTemp(null, out, null, false); + ExcelWriter writer = EasyExcel.getWriterWithTemp(null, out, null, false); Sheet sheet1 = new Sheet(1, 0); sheet1.setSheetName("第一个sheet"); writer.write0(data(), sheet1, null); @@ -109,14 +109,14 @@ public class CompatibilityParameterDataTest { out.close(); InputStream inputStream = new FileInputStream(file); - ExcelReader excelReader = EasyExcelFactory.getReader(inputStream, new CompatibilityDataListener()); + ExcelReader excelReader = EasyExcel.getReader(inputStream, new CompatibilityDataListener()); excelReader.read(new Sheet(1, 0)); inputStream.close(); } private void readAndWrite6(File file) throws Exception { OutputStream out = new FileOutputStream(file); - ExcelWriter writer = EasyExcelFactory.getWriterWithTempAndHandler(null, out, null, false, null); + ExcelWriter writer = EasyExcel.getWriterWithTempAndHandler(null, out, null, false, null); Sheet sheet1 = new Sheet(1, 0); sheet1.setSheetName("第一个sheet"); writer.write0(data(), sheet1, null); @@ -124,7 +124,7 @@ public class CompatibilityParameterDataTest { out.close(); InputStream inputStream = new FileInputStream(file); - ExcelReader excelReader = EasyExcelFactory.getReader(inputStream, new CompatibilityDataListener()); + ExcelReader excelReader = EasyExcel.getReader(inputStream, new CompatibilityDataListener()); excelReader.read(new Sheet(1, 0)); inputStream.close(); } diff --git a/src/test/java/com/alibaba/easyexcel/test/core/converter/ConverterDataTest.java b/src/test/java/com/alibaba/easyexcel/test/core/converter/ConverterDataTest.java index 4a96bdab..5e6978e0 100644 --- a/src/test/java/com/alibaba/easyexcel/test/core/converter/ConverterDataTest.java +++ b/src/test/java/com/alibaba/easyexcel/test/core/converter/ConverterDataTest.java @@ -11,7 +11,8 @@ import org.junit.Test; import org.junit.runners.MethodSorters; import com.alibaba.easyexcel.test.util.TestFileUtil; -import com.alibaba.excel.EasyExcelFactory; +import com.alibaba.excel.EasyExcel; +import com.alibaba.excel.EasyExcel; import com.alibaba.excel.metadata.CellData; import com.alibaba.excel.util.DateUtils; @@ -42,8 +43,8 @@ public class ConverterDataTest { } private void readAndWrite(File file) throws Exception { - EasyExcelFactory.write(file, ConverterData.class).sheet().doWrite(data()).finish(); - EasyExcelFactory.read(file, ConverterData.class, new ConverterDataListener()).sheet().doRead().finish(); + EasyExcel.write(file, ConverterData.class).sheet().doWrite(data()); + EasyExcel.read(file, ConverterData.class, new ConverterDataListener()).sheet().doRead(); } @Test @@ -57,9 +58,9 @@ public class ConverterDataTest { } private void readAllConverter(String fileName) { - EasyExcelFactory + EasyExcel .read(TestFileUtil.readFile(fileName), ReadAllConverterData.class, new ReadAllConverterDataListener()) - .sheet().doRead().finish(); + .sheet().doRead(); } private List data() throws Exception { diff --git a/src/test/java/com/alibaba/easyexcel/test/core/exception/ExceptionDataTest.java b/src/test/java/com/alibaba/easyexcel/test/core/exception/ExceptionDataTest.java index c8716987..0a5d0a72 100644 --- a/src/test/java/com/alibaba/easyexcel/test/core/exception/ExceptionDataTest.java +++ b/src/test/java/com/alibaba/easyexcel/test/core/exception/ExceptionDataTest.java @@ -12,7 +12,7 @@ import org.junit.Test; import org.junit.runners.MethodSorters; import com.alibaba.easyexcel.test.util.TestFileUtil; -import com.alibaba.excel.EasyExcelFactory; +import com.alibaba.excel.EasyExcel; /** * @@ -41,9 +41,9 @@ public class ExceptionDataTest { } private void readAndWrite(File file) throws Exception { - EasyExcelFactory.write(new FileOutputStream(file), ExceptionData.class).sheet().doWrite(data()).finish(); - EasyExcelFactory.read(new FileInputStream(file), ExceptionData.class, new ExceptionDataListener()).sheet() - .doRead().finish(); + EasyExcel.write(new FileOutputStream(file), ExceptionData.class).sheet().doWrite(data()); + EasyExcel.read(new FileInputStream(file), ExceptionData.class, new ExceptionDataListener()).sheet() + .doRead(); } private List data() { diff --git a/src/test/java/com/alibaba/easyexcel/test/core/head/ComplexHeadDataTest.java b/src/test/java/com/alibaba/easyexcel/test/core/head/ComplexHeadDataTest.java index d66d1705..9e654fd1 100644 --- a/src/test/java/com/alibaba/easyexcel/test/core/head/ComplexHeadDataTest.java +++ b/src/test/java/com/alibaba/easyexcel/test/core/head/ComplexHeadDataTest.java @@ -8,7 +8,7 @@ import org.junit.BeforeClass; import org.junit.Test; import com.alibaba.easyexcel.test.util.TestFileUtil; -import com.alibaba.excel.EasyExcelFactory; +import com.alibaba.excel.EasyExcel; /** * @@ -36,8 +36,8 @@ public class ComplexHeadDataTest { } private void readAndWrite(File file) { - EasyExcelFactory.write(file, ComplexHeadData.class).sheet().doWrite(data()).finish(); - EasyExcelFactory.read(file, ComplexHeadData.class, new ComplexDataListener()).sheet().doRead().finish(); + EasyExcel.write(file, ComplexHeadData.class).sheet().doWrite(data()); + EasyExcel.read(file, ComplexHeadData.class, new ComplexDataListener()).sheet().doRead(); } private List data() { diff --git a/src/test/java/com/alibaba/easyexcel/test/core/head/ListHeadDataTest.java b/src/test/java/com/alibaba/easyexcel/test/core/head/ListHeadDataTest.java index c7a1eec9..9b5330d0 100644 --- a/src/test/java/com/alibaba/easyexcel/test/core/head/ListHeadDataTest.java +++ b/src/test/java/com/alibaba/easyexcel/test/core/head/ListHeadDataTest.java @@ -9,7 +9,7 @@ import org.junit.BeforeClass; import org.junit.Test; import com.alibaba.easyexcel.test.util.TestFileUtil; -import com.alibaba.excel.EasyExcelFactory; +import com.alibaba.excel.EasyExcel; import com.alibaba.excel.util.DateUtils; /** @@ -38,8 +38,8 @@ public class ListHeadDataTest { } private void readAndWrite(File file) throws Exception { - EasyExcelFactory.write(file).head(head()).sheet().doWrite(data()).finish(); - EasyExcelFactory.read(file).registerReadListener(new ListHeadDataListener()).sheet().doRead().finish(); + EasyExcel.write(file).head(head()).sheet().doWrite(data()); + EasyExcel.read(file).registerReadListener(new ListHeadDataListener()).sheet().doRead(); } private List> head() { diff --git a/src/test/java/com/alibaba/easyexcel/test/core/head/NoHeadDataTest.java b/src/test/java/com/alibaba/easyexcel/test/core/head/NoHeadDataTest.java index ca612bb3..934750c9 100644 --- a/src/test/java/com/alibaba/easyexcel/test/core/head/NoHeadDataTest.java +++ b/src/test/java/com/alibaba/easyexcel/test/core/head/NoHeadDataTest.java @@ -8,7 +8,7 @@ import org.junit.BeforeClass; import org.junit.Test; import com.alibaba.easyexcel.test.util.TestFileUtil; -import com.alibaba.excel.EasyExcelFactory; +import com.alibaba.excel.EasyExcel; /** * @@ -36,9 +36,8 @@ public class NoHeadDataTest { } private void readAndWrite(File file) { - EasyExcelFactory.write(file, NoHeadData.class).needHead(Boolean.FALSE).sheet().doWrite(data()).finish(); - EasyExcelFactory.read(file, NoHeadData.class, new NoHeadDataListener()).headRowNumber(0).sheet().doRead() - .finish(); + EasyExcel.write(file, NoHeadData.class).needHead(Boolean.FALSE).sheet().doWrite(data()); + EasyExcel.read(file, NoHeadData.class, new NoHeadDataListener()).headRowNumber(0).sheet().doRead(); } private List data() { diff --git a/src/test/java/com/alibaba/easyexcel/test/core/large/LargeDataTest.java b/src/test/java/com/alibaba/easyexcel/test/core/large/LargeDataTest.java index fdc3bf4f..b7ba56b3 100644 --- a/src/test/java/com/alibaba/easyexcel/test/core/large/LargeDataTest.java +++ b/src/test/java/com/alibaba/easyexcel/test/core/large/LargeDataTest.java @@ -7,7 +7,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.alibaba.easyexcel.test.util.TestFileUtil; -import com.alibaba.excel.EasyExcelFactory; +import com.alibaba.excel.EasyExcel; /** * @@ -19,8 +19,8 @@ public class LargeDataTest { @Test public void read() { long start = System.currentTimeMillis(); - EasyExcelFactory.read(TestFileUtil.getPath() + "large" + File.separator + "large07.xlsx", LargeData.class, - new LargeDataListener()).headRowNumber(2).sheet().doRead().finish(); + EasyExcel.read(TestFileUtil.getPath() + "large" + File.separator + "large07.xlsx", LargeData.class, + new LargeDataListener()).headRowNumber(2).sheet().doRead(); LOGGER.info("Large data total time spent:{}", System.currentTimeMillis() - start); } } diff --git a/src/test/java/com/alibaba/easyexcel/test/core/parameter/ParameterDataTest.java b/src/test/java/com/alibaba/easyexcel/test/core/parameter/ParameterDataTest.java index 35632657..5fa0a65c 100644 --- a/src/test/java/com/alibaba/easyexcel/test/core/parameter/ParameterDataTest.java +++ b/src/test/java/com/alibaba/easyexcel/test/core/parameter/ParameterDataTest.java @@ -11,7 +11,7 @@ import org.junit.Test; import org.junit.runners.MethodSorters; import com.alibaba.easyexcel.test.util.TestFileUtil; -import com.alibaba.excel.EasyExcelFactory; +import com.alibaba.excel.EasyExcel; import com.alibaba.excel.ExcelReader; import com.alibaba.excel.ExcelWriter; import com.alibaba.excel.cache.MapCache; @@ -46,81 +46,79 @@ public class ParameterDataTest { } private void readAndWrite1() { - EasyExcelFactory.write(file.getPath()).head(ParameterData.class).sheet().doWrite(data()).finish(); - EasyExcelFactory.read(file.getPath()).head(ParameterData.class) - .registerReadListener(new ParameterDataListener()).sheet().doRead().finish(); + EasyExcel.write(file.getPath()).head(ParameterData.class).sheet().doWrite(data()); + EasyExcel.read(file.getPath()).head(ParameterData.class) + .registerReadListener(new ParameterDataListener()).sheet().doRead(); } private void readAndWrite2() { - EasyExcelFactory.write(file.getPath(), ParameterData.class).sheet().doWrite(data()).finish(); - EasyExcelFactory.read(file.getPath(), ParameterData.class, new ParameterDataListener()).sheet().doRead() - .finish(); + EasyExcel.write(file.getPath(), ParameterData.class).sheet().doWrite(data()); + EasyExcel.read(file.getPath(), ParameterData.class, new ParameterDataListener()).sheet().doRead(); } private void readAndWrite3() throws Exception { - EasyExcelFactory.write(new FileOutputStream(file)).head(ParameterData.class).sheet().doWrite(data()).finish(); - EasyExcelFactory.read(file.getPath()).head(ParameterData.class) - .registerReadListener(new ParameterDataListener()).sheet().doRead().finish(); + EasyExcel.write(new FileOutputStream(file)).head(ParameterData.class).sheet().doWrite(data()); + EasyExcel.read(file.getPath()).head(ParameterData.class) + .registerReadListener(new ParameterDataListener()).sheet().doRead(); } private void readAndWrite4() throws Exception { - EasyExcelFactory.write(new FileOutputStream(file), ParameterData.class).sheet().doWrite(data()).finish(); - EasyExcelFactory.read(file.getPath(), new ParameterDataListener()).head(ParameterData.class).sheet().doRead() - .finish(); + EasyExcel.write(new FileOutputStream(file), ParameterData.class).sheet().doWrite(data()); + EasyExcel.read(file.getPath(), new ParameterDataListener()).head(ParameterData.class).sheet().doRead(); } private void readAndWrite5() throws Exception { - ExcelWriter excelWriter = EasyExcelFactory.write(new FileOutputStream(file)).head(ParameterData.class) + ExcelWriter excelWriter = EasyExcel.write(new FileOutputStream(file)).head(ParameterData.class) .relativeHeadRowIndex(0).build(); - WriteSheet writeSheet = EasyExcelFactory.writerSheet(0).relativeHeadRowIndex(0).needHead(Boolean.FALSE).build(); - WriteTable writeTable = EasyExcelFactory.writerTable(0).relativeHeadRowIndex(0).needHead(Boolean.TRUE).build(); + WriteSheet writeSheet = EasyExcel.writerSheet(0).relativeHeadRowIndex(0).needHead(Boolean.FALSE).build(); + WriteTable writeTable = EasyExcel.writerTable(0).relativeHeadRowIndex(0).needHead(Boolean.TRUE).build(); excelWriter.write(data(), writeSheet, writeTable); excelWriter.finish(); ExcelReader excelReader = - EasyExcelFactory.read(file.getPath(), new ParameterDataListener()).head(ParameterData.class) + EasyExcel.read(file.getPath(), new ParameterDataListener()).head(ParameterData.class) .mandatoryUseInputStream(Boolean.FALSE).autoCloseStream(Boolean.TRUE).readCache(new MapCache()).build(); - ReadSheet readSheet = EasyExcelFactory.readSheet().head(ParameterData.class).use1904windowing(Boolean.FALSE) + ReadSheet readSheet = EasyExcel.readSheet().head(ParameterData.class).use1904windowing(Boolean.FALSE) .headRowNumber(1).sheetNo(0).sheetName("0").build(); excelReader.read(readSheet); excelReader.finish(); - excelReader = EasyExcelFactory.read(file.getPath(), new ParameterDataListener()).head(ParameterData.class) + excelReader = EasyExcel.read(file.getPath(), new ParameterDataListener()).head(ParameterData.class) .mandatoryUseInputStream(Boolean.FALSE).autoCloseStream(Boolean.TRUE).readCache(new MapCache()).build(); excelReader.read(); excelReader.finish(); } private void readAndWrite6() throws Exception { - ExcelWriter excelWriter = EasyExcelFactory.write(new FileOutputStream(file)).head(ParameterData.class) + ExcelWriter excelWriter = EasyExcel.write(new FileOutputStream(file)).head(ParameterData.class) .relativeHeadRowIndex(0).build(); - WriteSheet writeSheet = EasyExcelFactory.writerSheet(0).relativeHeadRowIndex(0).needHead(Boolean.FALSE).build(); - WriteTable writeTable = EasyExcelFactory.writerTable(0).registerConverter(new StringStringConverter()) + WriteSheet writeSheet = EasyExcel.writerSheet(0).relativeHeadRowIndex(0).needHead(Boolean.FALSE).build(); + WriteTable writeTable = EasyExcel.writerTable(0).registerConverter(new StringStringConverter()) .relativeHeadRowIndex(0).needHead(Boolean.TRUE).build(); excelWriter.write(data(), writeSheet, writeTable); excelWriter.finish(); ExcelReader excelReader = - EasyExcelFactory.read(file.getPath(), new ParameterDataListener()).head(ParameterData.class) + EasyExcel.read(file.getPath(), new ParameterDataListener()).head(ParameterData.class) .mandatoryUseInputStream(Boolean.FALSE).autoCloseStream(Boolean.TRUE).readCache(new MapCache()).build(); - ReadSheet readSheet = EasyExcelFactory.readSheet("0").head(ParameterData.class).use1904windowing(Boolean.FALSE) + ReadSheet readSheet = EasyExcel.readSheet("0").head(ParameterData.class).use1904windowing(Boolean.FALSE) .headRowNumber(1).sheetNo(0).build(); excelReader.read(readSheet); excelReader.finish(); - excelReader = EasyExcelFactory.read(file.getPath(), new ParameterDataListener()).head(ParameterData.class) + excelReader = EasyExcel.read(file.getPath(), new ParameterDataListener()).head(ParameterData.class) .mandatoryUseInputStream(Boolean.FALSE).autoCloseStream(Boolean.TRUE).readCache(new MapCache()).build(); excelReader.read(); excelReader.finish(); } - private void readAndWrite7() throws Exception { - EasyExcelFactory.write(file, ParameterData.class).registerConverter(new StringStringConverter()).sheet() + private void readAndWrite7() { + EasyExcel.write(file, ParameterData.class).registerConverter(new StringStringConverter()).sheet() .registerConverter(new StringStringConverter()).needHead(Boolean.FALSE).table(0).needHead(Boolean.TRUE) - .doWrite(data()).finish(); - EasyExcelFactory.read(file.getPath()).head(ParameterData.class) + .doWrite(data()); + EasyExcel.read(file.getPath()).head(ParameterData.class) .registerReadListener(new ParameterDataListener()).sheet().registerConverter(new StringStringConverter()) - .doRead().finish(); + .doRead(); } private List data() { diff --git a/src/test/java/com/alibaba/easyexcel/test/core/repetition/RepetitionDataTest.java b/src/test/java/com/alibaba/easyexcel/test/core/repetition/RepetitionDataTest.java index 5e59a835..ecb8df01 100644 --- a/src/test/java/com/alibaba/easyexcel/test/core/repetition/RepetitionDataTest.java +++ b/src/test/java/com/alibaba/easyexcel/test/core/repetition/RepetitionDataTest.java @@ -10,7 +10,7 @@ import org.junit.Test; import org.junit.runners.MethodSorters; import com.alibaba.easyexcel.test.util.TestFileUtil; -import com.alibaba.excel.EasyExcelFactory; +import com.alibaba.excel.EasyExcel; import com.alibaba.excel.ExcelReader; import com.alibaba.excel.ExcelWriter; import com.alibaba.excel.read.metadata.ReadSheet; @@ -48,12 +48,12 @@ public class RepetitionDataTest { } private void readAndWrite(File file) { - ExcelWriter excelWriter = EasyExcelFactory.write(file, RepetitionData.class).build(); - WriteSheet writeSheet = EasyExcelFactory.writerSheet(0).build(); + ExcelWriter excelWriter = EasyExcel.write(file, RepetitionData.class).build(); + WriteSheet writeSheet = EasyExcel.writerSheet(0).build(); excelWriter.write(data(), writeSheet).write(data(), writeSheet).finish(); ExcelReader excelReader = - EasyExcelFactory.read(file, RepetitionData.class, new RepetitionDataListener()).build(); - ReadSheet readSheet = EasyExcelFactory.readSheet(0).build(); + EasyExcel.read(file, RepetitionData.class, new RepetitionDataListener()).build(); + ReadSheet readSheet = EasyExcel.readSheet(0).build(); excelReader.read(readSheet).finish(); } @@ -68,13 +68,13 @@ public class RepetitionDataTest { } private void readAndWriteTable(File file) { - ExcelWriter excelWriter = EasyExcelFactory.write(file, RepetitionData.class).build(); - WriteSheet writeSheet = EasyExcelFactory.writerSheet(0).build(); - WriteTable writeTable = EasyExcelFactory.writerTable(0).relativeHeadRowIndex(0).build(); + ExcelWriter excelWriter = EasyExcel.write(file, RepetitionData.class).build(); + WriteSheet writeSheet = EasyExcel.writerSheet(0).build(); + WriteTable writeTable = EasyExcel.writerTable(0).relativeHeadRowIndex(0).build(); excelWriter.write(data(), writeSheet, writeTable).write(data(), writeSheet, writeTable).finish(); ExcelReader excelReader = - EasyExcelFactory.read(file, RepetitionData.class, new RepetitionDataListener()).build(); - ReadSheet readSheet = EasyExcelFactory.readSheet(0).headRowNumber(2).build(); + EasyExcel.read(file, RepetitionData.class, new RepetitionDataListener()).build(); + ReadSheet readSheet = EasyExcel.readSheet(0).headRowNumber(2).build(); excelReader.read(readSheet).finish(); } diff --git a/src/test/java/com/alibaba/easyexcel/test/core/simple/SimpleDataTest.java b/src/test/java/com/alibaba/easyexcel/test/core/simple/SimpleDataTest.java index 9e830f48..fee56e5a 100644 --- a/src/test/java/com/alibaba/easyexcel/test/core/simple/SimpleDataTest.java +++ b/src/test/java/com/alibaba/easyexcel/test/core/simple/SimpleDataTest.java @@ -11,7 +11,7 @@ import org.junit.Test; import org.junit.runners.MethodSorters; import com.alibaba.easyexcel.test.util.TestFileUtil; -import com.alibaba.excel.EasyExcelFactory; +import com.alibaba.excel.EasyExcel; /** * @@ -40,8 +40,8 @@ public class SimpleDataTest { } private void readAndWrite(File file) { - EasyExcelFactory.write(file, SimpleData.class).sheet().doWrite(data()).finish(); - EasyExcelFactory.read(file, SimpleData.class, new SimpleDataListener()).sheet().doRead().finish(); + EasyExcel.write(file, SimpleData.class).sheet().doWrite(data()); + EasyExcel.read(file, SimpleData.class, new SimpleDataListener()).sheet().doRead(); } @Test @@ -56,13 +56,13 @@ public class SimpleDataTest { @Test public void T05SheetNameRead07() { - EasyExcelFactory.read(TestFileUtil.readFile("simple" + File.separator + "simple07.xlsx"), SimpleData.class, - new SimpleDataSheetNameListener()).sheet("simple").doRead().finish(); + EasyExcel.read(TestFileUtil.readFile("simple" + File.separator + "simple07.xlsx"), SimpleData.class, + new SimpleDataSheetNameListener()).sheet("simple").doRead(); } private void synchronousRead(File file) { // Synchronous read file - List list = EasyExcelFactory.read(file).head(SimpleData.class).sheet().doReadSync(); + List list = EasyExcel.read(file).head(SimpleData.class).sheet().doReadSync(); Assert.assertEquals(list.size(), 10); Assert.assertTrue(list.get(0) instanceof SimpleData); Assert.assertEquals(((SimpleData)list.get(0)).getName(), "姓名0"); diff --git a/src/test/java/com/alibaba/easyexcel/test/core/style/StyleDataTest.java b/src/test/java/com/alibaba/easyexcel/test/core/style/StyleDataTest.java index 047db630..d52aee77 100644 --- a/src/test/java/com/alibaba/easyexcel/test/core/style/StyleDataTest.java +++ b/src/test/java/com/alibaba/easyexcel/test/core/style/StyleDataTest.java @@ -16,7 +16,7 @@ import org.junit.Test; import org.junit.runners.MethodSorters; import com.alibaba.easyexcel.test.util.TestFileUtil; -import com.alibaba.excel.EasyExcelFactory; +import com.alibaba.excel.EasyExcel; import com.alibaba.excel.metadata.Head; import com.alibaba.excel.write.merge.LoopMergeStrategy; import com.alibaba.excel.write.merge.OnceAbsoluteMergeStrategy; @@ -107,14 +107,14 @@ public class StyleDataTest { return writeCellStyle; } }; - EasyExcelFactory.write(file07, StyleData.class).registerWriteHandler(verticalCellStyleStrategy).sheet() - .doWrite(data()).finish(); + EasyExcel.write(file07, StyleData.class).registerWriteHandler(verticalCellStyleStrategy).sheet() + .doWrite(data()); } @Test public void T04LoopMergeStrategy() { - EasyExcelFactory.write(file07, StyleData.class).sheet().registerWriteHandler(new LoopMergeStrategy(2, 1)) - .doWrite(data10()).finish(); + EasyExcel.write(file07, StyleData.class).sheet().registerWriteHandler(new LoopMergeStrategy(2, 1)) + .doWrite(data10()); } private void readAndWrite(File file) { @@ -137,10 +137,10 @@ public class StyleDataTest { new HorizontalCellStyleStrategy(headWriteCellStyle, contentWriteCellStyle); OnceAbsoluteMergeStrategy onceAbsoluteMergeStrategy = new OnceAbsoluteMergeStrategy(2, 2, 0, 1); - EasyExcelFactory.write(file, StyleData.class).registerWriteHandler(simpleColumnWidthStyleStrategy) + EasyExcel.write(file, StyleData.class).registerWriteHandler(simpleColumnWidthStyleStrategy) .registerWriteHandler(simpleRowHeightStyleStrategy).registerWriteHandler(horizontalCellStyleStrategy) - .registerWriteHandler(onceAbsoluteMergeStrategy).sheet().doWrite(data()).finish(); - EasyExcelFactory.read(file, StyleData.class, new StyleDataListener()).sheet().doRead().finish(); + .registerWriteHandler(onceAbsoluteMergeStrategy).sheet().doWrite(data()); + EasyExcel.read(file, StyleData.class, new StyleDataListener()).sheet().doRead(); } private List data() { diff --git a/src/test/java/com/alibaba/easyexcel/test/core/template/TemplateDataTest.java b/src/test/java/com/alibaba/easyexcel/test/core/template/TemplateDataTest.java index 3d4b1cc4..07f2c15b 100644 --- a/src/test/java/com/alibaba/easyexcel/test/core/template/TemplateDataTest.java +++ b/src/test/java/com/alibaba/easyexcel/test/core/template/TemplateDataTest.java @@ -10,7 +10,7 @@ import org.junit.Test; import org.junit.runners.MethodSorters; import com.alibaba.easyexcel.test.util.TestFileUtil; -import com.alibaba.excel.EasyExcelFactory; +import com.alibaba.excel.EasyExcel; /** * @@ -39,19 +39,17 @@ public class TemplateDataTest { } private void readAndWrite07(File file) { - EasyExcelFactory.write(file, TemplateData.class) + EasyExcel.write(file, TemplateData.class) .withTemplate(TestFileUtil.readFile("template" + File.separator + "template07.xlsx")).sheet() - .doWrite(data()).finish(); - EasyExcelFactory.read(file, TemplateData.class, new TemplateDataListener()).headRowNumber(2).sheet().doRead() - .finish(); + .doWrite(data()); + EasyExcel.read(file, TemplateData.class, new TemplateDataListener()).headRowNumber(2).sheet().doRead(); } private void readAndWrite03(File file) { - EasyExcelFactory.write(file, TemplateData.class) - .withTemplate(TestFileUtil.readFile("template" + File.separator + "template03.xls")).sheet().doWrite(data()) - .finish(); - EasyExcelFactory.read(file, TemplateData.class, new TemplateDataListener()).headRowNumber(2).sheet().doRead() - .finish(); + EasyExcel.write(file, TemplateData.class) + .withTemplate(TestFileUtil.readFile("template" + File.separator + "template03.xls")).sheet() + .doWrite(data()); + EasyExcel.read(file, TemplateData.class, new TemplateDataListener()).headRowNumber(2).sheet().doRead(); } private List data() { diff --git a/src/test/java/com/alibaba/easyexcel/test/demo/read/ConverterData.java b/src/test/java/com/alibaba/easyexcel/test/demo/read/ConverterData.java new file mode 100644 index 00000000..bc27e1f8 --- /dev/null +++ b/src/test/java/com/alibaba/easyexcel/test/demo/read/ConverterData.java @@ -0,0 +1,31 @@ +package com.alibaba.easyexcel.test.demo.read; + +import com.alibaba.excel.annotation.ExcelProperty; +import com.alibaba.excel.annotation.format.DateTimeFormat; +import com.alibaba.excel.annotation.format.NumberFormat; + +import lombok.Data; + +/** + * 基础数据类.这里的排序和excel里面的排序一致 + * + * @author Jiaju Zhuang + **/ +@Data +public class ConverterData { + /** + * 我自定义 转换器,不管数据库传过来什么 。我给他加上“自定义:” + */ + @ExcelProperty(converter = CustomStringStringConverter.class) + private String string; + /** + * 这里用string 去接日期才能格式化。我想接收年月日格式 + */ + @DateTimeFormat("yyyy年MM月dd日HH时mm分ss秒") + private String date; + /** + * 我想接收百分比的数字 + */ + @NumberFormat("#.##%") + private String doubleData; +} diff --git a/src/test/java/com/alibaba/easyexcel/test/demo/read/ConverterDataListener.java b/src/test/java/com/alibaba/easyexcel/test/demo/read/ConverterDataListener.java new file mode 100644 index 00000000..d343964d --- /dev/null +++ b/src/test/java/com/alibaba/easyexcel/test/demo/read/ConverterDataListener.java @@ -0,0 +1,49 @@ +package com.alibaba.easyexcel.test.demo.read; + +import java.util.ArrayList; +import java.util.List; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.alibaba.excel.context.AnalysisContext; +import com.alibaba.excel.event.AnalysisEventListener; +import com.alibaba.fastjson.JSON; + +/** + * 模板的读取类 + * + * @author Jiaju Zhuang + */ +public class ConverterDataListener extends AnalysisEventListener { + private static final Logger LOGGER = LoggerFactory.getLogger(ConverterDataListener.class); + /** + * 每隔5条存储数据库,实际使用中可以3000条,然后清理list ,方便内存回收 + */ + private static final int BATCH_COUNT = 5; + List list = new ArrayList(); + + @Override + public void invoke(ConverterData data, AnalysisContext context) { + LOGGER.info("解析到一条数据:{}", JSON.toJSONString(data)); + list.add(data); + if (list.size() >= BATCH_COUNT) { + saveData(); + list.clear(); + } + } + + @Override + public void doAfterAllAnalysed(AnalysisContext context) { + saveData(); + LOGGER.info("所有数据解析完成!"); + } + + /** + * 加上存储数据库 + */ + private void saveData() { + LOGGER.info("{}条数据,开始存储数据库!", list.size()); + LOGGER.info("存储数据库成功!"); + } +} diff --git a/src/test/java/com/alibaba/easyexcel/test/demo/read/CustomStringStringConverter.java b/src/test/java/com/alibaba/easyexcel/test/demo/read/CustomStringStringConverter.java new file mode 100644 index 00000000..5201e750 --- /dev/null +++ b/src/test/java/com/alibaba/easyexcel/test/demo/read/CustomStringStringConverter.java @@ -0,0 +1,59 @@ +package com.alibaba.easyexcel.test.demo.read; + +import com.alibaba.excel.converters.Converter; +import com.alibaba.excel.enums.CellDataTypeEnum; +import com.alibaba.excel.metadata.CellData; +import com.alibaba.excel.metadata.GlobalConfiguration; +import com.alibaba.excel.metadata.property.ExcelContentProperty; + +/** + * String and string converter + * + * @author Jiaju Zhuang + */ +public class CustomStringStringConverter implements Converter { + @Override + public Class supportJavaTypeKey() { + return String.class; + } + + @Override + public CellDataTypeEnum supportExcelTypeKey() { + return CellDataTypeEnum.STRING; + } + + /** + * 这里读的时候会调用 + * + * @param cellData + * NotNull + * @param contentProperty + * Nullable + * @param globalConfiguration + * NotNull + * @return + */ + @Override + public String convertToJavaData(CellData cellData, ExcelContentProperty contentProperty, + GlobalConfiguration globalConfiguration) { + return "自定义:" + cellData.getStringValue(); + } + + /** + * 这里是写的时候会调用 不用管 + * + * @param value + * NotNull + * @param contentProperty + * Nullable + * @param globalConfiguration + * NotNull + * @return + */ + @Override + public CellData convertToExcelData(String value, ExcelContentProperty contentProperty, + GlobalConfiguration globalConfiguration) { + return new CellData(value); + } + +} diff --git a/src/test/java/com/alibaba/easyexcel/test/demo/read/ReadTest.java b/src/test/java/com/alibaba/easyexcel/test/demo/read/ReadTest.java index e76244e3..8a671eb7 100644 --- a/src/test/java/com/alibaba/easyexcel/test/demo/read/ReadTest.java +++ b/src/test/java/com/alibaba/easyexcel/test/demo/read/ReadTest.java @@ -1,14 +1,21 @@ package com.alibaba.easyexcel.test.demo.read; import java.io.File; +import java.util.List; +import java.util.Map; import org.junit.Ignore; import org.junit.Test; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import com.alibaba.easyexcel.test.util.TestFileUtil; import com.alibaba.excel.EasyExcelFactory; import com.alibaba.excel.ExcelReader; +import com.alibaba.excel.annotation.ExcelProperty; +import com.alibaba.excel.converters.DefaultConverterLoader; import com.alibaba.excel.read.metadata.ReadSheet; +import com.alibaba.fastjson.JSON; /** * 读的常见写法 @@ -17,6 +24,8 @@ import com.alibaba.excel.read.metadata.ReadSheet; */ @Ignore public class ReadTest { + private static final Logger LOGGER = LoggerFactory.getLogger(ReadTest.class); + /** * 最简单的读 *
  • 1. 创建excel对应的实体对象 参照{@link DemoData} @@ -27,14 +36,15 @@ public class ReadTest { public void simpleRead() { // 写法1: String fileName = TestFileUtil.getPath() + "demo" + File.separator + "demo.xlsx"; - // 这里 需要指定读用哪个class去读,然后读取第一个sheet 然后千万别忘记 finish - EasyExcelFactory.read(fileName, DemoData.class, new DemoDataListener()).sheet().doRead().finish(); + // 这里 需要指定读用哪个class去读,然后读取第一个sheet 文件流会自动关闭 + EasyExcelFactory.read(fileName, DemoData.class, new DemoDataListener()).sheet().doRead(); // 写法2: fileName = TestFileUtil.getPath() + "demo" + File.separator + "demo.xlsx"; ExcelReader excelReader = EasyExcelFactory.read(fileName, DemoData.class, new DemoDataListener()).build(); ReadSheet readSheet = EasyExcelFactory.readSheet(0).build(); excelReader.read(readSheet); + // 这里千万别忘记关闭,读的时候会创建临时文件,到时磁盘会崩的 excelReader.finish(); } @@ -45,7 +55,86 @@ public class ReadTest { @Test public void indexOrNameRead() { String fileName = TestFileUtil.getPath() + "demo" + File.separator + "demo.xlsx"; - // 这里默认读取第一个sheet 然后千万别忘记 finish - EasyExcelFactory.read(fileName, IndexOrNameData.class, new IndexOrNameDataListener()).sheet().doRead().finish(); + // 这里默认读取第一个sheet + EasyExcelFactory.read(fileName, IndexOrNameData.class, new IndexOrNameDataListener()).sheet().doRead(); + } + + /** + * 读多个sheet,这里注意一个sheet不能读取多次,一定要多次需要重新读取文件 + *
  • 1. 创建excel对应的实体对象 参照{@link DemoData} + *
  • 2. 由于默认异步读取excel,所以需要创建excel一行一行的回调监听器,参照{@link DemoDataListener} + *
  • 3. 直接读即可 + */ + @Test + public void repeatedRead() { + String fileName = TestFileUtil.getPath() + "demo" + File.separator + "demo.xlsx"; + ExcelReader excelReader = EasyExcelFactory.read(fileName, DemoData.class, new DemoDataListener()).build(); + ReadSheet readSheet1 = EasyExcelFactory.readSheet(0).build(); + ReadSheet readSheet2 = EasyExcelFactory.readSheet(1).build(); + excelReader.read(readSheet1); + excelReader.read(readSheet2); + // 这里千万别忘记关闭,读的时候会创建临时文件,到时磁盘会崩的 + excelReader.finish(); } + + /** + * 日期、数字或者自定义格式转换。 + *

    + * 默认读的转换器{@link DefaultConverterLoader#loadDefaultReadConverter()} + *

  • 1. 创建excel对应的实体对象 参照{@link ConverterData}.里面可以使用注解. + *
  • 2. 由于默认异步读取excel,所以需要创建excel一行一行的回调监听器,参照{@link ConverterDataListener} + *
  • 3. 直接读即可 + */ + @Test + public void converterRead() { + String fileName = TestFileUtil.getPath() + "demo" + File.separator + "demo.xlsx"; + // 这里 需要指定读用哪个class去读,然后读取第一个sheet 然后千万别忘记 finish + EasyExcelFactory.read(fileName, ConverterData.class, new ConverterDataListener()) + // 这里注意 我们也可以registerConverter来指定自定义转换器, 但是这个转换变成全局了, 所有java为string,excel为string的都会用这个转换器。 + // 如果就想单个字段使用请使用@ExcelProperty 指定converter + // .registerConverter(new CustomStringStringConverter()) + // 读取sheet + .sheet().doRead(); + } + + /** + * 多行头. + * + *
  • 1. 创建excel对应的实体对象 参照{@link DemoData} + *
  • 2. 由于默认异步读取excel,所以需要创建excel一行一行的回调监听器,参照{@link DemoDataListener} + *
  • 3. 设置headRowNumber参数,然后读。 这里要注意headRowNumber如果不指定, 会根据你传入的class的{@link ExcelProperty#value()}里面的表头的数量来决定行数, + * 如果不传入class则默认为1.当然你指定了headRowNumber不管是否传入class都是以你传入的为准。 + */ + @Test + public void complexHeaderRead() { + String fileName = TestFileUtil.getPath() + "demo" + File.separator + "demo.xlsx"; + // 这里 需要指定读用哪个class去读,然后读取第一个sheet 然后千万别忘记 finish + EasyExcelFactory.read(fileName, DemoData.class, new DemoDataListener()).sheet() + // 这里可以设置1,因为头就是一行。如果多行头,可以设置其他值。不传入也可以,因为默认会根据DemoData 来解析,他没有指定头,也就是默认1行 + .headRowNumber(1).doRead(); + } + + /** + * 同步的返回,不推荐使用,如果数据量大会把数据放到内存里面 + */ + @Test + public void synchronousRead() { + String fileName = TestFileUtil.getPath() + "demo" + File.separator + "demo.xlsx"; + // 这里 需要指定读用哪个class去读,然后读取第一个sheet 同步读取会自动finish + List list = EasyExcelFactory.read(fileName).head(DemoData.class).sheet().doReadSync(); + for (Object obj : list) { + DemoData data = (DemoData)obj; + LOGGER.info("读取到数据:{}", JSON.toJSONString(data)); + } + + // 这里 也可以不指定class,返回一个list,然后读取第一个sheet 同步读取会自动finish + list = EasyExcelFactory.read(fileName).sheet().doReadSync(); + for (Object obj : list) { + // 返回每条数据的键值对 表示所在的列 和所在列的值 + Map data = (Map)obj; + LOGGER.info("读取到数据:{}", JSON.toJSONString(data)); + } + + } + } diff --git a/src/test/java/com/alibaba/easyexcel/test/demo/web/WebTest.java b/src/test/java/com/alibaba/easyexcel/test/demo/web/WebTest.java index 499e8332..c70414e9 100644 --- a/src/test/java/com/alibaba/easyexcel/test/demo/web/WebTest.java +++ b/src/test/java/com/alibaba/easyexcel/test/demo/web/WebTest.java @@ -33,7 +33,7 @@ public class WebTest { response.setContentType("application/vnd.ms-excel"); response.setCharacterEncoding("utf-8"); response.setHeader("Content-disposition", "attachment;filename=demo.xlsx"); - EasyExcelFactory.write(response.getOutputStream(), DownloadData.class).sheet("模板").doWrite(data()).finish(); + EasyExcelFactory.write(response.getOutputStream(), DownloadData.class).sheet("模板").doWrite(data()); } /** @@ -45,8 +45,7 @@ public class WebTest { @PostMapping("upload") @ResponseBody public String upload(MultipartFile file) throws IOException { - EasyExcelFactory.read(file.getInputStream(), UploadData.class, new UploadDataListener()).sheet().doRead() - .finish(); + EasyExcelFactory.read(file.getInputStream(), UploadData.class, new UploadDataListener()).sheet().doRead(); return "success"; } diff --git a/src/test/java/com/alibaba/easyexcel/test/demo/write/WriteTest.java b/src/test/java/com/alibaba/easyexcel/test/demo/write/WriteTest.java index 38fa8fde..24b49c77 100644 --- a/src/test/java/com/alibaba/easyexcel/test/demo/write/WriteTest.java +++ b/src/test/java/com/alibaba/easyexcel/test/demo/write/WriteTest.java @@ -9,6 +9,8 @@ import org.junit.Test; import com.alibaba.easyexcel.test.util.TestFileUtil; import com.alibaba.excel.EasyExcelFactory; +import com.alibaba.excel.ExcelWriter; +import com.alibaba.excel.write.metadata.WriteSheet; /** * 写的常见写法 @@ -24,12 +26,23 @@ public class WriteTest { */ @Test public void simpleWrite() { + // 写法1 String fileName = TestFileUtil.getPath() + "write" + System.currentTimeMillis() + ".xlsx"; - // 这里 需要指定写用哪个class去读,然后写到第一个sheet,名字为模板 然后千万别忘记 finish + // 这里 需要指定写用哪个class去读,然后写到第一个sheet,名字为模板 然后文件流会自动关闭 // 如果这里想使用03 则 传入excelType参数即可 - EasyExcelFactory.write(fileName, DemoData.class).sheet("模板").doWrite(data()).finish(); + EasyExcelFactory.write(fileName, DemoData.class).sheet("模板").doWrite(data()); + + // 写法2 + fileName = TestFileUtil.getPath() + "write" + System.currentTimeMillis() + ".xlsx"; + // 这里 需要指定写用哪个class去读 + ExcelWriter excelWriter = EasyExcelFactory.write(fileName, DemoData.class).build(); + WriteSheet writeSheet = EasyExcelFactory.writerSheet("模板").build(); + excelWriter.write(data(), writeSheet); + /// 千万别忘记finish 会帮忙关闭流 + excelWriter.finish(); } + private List data() { List list = new ArrayList(); for (int i = 0; i < 10; i++) { diff --git a/src/test/resources/demo/demo.xlsx b/src/test/resources/demo/demo.xlsx index 1fa2eda47af528c1f5c2e61c478d31160efe1dee..722ead1c4c74b01efbc1220ce842150d21fedfee 100644 GIT binary patch delta 6701 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 delta 5747 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 Q8Ip&Jg$@8DGyd)U7v##L&j0`b