From 5421722c242d7270a3499cd412240624cbc64681 Mon Sep 17 00:00:00 2001 From: zhuangjiaju Date: Mon, 5 Aug 2019 18:28:06 +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 --- .../com/alibaba/excel/EasyExcelFactory.java | 80 +------- .../java/com/alibaba/excel/ExcelReader.java | 9 +- .../java/com/alibaba/excel/ExcelWriter.java | 7 +- .../excel/analysis/ExcelAnalyserImpl.java | 17 +- .../excel/analysis/v07/XlsxSaxAnalyser.java | 2 + .../v07/handlers/DefaultCellHandler.java | 14 +- .../java/com/alibaba/excel/cache/Ehcache.java | 4 +- .../excel/context/WriteContextImpl.java | 4 +- .../exception/ExcelAnalysisStopException.java | 23 +++ .../alibaba/excel/metadata/BaseRowModel.java | 3 + .../excel/parameter/ExcelWriteParam.java | 44 ---- .../read/builder/ExcelReaderBuilder.java | 37 +--- .../listener/ModelBuildEventListener.java | 40 +++- .../excel/read/listener/ReadListener.java | 6 +- .../excel/read/metadata/ReadWorkbook.java | 16 +- .../metadata/holder/AbstractReadHolder.java | 4 + .../metadata/holder/ReadWorkbookHolder.java | 28 ++- .../alibaba/excel/support/ExcelTypeEnum.java | 1 - .../alibaba/excel/write/ExcelBuilderImpl.java | 46 ++++- .../write/builder/ExcelWriterBuilder.java | 9 - .../builder/ExcelWriterTableBuilder.java | 10 +- .../excel/write/merge/LoopMergeStrategy.java | 6 +- .../metadata/holder/AbstractWriteHolder.java | 7 +- .../metadata/holder/WriteWorkbookHolder.java | 9 +- .../style/AbstractCellStyleStrategy.java | 26 ++- .../com/alibaba/easyexcel/test/ReadTest.java | 189 ----------------- .../com/alibaba/easyexcel/test/WriteTest.java | 194 ------------------ .../core/annotation/AnnotationDataTest.java | 5 +- ...er.java => CompatibilityDataListener.java} | 22 +- .../compatibility/CompatibilityDataTest.java | 39 +++- .../CompatibilityParameterDataTest.java | 143 +++++++++++++ .../compatibility/CompatibilityReadData.java | 14 ++ .../test/core/exception/ExceptionData.java | 14 ++ .../core/exception/ExceptionDataListener.java | 48 +++++ .../core/exception/ExceptionDataTest.java | 58 ++++++ .../test/core/parameter/ParameterData.java | 14 ++ .../core/parameter/ParameterDataListener.java | 35 ++++ .../core/parameter/ParameterDataTest.java | 135 ++++++++++++ .../core/repetition/RepetitionDataTest.java | 2 +- .../test/core/style/StyleDataTest.java | 87 +++++++- .../listen/AfterExcelWriteHandlerImpl.java | 59 ------ .../easyexcel/test/listen/ExcelListener.java | 33 --- .../easyexcel/test/model/BaseReadModel.java | 28 --- .../easyexcel/test/model/BaseWriteModel.java | 28 --- .../easyexcel/test/model/ReadModel.java | 114 ---------- .../easyexcel/test/model/ReadModel2.java | 136 ------------ .../easyexcel/test/model/WriteModel.java | 131 ------------ .../alibaba/easyexcel/test/util/DataUtil.java | 93 --------- src/test/resources/2003.xls | Bin 105984 -> 0 bytes src/test/resources/2007.xlsx | Bin 159492 -> 0 bytes src/test/resources/temp.xlsx | Bin 11303 -> 0 bytes 51 files changed, 817 insertions(+), 1256 deletions(-) create mode 100644 src/main/java/com/alibaba/excel/exception/ExcelAnalysisStopException.java delete mode 100644 src/main/java/com/alibaba/excel/parameter/ExcelWriteParam.java delete mode 100644 src/test/java/com/alibaba/easyexcel/test/ReadTest.java delete mode 100644 src/test/java/com/alibaba/easyexcel/test/WriteTest.java rename src/test/java/com/alibaba/easyexcel/test/core/compatibility/{AnnotationDataListener.java => CompatibilityDataListener.java} (50%) create mode 100644 src/test/java/com/alibaba/easyexcel/test/core/compatibility/CompatibilityParameterDataTest.java create mode 100644 src/test/java/com/alibaba/easyexcel/test/core/compatibility/CompatibilityReadData.java create mode 100644 src/test/java/com/alibaba/easyexcel/test/core/exception/ExceptionData.java create mode 100644 src/test/java/com/alibaba/easyexcel/test/core/exception/ExceptionDataListener.java create mode 100644 src/test/java/com/alibaba/easyexcel/test/core/exception/ExceptionDataTest.java create mode 100644 src/test/java/com/alibaba/easyexcel/test/core/parameter/ParameterData.java create mode 100644 src/test/java/com/alibaba/easyexcel/test/core/parameter/ParameterDataListener.java create mode 100644 src/test/java/com/alibaba/easyexcel/test/core/parameter/ParameterDataTest.java delete mode 100644 src/test/java/com/alibaba/easyexcel/test/listen/AfterExcelWriteHandlerImpl.java delete mode 100644 src/test/java/com/alibaba/easyexcel/test/listen/ExcelListener.java delete mode 100644 src/test/java/com/alibaba/easyexcel/test/model/BaseReadModel.java delete mode 100644 src/test/java/com/alibaba/easyexcel/test/model/BaseWriteModel.java delete mode 100644 src/test/java/com/alibaba/easyexcel/test/model/ReadModel.java delete mode 100644 src/test/java/com/alibaba/easyexcel/test/model/ReadModel2.java delete mode 100644 src/test/java/com/alibaba/easyexcel/test/model/WriteModel.java delete mode 100644 src/test/java/com/alibaba/easyexcel/test/util/DataUtil.java delete mode 100644 src/test/resources/2003.xls delete mode 100644 src/test/resources/2007.xlsx delete mode 100644 src/test/resources/temp.xlsx diff --git a/src/main/java/com/alibaba/excel/EasyExcelFactory.java b/src/main/java/com/alibaba/excel/EasyExcelFactory.java index 4d73219..3fb8135 100644 --- a/src/main/java/com/alibaba/excel/EasyExcelFactory.java +++ b/src/main/java/com/alibaba/excel/EasyExcelFactory.java @@ -3,11 +3,8 @@ package com.alibaba.excel; import java.io.File; import java.io.InputStream; import java.io.OutputStream; -import java.net.URI; import java.util.ArrayList; import java.util.List; -import java.util.Map; -import java.util.TreeMap; import com.alibaba.excel.context.AnalysisContext; import com.alibaba.excel.event.AnalysisEventListener; @@ -64,15 +61,7 @@ public class EasyExcelFactory { @Override public void doAfterAllAnalysed(AnalysisContext context) {} }, false).read(sheet); - if (rows.size() == 0 || !(rows.get(0) instanceof Map)) { - return rows; - } - List listRow = new ArrayList(); - for (Object obj : rows) { - Map oneRow = (Map)obj; - listRow.add(new ArrayList(new TreeMap(oneRow).values())); - } - return listRow; + return rows; } /** @@ -267,32 +256,6 @@ public class EasyExcelFactory { return excelWriterBuilder; } - /** - * Build excel the write - * - * @param uri - * @return - */ - public static ExcelWriterBuilder write(URI uri) { - return write(uri, null); - } - - /** - * Build excel the write - * - * @param uri - * @param head - * @return - */ - public static ExcelWriterBuilder write(URI uri, Class head) { - ExcelWriterBuilder excelWriterBuilder = new ExcelWriterBuilder(); - excelWriterBuilder.file(uri); - if (head != null) { - excelWriterBuilder.head(head); - } - return excelWriterBuilder; - } - /** * Build excel the 'writerSheet' * @@ -495,47 +458,6 @@ public class EasyExcelFactory { return excelReaderBuilder; } - /** - * Build excel the read - * - * @param uri - * @return - */ - public static ExcelReaderBuilder read(URI uri) { - return read(uri, null, null); - } - - /** - * Build excel the read - * - * @param uri - * @param readListener - * @return - */ - public static ExcelReaderBuilder read(URI uri, ReadListener readListener) { - return read(uri, null, readListener); - } - - /** - * Build excel the read - * - * @param uri - * @param head - * @param readListener - * @return - */ - public static ExcelReaderBuilder read(URI uri, Class head, ReadListener readListener) { - ExcelReaderBuilder excelReaderBuilder = new ExcelReaderBuilder(); - excelReaderBuilder.file(uri); - if (head != null) { - excelReaderBuilder.head(head); - } - if (readListener != null) { - excelReaderBuilder.registerReadListener(readListener); - } - return excelReaderBuilder; - } - /** * Build excel the 'readSheet' * diff --git a/src/main/java/com/alibaba/excel/ExcelReader.java b/src/main/java/com/alibaba/excel/ExcelReader.java index d512683..07378d2 100644 --- a/src/main/java/com/alibaba/excel/ExcelReader.java +++ b/src/main/java/com/alibaba/excel/ExcelReader.java @@ -137,6 +137,7 @@ public class ExcelReader { readWorkbook.setMandatoryUseInputStream(Boolean.TRUE); readWorkbook.setReadCache(new MapCache()); readWorkbook.setConvertAllFiled(Boolean.FALSE); + readWorkbook.setDefaultReturnMap(Boolean.FALSE); excelAnalyser = new ExcelAnalyserImpl(readWorkbook); } @@ -211,7 +212,7 @@ public class ExcelReader { /** * Context for the entire execution process - * + * * @return */ public AnalysisContext analysisContext() { @@ -221,7 +222,7 @@ public class ExcelReader { /** * Current executor - * + * * @return */ public ExcelExecutor excelExecutor() { @@ -252,7 +253,7 @@ public class ExcelReader { } /** - * + * * @return * @deprecated please use {@link #analysisContext()} */ @@ -274,7 +275,7 @@ public class ExcelReader { /** * Prevents calls to {@link #finish} from freeing the cache - * + * * @throws Throwable */ @Override diff --git a/src/main/java/com/alibaba/excel/ExcelWriter.java b/src/main/java/com/alibaba/excel/ExcelWriter.java index 54fd2a3..c99787d 100644 --- a/src/main/java/com/alibaba/excel/ExcelWriter.java +++ b/src/main/java/com/alibaba/excel/ExcelWriter.java @@ -5,7 +5,6 @@ import java.io.OutputStream; import java.util.ArrayList; import java.util.List; -import com.alibaba.excel.exception.ExcelGenerateException; import com.alibaba.excel.metadata.Sheet; import com.alibaba.excel.metadata.Table; import com.alibaba.excel.parameter.GenerateParam; @@ -187,17 +186,13 @@ public class ExcelWriter { public ExcelWriter write(List data, Sheet sheet, Table table) { WriteSheet writeSheet = null; if (sheet != null) { - if (sheet.getStartRow() != 0) { - throw new ExcelGenerateException( - "Specifying a line to start is no longer supported.Please 'WriteSheet.relativeHeadRowIndex' him instead."); - } writeSheet = new WriteSheet(); writeSheet.setSheetNo(sheet.getSheetNo() - 1); writeSheet.setSheetName(sheet.getSheetName()); writeSheet.setClazz(sheet.getClazz()); writeSheet.setHead(sheet.getHead()); writeSheet.setTableStyle(sheet.getTableStyle()); - writeSheet.setRelativeHeadRowIndex(sheet.getHeadLineMun()); + writeSheet.setRelativeHeadRowIndex(sheet.getStartRow()); writeSheet.setColumnWidthMap(sheet.getColumnWidthMap()); } diff --git a/src/main/java/com/alibaba/excel/analysis/ExcelAnalyserImpl.java b/src/main/java/com/alibaba/excel/analysis/ExcelAnalyserImpl.java index 31362d3..b24a182 100644 --- a/src/main/java/com/alibaba/excel/analysis/ExcelAnalyserImpl.java +++ b/src/main/java/com/alibaba/excel/analysis/ExcelAnalyserImpl.java @@ -2,11 +2,15 @@ package com.alibaba.excel.analysis; import java.io.IOException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + import com.alibaba.excel.analysis.v03.XlsSaxAnalyser; import com.alibaba.excel.analysis.v07.XlsxSaxAnalyser; import com.alibaba.excel.context.AnalysisContext; import com.alibaba.excel.context.AnalysisContextImpl; import com.alibaba.excel.exception.ExcelAnalysisException; +import com.alibaba.excel.exception.ExcelAnalysisStopException; import com.alibaba.excel.read.metadata.ReadSheet; import com.alibaba.excel.read.metadata.ReadWorkbook; import com.alibaba.excel.read.metadata.holder.ReadWorkbookHolder; @@ -17,6 +21,7 @@ import com.alibaba.excel.util.FileUtils; * @author jipengfei */ public class ExcelAnalyserImpl implements ExcelAnalyser { + private static final Logger LOGGER = LoggerFactory.getLogger(ExcelAnalyserImpl.class); private AnalysisContext analysisContext; @@ -29,7 +34,7 @@ public class ExcelAnalyserImpl implements ExcelAnalyser { } catch (RuntimeException e) { finish(); throw e; - } catch (Throwable e) { + } catch (Exception e) { finish(); throw new ExcelAnalysisException(e); } @@ -56,12 +61,18 @@ public class ExcelAnalyserImpl implements ExcelAnalyser { public void analysis(ReadSheet readSheet) { try { analysisContext.currentSheet(excelExecutor, readSheet); - excelExecutor.execute(); + try { + excelExecutor.execute(); + } catch (ExcelAnalysisStopException e) { + if (LOGGER.isDebugEnabled()) { + LOGGER.debug("Custom stop!"); + } + } analysisContext.readSheetHolder().notifyAfterAllAnalysed(analysisContext); } catch (RuntimeException e) { finish(); throw e; - } catch (Throwable e) { + } catch (Exception e) { finish(); throw new ExcelAnalysisException(e); } diff --git a/src/main/java/com/alibaba/excel/analysis/v07/XlsxSaxAnalyser.java b/src/main/java/com/alibaba/excel/analysis/v07/XlsxSaxAnalyser.java index bfed46e..d7aaea9 100644 --- a/src/main/java/com/alibaba/excel/analysis/v07/XlsxSaxAnalyser.java +++ b/src/main/java/com/alibaba/excel/analysis/v07/XlsxSaxAnalyser.java @@ -160,6 +160,8 @@ public class XlsxSaxAnalyser implements ExcelExecutor { xmlReader.setContentHandler(handler); xmlReader.parse(inputSource); inputStream.close(); + } catch (ExcelAnalysisException e) { + throw e; } catch (Exception e) { throw new ExcelAnalysisException(e); } finally { diff --git a/src/main/java/com/alibaba/excel/analysis/v07/handlers/DefaultCellHandler.java b/src/main/java/com/alibaba/excel/analysis/v07/handlers/DefaultCellHandler.java index 3f376b4..ba890bd 100644 --- a/src/main/java/com/alibaba/excel/analysis/v07/handlers/DefaultCellHandler.java +++ b/src/main/java/com/alibaba/excel/analysis/v07/handlers/DefaultCellHandler.java @@ -127,15 +127,23 @@ public class DefaultCellHandler implements XlsxCellHandler, XlsxRowResultHolder case DIRECT_STRING: case STRING: case ERROR: - currentCellData.setStringValue(currentCellValue); + if (currentCellData.getStringValue() == null) { + currentCellData.setStringValue(currentCellValue); + } else { + currentCellData.setStringValue(currentCellData.getStringValue() + currentCellValue); + } break; case BOOLEAN: - currentCellData.setBooleanValue(BooleanUtils.valueOf(currentCellValue)); + if (currentCellData.getBooleanValue() == null) { + currentCellData.setBooleanValue(BooleanUtils.valueOf(currentCellValue)); + } break; case NUMBER: case EMPTY: currentCellData.setType(CellDataTypeEnum.NUMBER); - currentCellData.setDoubleValue(Double.valueOf(currentCellValue)); + if (currentCellData.getDoubleValue() == null) { + currentCellData.setDoubleValue(Double.valueOf(currentCellValue)); + } break; default: throw new IllegalStateException("Cannot set values now"); diff --git a/src/main/java/com/alibaba/excel/cache/Ehcache.java b/src/main/java/com/alibaba/excel/cache/Ehcache.java index cd844eb..eae731a 100644 --- a/src/main/java/com/alibaba/excel/cache/Ehcache.java +++ b/src/main/java/com/alibaba/excel/cache/Ehcache.java @@ -24,7 +24,7 @@ import com.alibaba.excel.util.StringUtils; /** * Default cache - * + * * @author zhuangjiaju */ public class Ehcache implements ReadCache { @@ -66,7 +66,7 @@ public class Ehcache implements ReadCache { private int getCount = 0; /** * Count active cache - * + * */ private LinkedList countList = new LinkedList(); diff --git a/src/main/java/com/alibaba/excel/context/WriteContextImpl.java b/src/main/java/com/alibaba/excel/context/WriteContextImpl.java index 5ab62ad..3564cda 100644 --- a/src/main/java/com/alibaba/excel/context/WriteContextImpl.java +++ b/src/main/java/com/alibaba/excel/context/WriteContextImpl.java @@ -200,8 +200,8 @@ public class WriteContextImpl implements WriteContext { } int lastRowNum = writeSheetHolder.getSheet().getLastRowNum(); // 'lastRowNum' doesn't matter if it has one or zero,is's zero - if (lastRowNum == 0 && WriteLastRowType.HAVE_DATA == writeSheetHolder.getWriteLastRowType()) { - lastRowNum = 1; + if (WriteLastRowType.HAVE_DATA == writeSheetHolder.getWriteLastRowType()) { + lastRowNum++; } writeSheetHolder.setWriteLastRowType(WriteLastRowType.HAVE_DATA); int rowIndex = lastRowNum + currentWriteHolder.relativeHeadRowIndex(); diff --git a/src/main/java/com/alibaba/excel/exception/ExcelAnalysisStopException.java b/src/main/java/com/alibaba/excel/exception/ExcelAnalysisStopException.java new file mode 100644 index 0000000..fdc0dfd --- /dev/null +++ b/src/main/java/com/alibaba/excel/exception/ExcelAnalysisStopException.java @@ -0,0 +1,23 @@ +package com.alibaba.excel.exception; + +/** + * Throw the exception when you need to stop + * + * @author zhuangjiaju + */ +public class ExcelAnalysisStopException extends ExcelAnalysisException { + + public ExcelAnalysisStopException() {} + + public ExcelAnalysisStopException(String message) { + super(message); + } + + public ExcelAnalysisStopException(String message, Throwable cause) { + super(message, cause); + } + + public ExcelAnalysisStopException(Throwable cause) { + super(cause); + } +} diff --git a/src/main/java/com/alibaba/excel/metadata/BaseRowModel.java b/src/main/java/com/alibaba/excel/metadata/BaseRowModel.java index 35f3b27..7df131e 100644 --- a/src/main/java/com/alibaba/excel/metadata/BaseRowModel.java +++ b/src/main/java/com/alibaba/excel/metadata/BaseRowModel.java @@ -5,6 +5,8 @@ import java.util.Map; import org.apache.poi.ss.usermodel.CellStyle; +import com.alibaba.excel.annotation.ExcelIgnore; + /** * Excel基础模型 * @@ -17,6 +19,7 @@ public class BaseRowModel { /** * 每列样式 */ + @ExcelIgnore private Map cellStyleMap = new HashMap(); public void addStyle(Integer row, CellStyle cellStyle) { diff --git a/src/main/java/com/alibaba/excel/parameter/ExcelWriteParam.java b/src/main/java/com/alibaba/excel/parameter/ExcelWriteParam.java deleted file mode 100644 index 9104e83..0000000 --- a/src/main/java/com/alibaba/excel/parameter/ExcelWriteParam.java +++ /dev/null @@ -1,44 +0,0 @@ -package com.alibaba.excel.parameter; - -import java.io.OutputStream; - -import com.alibaba.excel.support.ExcelTypeEnum; - -/** - * {@link com.alibaba.excel.ExcelWriter} - * - * @author jipengfei - */ -@Deprecated -public class ExcelWriteParam { - - /** - */ - private OutputStream outputStream; - - /** - */ - private ExcelTypeEnum type; - - public ExcelWriteParam(OutputStream outputStream, ExcelTypeEnum type) { - this.outputStream = outputStream; - this.type = type; - - } - - public OutputStream getOutputStream() { - return outputStream; - } - - public void setOutputStream(OutputStream outputStream) { - this.outputStream = outputStream; - } - - public ExcelTypeEnum getType() { - return type; - } - - public void setType(ExcelTypeEnum type) { - this.type = type; - } -} diff --git a/src/main/java/com/alibaba/excel/read/builder/ExcelReaderBuilder.java b/src/main/java/com/alibaba/excel/read/builder/ExcelReaderBuilder.java index 1000fd0..1219433 100644 --- a/src/main/java/com/alibaba/excel/read/builder/ExcelReaderBuilder.java +++ b/src/main/java/com/alibaba/excel/read/builder/ExcelReaderBuilder.java @@ -2,7 +2,6 @@ package com.alibaba.excel.read.builder; import java.io.File; import java.io.InputStream; -import java.net.URI; import java.util.ArrayList; import java.util.List; @@ -17,7 +16,7 @@ import com.alibaba.excel.support.ExcelTypeEnum; /** * Build ExcelWriter - * + * * @author zhuangjiaju */ public class ExcelReaderBuilder { @@ -64,14 +63,6 @@ public class ExcelReaderBuilder { return file(new File(pathName)); } - /** - * Read file - *

- * If 'inputStream' and 'file' all not empty,file first - */ - public ExcelReaderBuilder file(URI uri) { - return file(new File(uri)); - } /** * Mandatory use 'inputStream' .Default is false. @@ -96,7 +87,7 @@ public class ExcelReaderBuilder { /** * This object can be read in the Listener {@link AnalysisEventListener#invoke(Object, AnalysisContext)} * {@link AnalysisContext#getCustom()} - * + * * @param customObject * @return */ @@ -107,7 +98,7 @@ public class ExcelReaderBuilder { /** * A cache that stores temp data to save memory.Default use {@link com.alibaba.excel.cache.Ehcache} - * + * * @param readCache * @return */ @@ -116,29 +107,13 @@ public class ExcelReaderBuilder { return this; } - /** - * The default is all excel objects.if true , you can use {@link com.alibaba.excel.annotation.ExcelIgnore} ignore a - * field. if false , you must use {@link com.alibaba.excel.annotation.ExcelProperty} to use a filed. - *

- * Default true - * - * @param convertAllFiled - * @return - * @deprecated Just to be compatible with historical data, The default is always going to be convert all filed. - */ - @Deprecated - public ExcelReaderBuilder convertAllFiled(Boolean convertAllFiled) { - readWorkbook.setConvertAllFiled(convertAllFiled); - return this; - } - /** * Count the number of added heads when read sheet. * *

  • 0 - This Sheet has no head ,since the first row are the data *
  • 1 - This Sheet has one row head , this is the default *
  • 2 - This Sheet has two row head ,since the third row is the data - * + * * @param headRowNumber * @return */ @@ -201,7 +176,7 @@ public class ExcelReaderBuilder { * true if date uses 1904 windowing, or false if using 1900 date windowing. * * default is false - * + * * @param use1904windowing * @return */ @@ -212,7 +187,7 @@ public class ExcelReaderBuilder { /** * Automatic trim includes sheet name and content - * + * * @param autoTrim * @return */ diff --git a/src/main/java/com/alibaba/excel/read/listener/ModelBuildEventListener.java b/src/main/java/com/alibaba/excel/read/listener/ModelBuildEventListener.java index 4ff1c69..bf4a8cf 100644 --- a/src/main/java/com/alibaba/excel/read/listener/ModelBuildEventListener.java +++ b/src/main/java/com/alibaba/excel/read/listener/ModelBuildEventListener.java @@ -1,6 +1,8 @@ package com.alibaba.excel.read.listener; +import java.util.ArrayList; import java.util.HashMap; +import java.util.List; import java.util.Map; import com.alibaba.excel.context.AnalysisContext; @@ -33,21 +35,37 @@ public class ModelBuildEventListener extends AbstractIgnoreExceptionReadListener context.readRowHolder().setCurrentRowAnalysisResult(buildUserModel(cellDataMap, currentReadHolder)); return; } - context.readRowHolder().setCurrentRowAnalysisResult(buildStringList(cellDataMap, currentReadHolder)); + context.readRowHolder().setCurrentRowAnalysisResult(buildStringList(cellDataMap, currentReadHolder, context)); } - private Object buildStringList(Map cellDataMap, ReadHolder currentReadHolder) { - Map map = new HashMap(cellDataMap.size() * 4 / 3 + 1); - for (Map.Entry entry : cellDataMap.entrySet()) { - CellData cellData = entry.getValue(); - if (cellData.getType() == CellDataTypeEnum.EMPTY) { - map.put(entry.getKey(), null); - continue; + private Object buildStringList(Map cellDataMap, ReadHolder currentReadHolder, + AnalysisContext context) { + if (context.readWorkbookHolder().getDefaultReturnMap()) { + Map map = new HashMap(cellDataMap.size() * 4 / 3 + 1); + for (Map.Entry entry : cellDataMap.entrySet()) { + CellData cellData = entry.getValue(); + if (cellData.getType() == CellDataTypeEnum.EMPTY) { + map.put(entry.getKey(), null); + continue; + } + map.put(entry.getKey(), (String)convertValue(cellData, String.class, null, + currentReadHolder.converterMap(), currentReadHolder.globalConfiguration())); + } + return map; + } else { + // Compatible with the old code the old code returns a list + List list = new ArrayList(); + for (Map.Entry entry : cellDataMap.entrySet()) { + CellData cellData = entry.getValue(); + if (cellData.getType() == CellDataTypeEnum.EMPTY) { + list.add(null); + continue; + } + list.add((String)convertValue(cellData, String.class, null, currentReadHolder.converterMap(), + currentReadHolder.globalConfiguration())); } - map.put(entry.getKey(), (String)convertValue(cellData, String.class, null, currentReadHolder.converterMap(), - currentReadHolder.globalConfiguration())); + return list; } - return map; } private Object buildUserModel(Map cellDataMap, ReadHolder currentReadHolder) { diff --git a/src/main/java/com/alibaba/excel/read/listener/ReadListener.java b/src/main/java/com/alibaba/excel/read/listener/ReadListener.java index 90b6f39..7335da5 100644 --- a/src/main/java/com/alibaba/excel/read/listener/ReadListener.java +++ b/src/main/java/com/alibaba/excel/read/listener/ReadListener.java @@ -5,14 +5,14 @@ import com.alibaba.excel.event.Listener; /** * Interface to listen for read results - * + * * @author zhuangjiaju */ public interface ReadListener extends Listener { /** * All listeners receive this method when any one Listener does an error report. If an exception is thrown here, the * entire read will terminate. - * + * * @param exception * @param context * @throws Exception @@ -23,7 +23,7 @@ public interface ReadListener extends Listener { * when analysis one row trigger invoke function. * * @param data - * one row value. Is is same as {@link AnalysisContext#currentRowAnalysisResult()} + * one row value. Is is same as {@link AnalysisContext#readRowHolder()} * @param context * analysis context */ diff --git a/src/main/java/com/alibaba/excel/read/metadata/ReadWorkbook.java b/src/main/java/com/alibaba/excel/read/metadata/ReadWorkbook.java index 1ceba75..e465375 100644 --- a/src/main/java/com/alibaba/excel/read/metadata/ReadWorkbook.java +++ b/src/main/java/com/alibaba/excel/read/metadata/ReadWorkbook.java @@ -53,12 +53,18 @@ public class ReadWorkbook extends ReadBasicParameter { * The default is all excel objects.Default is true. *
  • if true , you can use {@link com.alibaba.excel.annotation.ExcelIgnore} ignore a field. *
  • if false , you must use {@link com.alibaba.excel.annotation.ExcelProperty} to use a filed. - * + * * @deprecated Just to be compatible with historical data, The default is always going to be convert all filed. */ @Deprecated private Boolean convertAllFiled; + /** + * List is returned by default, now map is returned by default + */ + @Deprecated + private Boolean defaultReturnMap; + public ExcelTypeEnum getExcelType() { return excelType; } @@ -122,4 +128,12 @@ public class ReadWorkbook extends ReadBasicParameter { public void setConvertAllFiled(Boolean convertAllFiled) { this.convertAllFiled = convertAllFiled; } + + public Boolean getDefaultReturnMap() { + return defaultReturnMap; + } + + public void setDefaultReturnMap(Boolean defaultReturnMap) { + this.defaultReturnMap = defaultReturnMap; + } } diff --git a/src/main/java/com/alibaba/excel/read/metadata/holder/AbstractReadHolder.java b/src/main/java/com/alibaba/excel/read/metadata/holder/AbstractReadHolder.java index 9769b39..fcb9cd7 100644 --- a/src/main/java/com/alibaba/excel/read/metadata/holder/AbstractReadHolder.java +++ b/src/main/java/com/alibaba/excel/read/metadata/holder/AbstractReadHolder.java @@ -14,6 +14,7 @@ import com.alibaba.excel.enums.HeadKindEnum; import com.alibaba.excel.enums.HolderEnum; import com.alibaba.excel.event.AnalysisEventListener; import com.alibaba.excel.exception.ExcelAnalysisException; +import com.alibaba.excel.exception.ExcelAnalysisStopException; import com.alibaba.excel.exception.ExcelDataConvertException; import com.alibaba.excel.metadata.AbstractHolder; import com.alibaba.excel.metadata.CellData; @@ -128,6 +129,9 @@ public abstract class AbstractReadHolder extends AbstractHolder implements ReadH } } } + if (!readListener.hasNext(analysisContext)) { + throw new ExcelAnalysisStopException(); + } } return; } diff --git a/src/main/java/com/alibaba/excel/read/metadata/holder/ReadWorkbookHolder.java b/src/main/java/com/alibaba/excel/read/metadata/holder/ReadWorkbookHolder.java index 18c4d12..385e782 100644 --- a/src/main/java/com/alibaba/excel/read/metadata/holder/ReadWorkbookHolder.java +++ b/src/main/java/com/alibaba/excel/read/metadata/holder/ReadWorkbookHolder.java @@ -1,5 +1,6 @@ package com.alibaba.excel.read.metadata.holder; +import java.io.BufferedInputStream; import java.io.File; import java.io.InputStream; import java.util.HashSet; @@ -78,6 +79,12 @@ public class ReadWorkbookHolder extends AbstractReadHolder { @Deprecated private Boolean convertAllFiled; + /** + * List is returned by default, now map is returned by default + */ + @Deprecated + private Boolean defaultReturnMap; + /** * Prevent repeating sheet */ @@ -86,7 +93,13 @@ public class ReadWorkbookHolder extends AbstractReadHolder { public ReadWorkbookHolder(ReadWorkbook readWorkbook) { super(readWorkbook, null, readWorkbook.getConvertAllFiled()); this.readWorkbook = readWorkbook; - this.inputStream = readWorkbook.getInputStream(); + if (readWorkbook.getInputStream() != null) { + if (readWorkbook.getInputStream().markSupported()) { + this.inputStream = readWorkbook.getInputStream(); + } else { + this.inputStream = new BufferedInputStream(readWorkbook.getInputStream()); + } + } this.file = readWorkbook.getFile(); if (file == null && inputStream == null) { throw new ExcelAnalysisException("File and inputStream must be a non-null."); @@ -114,6 +127,11 @@ public class ReadWorkbookHolder extends AbstractReadHolder { if (readCache != null && ExcelTypeEnum.XLS == excelType) { LOGGER.warn("Xls not support 'readCache'!"); } + if (readWorkbook.getDefaultReturnMap() == null) { + this.defaultReturnMap = Boolean.TRUE; + } else { + this.defaultReturnMap = readWorkbook.getDefaultReturnMap(); + } this.hasReadSheet = new HashSet(); } @@ -205,6 +223,14 @@ public class ReadWorkbookHolder extends AbstractReadHolder { this.hasReadSheet = hasReadSheet; } + public Boolean getDefaultReturnMap() { + return defaultReturnMap; + } + + public void setDefaultReturnMap(Boolean defaultReturnMap) { + this.defaultReturnMap = defaultReturnMap; + } + @Override public HolderEnum holderType() { return HolderEnum.WORKBOOK; diff --git a/src/main/java/com/alibaba/excel/support/ExcelTypeEnum.java b/src/main/java/com/alibaba/excel/support/ExcelTypeEnum.java index 5cd3a93..a267e1d 100644 --- a/src/main/java/com/alibaba/excel/support/ExcelTypeEnum.java +++ b/src/main/java/com/alibaba/excel/support/ExcelTypeEnum.java @@ -36,7 +36,6 @@ public enum ExcelTypeEnum { String fileName = file.getName(); if (fileName.endsWith(XLSX.getValue())) { return XLSX; - } else if (fileName.endsWith(XLS.getValue())) { return XLS; } else { diff --git a/src/main/java/com/alibaba/excel/write/ExcelBuilderImpl.java b/src/main/java/com/alibaba/excel/write/ExcelBuilderImpl.java index 566ca84..6f06e11 100644 --- a/src/main/java/com/alibaba/excel/write/ExcelBuilderImpl.java +++ b/src/main/java/com/alibaba/excel/write/ExcelBuilderImpl.java @@ -1,6 +1,8 @@ package com.alibaba.excel.write; import java.lang.reflect.Field; +import java.util.ArrayList; +import java.util.Collections; import java.util.HashSet; import java.util.List; import java.util.Map; @@ -18,6 +20,7 @@ import com.alibaba.excel.converters.ConverterKeyBuild; import com.alibaba.excel.enums.WriteLastRowType; import com.alibaba.excel.exception.ExcelDataConvertException; import com.alibaba.excel.exception.ExcelGenerateException; +import com.alibaba.excel.metadata.BaseRowModel; import com.alibaba.excel.metadata.CellData; import com.alibaba.excel.metadata.Head; import com.alibaba.excel.metadata.property.ExcelContentProperty; @@ -50,7 +53,7 @@ public class ExcelBuilderImpl implements ExcelBuilder { } catch (RuntimeException e) { finish(); throw e; - } catch (Throwable e) { + } catch (Exception e) { finish(); throw new ExcelGenerateException(e); } @@ -73,9 +76,11 @@ public class ExcelBuilderImpl implements ExcelBuilder { if (writeSheetHolder.isNew() && !writeSheetHolder.getExcelWriteHeadProperty().hasHead()) { lastRowNum += context.currentWriteHolder().relativeHeadRowIndex(); } + // Beanmap is out of order,so use fieldList + List fieldList = new ArrayList(); for (int relativeRowIndex = 0; relativeRowIndex < data.size(); relativeRowIndex++) { int n = relativeRowIndex + lastRowNum + 1; - addOneRowOfDataToExcel(data.get(relativeRowIndex), n, relativeRowIndex); + addOneRowOfDataToExcel(data.get(relativeRowIndex), n, relativeRowIndex, fieldList); } } @@ -93,7 +98,7 @@ public class ExcelBuilderImpl implements ExcelBuilder { } catch (RuntimeException e) { finish(); throw e; - } catch (Throwable e) { + } catch (Exception e) { finish(); throw new ExcelGenerateException(e); } @@ -112,14 +117,14 @@ public class ExcelBuilderImpl implements ExcelBuilder { context.writeSheetHolder().getSheet().addMergedRegion(cra); } - private void addOneRowOfDataToExcel(Object oneRowData, int n, int relativeRowIndex) { + private void addOneRowOfDataToExcel(Object oneRowData, int n, int relativeRowIndex, List fieldList) { beforeRowCreate(n, relativeRowIndex); Row row = WorkBookUtil.createRow(context.writeSheetHolder().getSheet(), n); afterRowCreate(row, relativeRowIndex); if (oneRowData instanceof List) { addBasicTypeToExcel((List)oneRowData, row, relativeRowIndex); } else { - addJavaObjectToExcel(oneRowData, row, relativeRowIndex); + addJavaObjectToExcel(oneRowData, row, relativeRowIndex, fieldList); } } @@ -188,7 +193,7 @@ public class ExcelBuilderImpl implements ExcelBuilder { afterCellCreate(head, cell, relativeRowIndex); } - private void addJavaObjectToExcel(Object oneRowData, Row row, int relativeRowIndex) { + private void addJavaObjectToExcel(Object oneRowData, Row row, int relativeRowIndex, List fieldList) { WriteHolder currentWriteHolder = context.currentWriteHolder(); BeanMap beanMap = BeanMap.create(oneRowData); Set beanMapHandledSet = new HashSet(); @@ -220,19 +225,38 @@ public class ExcelBuilderImpl implements ExcelBuilder { cellIndex++; } Map ignoreMap = context.currentWriteHolder().excelWriteHeadProperty().getIgnoreMap(); - Set> entrySet = beanMap.entrySet(); - for (Map.Entry entry : entrySet) { - if (entry.getValue() == null || beanMapHandledSet.contains(entry.getKey()) - || ignoreMap.containsKey(entry.getKey())) { + initFieldList(oneRowData.getClass(), fieldList); + for (Field field : fieldList) { + String filedName = field.getName(); + boolean uselessData = !beanMap.containsKey(filedName) || beanMapHandledSet.contains(filedName) + || ignoreMap.containsKey(filedName); + if (uselessData) { + continue; + } + Object value = beanMap.get(filedName); + if (value == null) { continue; } beforeCellCreate(row, null, relativeRowIndex); Cell cell = WorkBookUtil.createCell(row, cellIndex++); - converterAndSet(currentWriteHolder, entry.getValue().getClass(), cell, entry.getValue(), null); + converterAndSet(currentWriteHolder, value.getClass(), cell, value, null); afterCellCreate(null, cell, relativeRowIndex); } } + private void initFieldList(Class clazz, List fieldList) { + if (!fieldList.isEmpty()) { + return; + } + Class tempClass = clazz; + while (tempClass != null) { + if (tempClass != BaseRowModel.class) { + Collections.addAll(fieldList, tempClass.getDeclaredFields()); + } + tempClass = tempClass.getSuperclass(); + } + } + private void beforeCellCreate(Row row, Head head, int relativeRowIndex) { List handlerList = context.currentWriteHolder().writeHandlerMap().get(CellWriteHandler.class); if (handlerList == null || handlerList.isEmpty()) { diff --git a/src/main/java/com/alibaba/excel/write/builder/ExcelWriterBuilder.java b/src/main/java/com/alibaba/excel/write/builder/ExcelWriterBuilder.java index 673e81c..bb1c4dd 100644 --- a/src/main/java/com/alibaba/excel/write/builder/ExcelWriterBuilder.java +++ b/src/main/java/com/alibaba/excel/write/builder/ExcelWriterBuilder.java @@ -3,7 +3,6 @@ package com.alibaba.excel.write.builder; import java.io.File; import java.io.InputStream; import java.io.OutputStream; -import java.net.URI; import java.util.ArrayList; import java.util.List; @@ -143,10 +142,6 @@ public class ExcelWriterBuilder { return file(new File(outputPathName)); } - public ExcelWriterBuilder file(URI outputUri) { - return file(new File(outputUri)); - } - public ExcelWriterBuilder withTemplate(InputStream templateInputStream) { writeWorkbook.setTemplateInputStream(templateInputStream); return this; @@ -161,10 +156,6 @@ public class ExcelWriterBuilder { return withTemplate(new File(pathName)); } - public ExcelWriterBuilder withTemplate(URI uri) { - return withTemplate(new File(uri)); - } - /** * Write handler * 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 0f97f03..3b36419 100644 --- a/src/main/java/com/alibaba/excel/write/builder/ExcelWriterTableBuilder.java +++ b/src/main/java/com/alibaba/excel/write/builder/ExcelWriterTableBuilder.java @@ -12,7 +12,7 @@ import com.alibaba.excel.write.metadata.WriteTable; /** * Build sheet - * + * * @author zhuangjiaju */ public class ExcelWriterTableBuilder { @@ -32,6 +32,7 @@ public class ExcelWriterTableBuilder { public ExcelWriterTableBuilder(ExcelWriter excelWriter, WriteSheet writeSheet) { this.excelWriter = excelWriter; this.writeSheet = writeSheet; + this.writeTable = new WriteTable(); } /** @@ -128,4 +129,11 @@ public class ExcelWriterTableBuilder { 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/main/java/com/alibaba/excel/write/merge/LoopMergeStrategy.java b/src/main/java/com/alibaba/excel/write/merge/LoopMergeStrategy.java index ad4843f..c2a1577 100644 --- a/src/main/java/com/alibaba/excel/write/merge/LoopMergeStrategy.java +++ b/src/main/java/com/alibaba/excel/write/merge/LoopMergeStrategy.java @@ -8,7 +8,7 @@ import com.alibaba.excel.metadata.Head; /** * The regions of the loop merge - * + * * @author zhuangjiaju */ public class LoopMergeStrategy extends AbstractMergeStrategy { @@ -26,8 +26,8 @@ public class LoopMergeStrategy extends AbstractMergeStrategy { @Override protected void merge(Sheet sheet, Cell cell, Head head, int relativeRowIndex) { if (relativeRowIndex % eachRow == 0 && head.getColumnIndex() % eachColumn == 0) { - CellRangeAddress cellRangeAddress = new CellRangeAddress(cell.getRowIndex(), cell.getRowIndex() + eachRow, - cell.getColumnIndex(), cell.getColumnIndex() + eachColumn); + CellRangeAddress cellRangeAddress = new CellRangeAddress(cell.getRowIndex(), + cell.getRowIndex() + eachRow - 1, cell.getColumnIndex(), cell.getColumnIndex() + eachColumn - 1); sheet.addMergedRegion(cellRangeAddress); } } diff --git a/src/main/java/com/alibaba/excel/write/metadata/holder/AbstractWriteHolder.java b/src/main/java/com/alibaba/excel/write/metadata/holder/AbstractWriteHolder.java index bb6f2be..0c4d240 100644 --- a/src/main/java/com/alibaba/excel/write/metadata/holder/AbstractWriteHolder.java +++ b/src/main/java/com/alibaba/excel/write/metadata/holder/AbstractWriteHolder.java @@ -183,6 +183,7 @@ public abstract class AbstractWriteHolder extends AbstractHolder implements Writ writeFont.setFontName(font.getFontName()); writeFont.setFontHeightInPoints(font.getFontHeightInPoints()); writeFont.setBold(font.isBold()); + writeCellStyle.setWriteFont(writeFont); } return writeCellStyle; } @@ -263,12 +264,16 @@ public abstract class AbstractWriteHolder extends AbstractHolder implements Writ protected Map, List> sortAndClearUpHandler( List handlerList, Map, List> parentHandlerMap) { + // add + Set noRepeatSet = new HashSet(); if (parentHandlerMap != null) { for (List parentHandlerList : parentHandlerMap.values()) { - handlerList.addAll(parentHandlerList); + noRepeatSet.addAll(parentHandlerList); } } + handlerList.addAll(noRepeatSet); + // sort Map> orderExcelWriteHandlerMap = new TreeMap>(); for (WriteHandler handler : handlerList) { diff --git a/src/main/java/com/alibaba/excel/write/metadata/holder/WriteWorkbookHolder.java b/src/main/java/com/alibaba/excel/write/metadata/holder/WriteWorkbookHolder.java index 76855ae..02ce196 100644 --- a/src/main/java/com/alibaba/excel/write/metadata/holder/WriteWorkbookHolder.java +++ b/src/main/java/com/alibaba/excel/write/metadata/holder/WriteWorkbookHolder.java @@ -1,5 +1,6 @@ package com.alibaba.excel.write.metadata.holder; +import java.io.BufferedInputStream; import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; @@ -85,7 +86,13 @@ public class WriteWorkbookHolder extends AbstractWriteHolder { } else { this.outputStream = writeWorkbook.getOutputStream(); } - this.templateInputStream = writeWorkbook.getTemplateInputStream(); + if (writeWorkbook.getTemplateInputStream() != null) { + if (writeWorkbook.getTemplateInputStream().markSupported()) { + this.templateInputStream = writeWorkbook.getTemplateInputStream(); + } else { + this.templateInputStream = new BufferedInputStream(writeWorkbook.getTemplateInputStream()); + } + } this.templateFile = writeWorkbook.getTemplateFile(); if (writeWorkbook.getAutoCloseStream() == null) { this.autoCloseStream = Boolean.TRUE; diff --git a/src/main/java/com/alibaba/excel/write/style/AbstractCellStyleStrategy.java b/src/main/java/com/alibaba/excel/write/style/AbstractCellStyleStrategy.java index 94c4a77..41cabac 100644 --- a/src/main/java/com/alibaba/excel/write/style/AbstractCellStyleStrategy.java +++ b/src/main/java/com/alibaba/excel/write/style/AbstractCellStyleStrategy.java @@ -7,34 +7,42 @@ import org.apache.poi.ss.usermodel.Workbook; import com.alibaba.excel.event.NotRepeatExecutor; import com.alibaba.excel.metadata.Head; import com.alibaba.excel.write.handler.CellWriteHandler; -import com.alibaba.excel.write.handler.WorkbookWriteHandler; +import com.alibaba.excel.write.handler.SheetWriteHandler; import com.alibaba.excel.write.metadata.holder.WriteSheetHolder; import com.alibaba.excel.write.metadata.holder.WriteTableHolder; import com.alibaba.excel.write.metadata.holder.WriteWorkbookHolder; /** * Cell style strategy - * + * * @author zhuangjiaju */ -public abstract class AbstractCellStyleStrategy implements CellWriteHandler, WorkbookWriteHandler, NotRepeatExecutor { +public abstract class AbstractCellStyleStrategy implements CellWriteHandler, SheetWriteHandler, NotRepeatExecutor { + boolean hasInitialized = false; + @Override public String uniqueValue() { return "CellStyleStrategy"; } @Override - public void beforeWorkbookCreate() {} + public void beforeSheetCreate(WriteWorkbookHolder writeWorkbookHolder, WriteSheetHolder writeSheetHolder) { + + } @Override - public void afterWorkbookCreate(WriteWorkbookHolder writeWorkbookHolder) { + public void afterSheetCreate(WriteWorkbookHolder writeWorkbookHolder, WriteSheetHolder writeSheetHolder) { initCellStyle(writeWorkbookHolder.getWorkbook()); + hasInitialized = true; } @Override public void beforeCellCreate(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, Row row, Head head, int relativeRowIndex, boolean isHead) { - + if (!hasInitialized) { + initCellStyle(writeSheetHolder.getParentWriteWorkbookHolder().getWorkbook()); + hasInitialized = true; + } } @Override @@ -49,14 +57,14 @@ public abstract class AbstractCellStyleStrategy implements CellWriteHandler, Wor /** * Initialization cell style - * + * * @param workbook */ protected abstract void initCellStyle(Workbook workbook); /** * Sets the cell style of header - * + * * @param cell * @param head * @param relativeRowIndex @@ -65,7 +73,7 @@ public abstract class AbstractCellStyleStrategy implements CellWriteHandler, Wor /** * Sets the cell style of content - * + * * @param cell * @param head * @param relativeRowIndex diff --git a/src/test/java/com/alibaba/easyexcel/test/ReadTest.java b/src/test/java/com/alibaba/easyexcel/test/ReadTest.java deleted file mode 100644 index 0e46892..0000000 --- a/src/test/java/com/alibaba/easyexcel/test/ReadTest.java +++ /dev/null @@ -1,189 +0,0 @@ -package com.alibaba.easyexcel.test; - -import com.alibaba.easyexcel.test.listen.ExcelListener; -import com.alibaba.easyexcel.test.model.ReadModel; -import com.alibaba.easyexcel.test.model.ReadModel2; -import com.alibaba.easyexcel.test.util.TestFileUtil; -import com.alibaba.excel.EasyExcelFactory; -import com.alibaba.excel.ExcelReader; -import com.alibaba.excel.metadata.Sheet; - -import org.junit.Test; - -import java.io.IOException; -import java.io.InputStream; -import java.util.List; - -public class ReadTest { - - - /** - * 07版本excel读数据量少于1千行数据,内部采用回调方法. - * - * @throws IOException 简单抛出异常,真实环境需要catch异常,同时在finally中关闭流 - */ - @Test - public void simpleReadListStringV2007() throws IOException { - InputStream inputStream = TestFileUtil.getResourcesFileInputStream("2007.xlsx"); - List data = EasyExcelFactory.read(inputStream, new Sheet(1, 0)); - inputStream.close(); - print(data); - } - - - /** - * 07版本excel读数据量少于1千行数据自动转成javamodel,内部采用回调方法. - * - * @throws IOException 简单抛出异常,真实环境需要catch异常,同时在finally中关闭流 - */ - @Test - public void simpleReadJavaModelV2007() throws IOException { - InputStream inputStream = TestFileUtil.getResourcesFileInputStream("2007.xlsx"); - List data = EasyExcelFactory.read(inputStream, new Sheet(2, 1, ReadModel.class)); - inputStream.close(); - print(data); - } - - /** - * 07版本excel读数据量大于1千行,内部采用回调方法. - * - * @throws IOException 简单抛出异常,真实环境需要catch异常,同时在finally中关闭流 - */ - @Test - public void saxReadListStringV2007() throws IOException { - InputStream inputStream = TestFileUtil.getResourcesFileInputStream("2007.xlsx"); - ExcelListener excelListener = new ExcelListener(); - EasyExcelFactory.readBySax(inputStream, new Sheet(1, 1), excelListener); - inputStream.close(); - - } - /** - * 07版本excel读数据量大于1千行,内部采用回调方法. - * - * @throws IOException 简单抛出异常,真实环境需要catch异常,同时在finally中关闭流 - */ - @Test - public void saxReadJavaModelV2007() throws IOException { - InputStream inputStream = TestFileUtil.getResourcesFileInputStream("2007.xlsx"); - ExcelListener excelListener = new ExcelListener(); - EasyExcelFactory.readBySax(inputStream, new Sheet(2, 1, ReadModel.class), excelListener); - inputStream.close(); - } - - /** - * 07版本excel读取sheet - * - * @throws IOException 简单抛出异常,真实环境需要catch异常,同时在finally中关闭流 - */ - @Test - public void saxReadSheetsV2007() throws IOException { - InputStream inputStream = TestFileUtil.getResourcesFileInputStream("2007.xlsx"); - ExcelListener excelListener = new ExcelListener(); - ExcelReader excelReader = EasyExcelFactory.getReader(inputStream,excelListener); - List sheets = excelReader.getSheets(); - System.out.println("llll****"+sheets); - System.out.println(); - for (Sheet sheet:sheets) { - if(sheet.getSheetNo() ==1) { - excelReader.read(sheet); - }else if(sheet.getSheetNo() ==2){ - sheet.setHeadLineMun(1); - sheet.setClazz(ReadModel.class); - excelReader.read(sheet); - }else if(sheet.getSheetNo() ==3){ - sheet.setHeadLineMun(1); - sheet.setClazz(ReadModel2.class); - excelReader.read(sheet); - } - } - inputStream.close(); - } - - - - /** - * 03版本excel读数据量少于1千行数据,内部采用回调方法. - * - * @throws IOException 简单抛出异常,真实环境需要catch异常,同时在finally中关闭流 - */ - @Test - public void simpleReadListStringV2003() throws IOException { - InputStream inputStream = TestFileUtil.getResourcesFileInputStream("2003.xls"); - List data = EasyExcelFactory.read(inputStream, new Sheet(1, 0)); - inputStream.close(); - print(data); - } - - /** - * 03版本excel读数据量少于1千行数据转成javamodel,内部采用回调方法. - * - * @throws IOException 简单抛出异常,真实环境需要catch异常,同时在finally中关闭流 - */ - @Test - public void simpleReadJavaModelV2003() throws IOException { - InputStream inputStream = TestFileUtil.getResourcesFileInputStream("2003.xls"); - List data = EasyExcelFactory.read(inputStream, new Sheet(2, 1, ReadModel.class)); - inputStream.close(); - print(data); - } - - /** - * 03版本excel读数据量大于1千行数据,内部采用回调方法. - * - * @throws IOException 简单抛出异常,真实环境需要catch异常,同时在finally中关闭流 - */ - @Test - public void saxReadListStringV2003() throws IOException { - InputStream inputStream = TestFileUtil.getResourcesFileInputStream("2003.xls"); - ExcelListener excelListener = new ExcelListener(); - EasyExcelFactory.readBySax(inputStream, new Sheet(2, 1), excelListener); - inputStream.close(); - } - - /** - * 03版本excel读数据量大于1千行数据转成javamodel,内部采用回调方法. - * - * @throws IOException 简单抛出异常,真实环境需要catch异常,同时在finally中关闭流 - */ - @Test - public void saxReadJavaModelV2003() throws IOException { - InputStream inputStream = TestFileUtil.getResourcesFileInputStream("2003.xls"); - ExcelListener excelListener = new ExcelListener(); - EasyExcelFactory.readBySax(inputStream, new Sheet(2, 1, ReadModel.class), excelListener); - inputStream.close(); - } - - /** - * 00版本excel读取sheet - * - * @throws IOException 简单抛出异常,真实环境需要catch异常,同时在finally中关闭流 - */ - @Test - public void saxReadSheetsV2003() throws IOException { - InputStream inputStream = TestFileUtil.getResourcesFileInputStream("2003.xls"); - ExcelListener excelListener = new ExcelListener(); - ExcelReader excelReader = EasyExcelFactory.getReader(inputStream,excelListener); - List sheets = excelReader.getSheets(); - System.out.println(); - for (Sheet sheet:sheets) { - if(sheet.getSheetNo() == 1) { - excelReader.read(sheet); - }else { - sheet.setHeadLineMun(2); - sheet.setClazz(ReadModel.class); - excelReader.read(sheet); - } - } - inputStream.close(); - } - - - public void print(List datas){ - int i=0; - for (Object ob:datas) { - System.out.println(i++); - System.out.println(ob); - } - } - -} diff --git a/src/test/java/com/alibaba/easyexcel/test/WriteTest.java b/src/test/java/com/alibaba/easyexcel/test/WriteTest.java deleted file mode 100644 index 902e956..0000000 --- a/src/test/java/com/alibaba/easyexcel/test/WriteTest.java +++ /dev/null @@ -1,194 +0,0 @@ -package com.alibaba.easyexcel.test; - -import com.alibaba.easyexcel.test.listen.AfterExcelWriteHandlerImpl; -import com.alibaba.easyexcel.test.model.WriteModel; -import com.alibaba.easyexcel.test.util.TestFileUtil; -import com.alibaba.excel.EasyExcelFactory; -import com.alibaba.excel.ExcelWriter; -import com.alibaba.excel.metadata.Sheet; -import com.alibaba.excel.metadata.Table; -import com.alibaba.excel.support.ExcelTypeEnum; -import org.junit.Test; - -import java.io.*; -import java.util.HashMap; -import java.util.Map; - -import static com.alibaba.easyexcel.test.util.DataUtil.*; - -public class WriteTest { - - @Test - public void writeV2007() throws IOException { - OutputStream out = new FileOutputStream("/Users/jipengfei/2007.xlsx"); - ExcelWriter writer = EasyExcelFactory.getWriter(out); - //写第一个sheet, sheet1 数据全是List 无模型映射关系 - Sheet sheet1 = new Sheet(1, 3); - sheet1.setSheetName("第一个sheet"); - - //设置列宽 设置每列的宽度 - Map columnWidth = new HashMap(); - columnWidth.put(0,10000);columnWidth.put(1,40000);columnWidth.put(2,10000);columnWidth.put(3,10000); - sheet1.setColumnWidthMap(columnWidth); - sheet1.setHead(createTestListStringHead()); - //or 设置自适应宽度 - //sheet1.setAutoWidth(Boolean.TRUE); - writer.write1(createTestListObject(), sheet1); - - //写第二个sheet sheet2 模型上打有表头的注解,合并单元格 - Sheet sheet2 = new Sheet(2, 3, WriteModel.class, "第二个sheet", null); - sheet2.setTableStyle(createTableStyle()); - //writer.write1(null, sheet2); - writer.write(createTestListJavaMode(), sheet2); - //需要合并单元格 - writer.merge(5,20,1,1); - - //写第三个sheet包含多个table情况 - Sheet sheet3 = new Sheet(3, 0); - sheet3.setSheetName("第三个sheet"); - Table table1 = new Table(1); - table1.setHead(createTestListStringHead()); - writer.write1(createTestListObject(), sheet3, table1); - - //写sheet2 模型上打有表头的注解 - Table table2 = new Table(2); - table2.setTableStyle(createTableStyle()); - table2.setClazz(WriteModel.class); - writer.write(createTestListJavaMode(), sheet3, table2); - - writer.finish(); - out.close(); - - } - - - @Test - public void writeV2007WithTemplate() throws IOException { - InputStream inputStream = TestFileUtil.getResourcesFileInputStream("temp.xlsx"); - OutputStream out = new FileOutputStream("/Users/jipengfei/2007.xlsx"); - ExcelWriter writer = EasyExcelFactory.getWriterWithTemp(inputStream,out,ExcelTypeEnum.XLSX,true); - //写第一个sheet, sheet1 数据全是List 无模型映射关系 - Sheet sheet1 = new Sheet(1, 3); - sheet1.setSheetName("第一个sheet"); - sheet1.setStartRow(20); - - //设置列宽 设置每列的宽度 - Map columnWidth = new HashMap(); - columnWidth.put(0,10000);columnWidth.put(1,40000);columnWidth.put(2,10000);columnWidth.put(3,10000); - sheet1.setColumnWidthMap(columnWidth); - sheet1.setHead(createTestListStringHead()); - //or 设置自适应宽度 - //sheet1.setAutoWidth(Boolean.TRUE); - writer.write1(createTestListObject(), sheet1); - - //写第二个sheet sheet2 模型上打有表头的注解,合并单元格 - Sheet sheet2 = new Sheet(2, 3, WriteModel.class, "第二个sheet", null); - sheet2.setTableStyle(createTableStyle()); - sheet2.setStartRow(20); - writer.write(createTestListJavaMode(), sheet2); - - //写第三个sheet包含多个table情况 - Sheet sheet3 = new Sheet(3, 0); - sheet3.setSheetName("第三个sheet"); - sheet3.setStartRow(30); - Table table1 = new Table(1); - table1.setHead(createTestListStringHead()); - writer.write1(createTestListObject(), sheet3, table1); - - //写sheet2 模型上打有表头的注解 - Table table2 = new Table(2); - table2.setTableStyle(createTableStyle()); - table2.setClazz(WriteModel.class); - writer.write(createTestListJavaMode(), sheet3, table2); - - writer.finish(); - out.close(); - - } - - @Test - public void writeV2007WithTemplateAndHandler() throws IOException { - InputStream inputStream = TestFileUtil.getResourcesFileInputStream("temp.xlsx"); - OutputStream out = new FileOutputStream("/Users/jipengfei/2007.xlsx"); - ExcelWriter writer = EasyExcelFactory.getWriterWithTempAndHandler(inputStream,out,ExcelTypeEnum.XLSX,true, - new AfterExcelWriteHandlerImpl()); - //写第一个sheet, sheet1 数据全是List 无模型映射关系 - Sheet sheet1 = new Sheet(1, 3); - sheet1.setSheetName("第一个sheet"); - sheet1.setStartRow(20); - - //设置列宽 设置每列的宽度 - Map columnWidth = new HashMap(); - columnWidth.put(0,10000);columnWidth.put(1,40000);columnWidth.put(2,10000);columnWidth.put(3,10000); - sheet1.setColumnWidthMap(columnWidth); - sheet1.setHead(createTestListStringHead()); - //or 设置自适应宽度 - //sheet1.setAutoWidth(Boolean.TRUE); - writer.write1(createTestListObject(), sheet1); - - //写第二个sheet sheet2 模型上打有表头的注解,合并单元格 - Sheet sheet2 = new Sheet(2, 3, WriteModel.class, "第二个sheet", null); - sheet2.setTableStyle(createTableStyle()); - sheet2.setStartRow(20); - writer.write(createTestListJavaMode(), sheet2); - - //写第三个sheet包含多个table情况 - Sheet sheet3 = new Sheet(3, 0); - sheet3.setSheetName("第三个sheet"); - sheet3.setStartRow(30); - Table table1 = new Table(1); - table1.setHead(createTestListStringHead()); - writer.write1(createTestListObject(), sheet3, table1); - - //写sheet2 模型上打有表头的注解 - Table table2 = new Table(2); - table2.setTableStyle(createTableStyle()); - table2.setClazz(WriteModel.class); - writer.write(createTestListJavaMode(), sheet3, table2); - - writer.finish(); - out.close(); - - } - - - - @Test - public void writeV2003() throws IOException { - OutputStream out = new FileOutputStream("/Users/jipengfei/2003.xls"); - ExcelWriter writer = EasyExcelFactory.getWriter(out, ExcelTypeEnum.XLS,true); - //写第一个sheet, sheet1 数据全是List 无模型映射关系 - Sheet sheet1 = new Sheet(1, 3); - sheet1.setSheetName("第一个sheet"); - - //设置列宽 设置每列的宽度 - Map columnWidth = new HashMap(); - columnWidth.put(0,10000);columnWidth.put(1,40000);columnWidth.put(2,10000);columnWidth.put(3,10000); - sheet1.setColumnWidthMap(columnWidth); - sheet1.setHead(createTestListStringHead()); - //or 设置自适应宽度 - //sheet1.setAutoWidth(Boolean.TRUE); - writer.write1(createTestListObject(), sheet1); - - //写第二个sheet sheet2 模型上打有表头的注解,合并单元格 - Sheet sheet2 = new Sheet(2, 3, WriteModel.class, "第二个sheet", null); - sheet2.setTableStyle(createTableStyle()); - writer.write(createTestListJavaMode(), sheet2); - - //写第三个sheet包含多个table情况 - Sheet sheet3 = new Sheet(3, 0); - sheet3.setSheetName("第三个sheet"); - Table table1 = new Table(1); - table1.setHead(createTestListStringHead()); - writer.write1(createTestListObject(), sheet3, table1); - - //写sheet2 模型上打有表头的注解 - Table table2 = new Table(2); - table2.setTableStyle(createTableStyle()); - table2.setClazz(WriteModel.class); - writer.write(createTestListJavaMode(), sheet3, table2); - - writer.finish(); - out.close(); - } -} 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 a01693d..2adb905 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 @@ -37,8 +37,9 @@ public class AnnotationDataTest { } private void readAndWrite(File file) throws Exception { - EasyExcelFactory.write(file, AnnotationData.class).sheet().doWrite(data()).finish(); - EasyExcelFactory.read(file, AnnotationData.class, new AnnotationDataListener()).sheet().doRead().finish(); + EasyExcelFactory.write().file(file).head(AnnotationData.class).sheet().doWrite(data()).finish(); + EasyExcelFactory.read().file(file).head(AnnotationData.class).registerReadListener(new AnnotationDataListener()) + .sheet().doRead().finish(); } private List data() throws Exception { diff --git a/src/test/java/com/alibaba/easyexcel/test/core/compatibility/AnnotationDataListener.java b/src/test/java/com/alibaba/easyexcel/test/core/compatibility/CompatibilityDataListener.java similarity index 50% rename from src/test/java/com/alibaba/easyexcel/test/core/compatibility/AnnotationDataListener.java rename to src/test/java/com/alibaba/easyexcel/test/core/compatibility/CompatibilityDataListener.java index 35acfa7..c63426f 100644 --- a/src/test/java/com/alibaba/easyexcel/test/core/compatibility/AnnotationDataListener.java +++ b/src/test/java/com/alibaba/easyexcel/test/core/compatibility/CompatibilityDataListener.java @@ -1,6 +1,5 @@ package com.alibaba.easyexcel.test.core.compatibility; -import java.text.ParseException; import java.util.ArrayList; import java.util.List; @@ -8,35 +7,28 @@ import org.junit.Assert; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import com.alibaba.easyexcel.test.core.annotation.AnnotationData; +import com.alibaba.easyexcel.test.core.annotation.AnnotationDataListener; import com.alibaba.excel.context.AnalysisContext; import com.alibaba.excel.event.AnalysisEventListener; -import com.alibaba.excel.exception.ExcelCommonException; -import com.alibaba.excel.util.DateUtils; import com.alibaba.fastjson.JSON; /** * @author zhuangjiaju */ -public class AnnotationDataListener extends AnalysisEventListener { +public class CompatibilityDataListener extends AnalysisEventListener> { private static final Logger LOGGER = LoggerFactory.getLogger(AnnotationDataListener.class); - List list = new ArrayList(); + List> list = new ArrayList>(); @Override - public void invoke(AnnotationData data, AnalysisContext context) { + public void invoke(List data, AnalysisContext context) { list.add(data); } @Override public void doAfterAllAnalysed(AnalysisContext context) { - Assert.assertEquals(list.size(), 1); - AnnotationData data = list.get(0); - try { - Assert.assertEquals(data.getDate(), DateUtils.parseDate("2020-01-01 01:01:01")); - } catch (ParseException e) { - throw new ExcelCommonException("Test Exception", e); - } - Assert.assertEquals(data.getNumber(), 99.99, 0.00); + Assert.assertEquals(list.size(), 10); + List data = list.get(0); + Assert.assertEquals(data.get(0), "字符串00"); LOGGER.debug("First row:{}", JSON.toJSONString(list.get(0))); } } 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 9122822..aaab178 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 @@ -1,7 +1,9 @@ package com.alibaba.easyexcel.test.core.compatibility; import java.io.File; +import java.io.FileInputStream; import java.io.FileOutputStream; +import java.io.InputStream; import java.io.OutputStream; import java.util.ArrayList; import java.util.HashMap; @@ -9,16 +11,20 @@ import java.util.List; import java.util.Map; import org.apache.poi.ss.usermodel.IndexedColors; +import org.junit.Assert; import org.junit.BeforeClass; import org.junit.Test; import com.alibaba.easyexcel.test.util.TestFileUtil; import com.alibaba.excel.EasyExcelFactory; +import com.alibaba.excel.ExcelReader; import com.alibaba.excel.ExcelWriter; import com.alibaba.excel.metadata.Font; import com.alibaba.excel.metadata.Sheet; import com.alibaba.excel.metadata.Table; import com.alibaba.excel.metadata.TableStyle; +import com.alibaba.excel.parameter.AnalysisParam; +import com.alibaba.excel.parameter.GenerateParam; /** * @@ -47,8 +53,12 @@ public class CompatibilityDataTest { private void readAndWrite(File file) throws Exception { OutputStream out = new FileOutputStream(file); - ExcelWriter writer = EasyExcelFactory.getWriter(out); - // sheet1 width,string head,stirng data + GenerateParam generateParam = new GenerateParam("", null, out); + generateParam.setSheetName(""); + generateParam.setOutputStream(out); + generateParam.setClazz(null); + ExcelWriter writer = new ExcelWriter(generateParam); + // sheet1 width,string head,string data Sheet sheet1 = new Sheet(1, 3); sheet1.setSheetName("第一个sheet"); Map columnWidth = new HashMap(); @@ -60,8 +70,10 @@ public class CompatibilityDataTest { // sheet2 style,class head Sheet sheet2 = new Sheet(2, 3, CompatibilityData.class, "第二个sheet", null); + sheet2.setStartRow(5); sheet2.setTableStyle(style()); writer.write(data(), sheet2); + writer.merge(8, 8, 0, 1); // sheet3 table Sheet sheet3 = new Sheet(3, 0); @@ -78,8 +90,23 @@ public class CompatibilityDataTest { writer.finish(); out.close(); - // EasyExcelFactory.write(file, AnnotationData.class).sheet().doWrite(data()).finish(); - // EasyExcelFactory.read(file, AnnotationData.class, new AnnotationDataListener()).sheet().doRead().finish(); + InputStream inputStream = new FileInputStream(file); + List data = EasyExcelFactory.read(inputStream, new Sheet(1, 1)); + Assert.assertEquals(data.size(), 1); + List dataList = (List)data.get(0); + Assert.assertEquals(dataList.get(0), "字符串00"); + inputStream.close(); + + inputStream = new FileInputStream(file); + AnalysisParam param = new AnalysisParam(inputStream, null, new Object()); + param.setIn(inputStream); + param.setExcelTypeEnum(null); + param.setCustomContent(null); + ExcelReader excelReader = new ExcelReader(param, new CompatibilityDataListener()); + excelReader.read(new Sheet(2, 6)); + Assert.assertEquals(excelReader.getSheets().size(), 3); + Assert.assertTrue(excelReader.getAnalysisContext() != null); + inputStream.close(); } private List> head() { @@ -96,8 +123,8 @@ public class CompatibilityDataTest { private List> listData() { List> list = new ArrayList>(); List data0 = new ArrayList(); - data0.add("字符串0"); - data0.add(1); + data0.add("字符串00"); + data0.add(11); list.add(data0); return list; } 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 new file mode 100644 index 0000000..8d3b50b --- /dev/null +++ b/src/test/java/com/alibaba/easyexcel/test/core/compatibility/CompatibilityParameterDataTest.java @@ -0,0 +1,143 @@ +package com.alibaba.easyexcel.test.core.compatibility; + +import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.InputStream; +import java.io.OutputStream; +import java.util.ArrayList; +import java.util.List; + +import org.junit.BeforeClass; +import org.junit.Test; + +import com.alibaba.easyexcel.test.util.TestFileUtil; +import com.alibaba.excel.EasyExcelFactory; +import com.alibaba.excel.ExcelReader; +import com.alibaba.excel.ExcelWriter; +import com.alibaba.excel.metadata.Sheet; + +/** + * + * @author zhuangjiaju + */ +public class CompatibilityParameterDataTest { + + private static File file; + + @BeforeClass + public static void init() { + file = TestFileUtil.createNewFile("compatibilityParameter.xlsx"); + } + + @Test + public void T01ReadAndWrite() throws Exception { + readAndWrite1(file); + readAndWrite2(file); + readAndWrite3(file); + readAndWrite4(file); + readAndWrite5(file); + readAndWrite6(file); + } + + private void readAndWrite1(File file) throws Exception { + OutputStream out = new FileOutputStream(file); + ExcelWriter writer = EasyExcelFactory.getWriter(out); + Sheet sheet1 = new Sheet(1, 0); + sheet1.setSheetName("第一个sheet"); + writer.write0(data(), sheet1); + writer.finish(); + out.close(); + + InputStream inputStream = new FileInputStream(file); + EasyExcelFactory.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); + Sheet sheet1 = new Sheet(1, 0); + sheet1.setSheetName("第一个sheet"); + writer.write0(data(), sheet1); + writer.finish(); + out.close(); + + InputStream inputStream = new FileInputStream(file); + EasyExcelFactory.readBySax(inputStream, new Sheet(1, 0), new CompatibilityDataListener()); + inputStream.close(); + } + + private void readAndWrite3(File file) throws Exception { + OutputStream out = new FileOutputStream(file); + ExcelWriter writer = new ExcelWriter(out, null); + Sheet sheet1 = new Sheet(1, 0); + sheet1.setSheetName("第一个sheet"); + writer.write0(data(), sheet1); + writer.finish(); + out.close(); + + InputStream inputStream = new FileInputStream(file); + ExcelReader excelReader = new ExcelReader(inputStream, null, null, new CompatibilityDataListener()); + excelReader.read(new Sheet(1, 0)); + inputStream.close(); + + } + + private void readAndWrite4(File file) throws Exception { + OutputStream out = new FileOutputStream(file); + ExcelWriter writer = new ExcelWriter(null, out, null, null); + Sheet sheet1 = new Sheet(1, 0); + sheet1.setSheetName("第一个sheet"); + writer.write0(data(), sheet1, null); + writer.finish(); + out.close(); + + InputStream inputStream = new FileInputStream(file); + ExcelReader excelReader = new ExcelReader(inputStream, null, new CompatibilityDataListener()); + excelReader.read(new Sheet(1, 0)); + inputStream.close(); + } + + private void readAndWrite5(File file) throws Exception { + OutputStream out = new FileOutputStream(file); + ExcelWriter writer = EasyExcelFactory.getWriterWithTemp(null, out, null, false); + Sheet sheet1 = new Sheet(1, 0); + sheet1.setSheetName("第一个sheet"); + writer.write0(data(), sheet1, null); + writer.finish(); + out.close(); + + InputStream inputStream = new FileInputStream(file); + ExcelReader excelReader = EasyExcelFactory.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); + Sheet sheet1 = new Sheet(1, 0); + sheet1.setSheetName("第一个sheet"); + writer.write0(data(), sheet1, null); + writer.finish(); + out.close(); + + InputStream inputStream = new FileInputStream(file); + ExcelReader excelReader = EasyExcelFactory.getReader(inputStream, new CompatibilityDataListener()); + excelReader.read(new Sheet(1, 0)); + inputStream.close(); + } + + private List data() { + List list = new ArrayList(); + for (int i = 0; i < 10; i++) { + CompatibilityData data = new CompatibilityData(); + data.setString0("字符串0" + i); + data.setString1("字符串1" + i); + list.add(data); + } + return list; + } + +} diff --git a/src/test/java/com/alibaba/easyexcel/test/core/compatibility/CompatibilityReadData.java b/src/test/java/com/alibaba/easyexcel/test/core/compatibility/CompatibilityReadData.java new file mode 100644 index 0000000..931cb00 --- /dev/null +++ b/src/test/java/com/alibaba/easyexcel/test/core/compatibility/CompatibilityReadData.java @@ -0,0 +1,14 @@ +package com.alibaba.easyexcel.test.core.compatibility; + +import com.alibaba.excel.metadata.BaseRowModel; + +import lombok.Data; + +/** + * @author zhuangjiaju + */ +@Data +public class CompatibilityReadData extends BaseRowModel { + private String string0; + private String string1; +} diff --git a/src/test/java/com/alibaba/easyexcel/test/core/exception/ExceptionData.java b/src/test/java/com/alibaba/easyexcel/test/core/exception/ExceptionData.java new file mode 100644 index 0000000..9f2667d --- /dev/null +++ b/src/test/java/com/alibaba/easyexcel/test/core/exception/ExceptionData.java @@ -0,0 +1,14 @@ +package com.alibaba.easyexcel.test.core.exception; + +import com.alibaba.excel.annotation.ExcelProperty; + +import lombok.Data; + +/** + * @author zhuangjiaju + */ +@Data +public class ExceptionData { + @ExcelProperty("姓名") + private String name; +} diff --git a/src/test/java/com/alibaba/easyexcel/test/core/exception/ExceptionDataListener.java b/src/test/java/com/alibaba/easyexcel/test/core/exception/ExceptionDataListener.java new file mode 100644 index 0000000..87a519f --- /dev/null +++ b/src/test/java/com/alibaba/easyexcel/test/core/exception/ExceptionDataListener.java @@ -0,0 +1,48 @@ +package com.alibaba.easyexcel.test.core.exception; + +import java.util.ArrayList; +import java.util.List; + +import org.junit.Assert; +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 zhuangjiaju + */ +public class ExceptionDataListener extends AnalysisEventListener { + private static final Logger LOGGER = LoggerFactory.getLogger(ExceptionData.class); + List list = new ArrayList(); + + @Override + public void onException(Exception exception, AnalysisContext context) { + LOGGER.info("抛出异常,忽略:{}", exception.getMessage()); + } + + @Override + public boolean hasNext(AnalysisContext context) { + return list.size() != 8; + } + + @Override + public void invoke(ExceptionData data, AnalysisContext context) { + list.add(data); + if (list.size() == 5) { + int i = 5 / 0; + } + } + + @Override + public void doAfterAllAnalysed(AnalysisContext context) { + Assert.assertEquals(list.size(), 8); + Assert.assertEquals(list.get(0).getName(), "姓名0"); + Assert.assertEquals((int)(context.readSheetHolder().getSheetNo()), 0); + Assert.assertEquals( + context.readSheetHolder().getExcelReadHeadProperty().getHeadMap().get(0).getHeadNameList().get(0), "姓名"); + LOGGER.debug("First row:{}", JSON.toJSONString(list.get(0))); + } +} 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 new file mode 100644 index 0000000..880e9ab --- /dev/null +++ b/src/test/java/com/alibaba/easyexcel/test/core/exception/ExceptionDataTest.java @@ -0,0 +1,58 @@ +package com.alibaba.easyexcel.test.core.exception; + +import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.util.ArrayList; +import java.util.List; + +import org.junit.BeforeClass; +import org.junit.FixMethodOrder; +import org.junit.Test; +import org.junit.runners.MethodSorters; + +import com.alibaba.easyexcel.test.util.TestFileUtil; +import com.alibaba.excel.EasyExcelFactory; + +/** + * + * @author zhuangjiaju + */ +@FixMethodOrder(MethodSorters.NAME_ASCENDING) +public class ExceptionDataTest { + + private static File file07; + private static File file03; + + @BeforeClass + public static void init() { + file07 = TestFileUtil.createNewFile("simple07.xlsx"); + file03 = TestFileUtil.createNewFile("simple03.xls"); + } + + @Test + public void T01ReadAndWrite07() throws Exception { + readAndWrite(file07); + } + + @Test + public void T02ReadAndWrite03() throws Exception { + readAndWrite(file03); + } + + 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(); + } + + private List data() { + List list = new ArrayList(); + for (int i = 0; i < 10; i++) { + ExceptionData simpleData = new ExceptionData(); + simpleData.setName("姓名" + i); + list.add(simpleData); + } + return list; + } +} diff --git a/src/test/java/com/alibaba/easyexcel/test/core/parameter/ParameterData.java b/src/test/java/com/alibaba/easyexcel/test/core/parameter/ParameterData.java new file mode 100644 index 0000000..e596670 --- /dev/null +++ b/src/test/java/com/alibaba/easyexcel/test/core/parameter/ParameterData.java @@ -0,0 +1,14 @@ +package com.alibaba.easyexcel.test.core.parameter; + +import com.alibaba.excel.annotation.ExcelProperty; + +import lombok.Data; + +/** + * @author zhuangjiaju + */ +@Data +public class ParameterData { + @ExcelProperty("姓名") + private String name; +} diff --git a/src/test/java/com/alibaba/easyexcel/test/core/parameter/ParameterDataListener.java b/src/test/java/com/alibaba/easyexcel/test/core/parameter/ParameterDataListener.java new file mode 100644 index 0000000..5258727 --- /dev/null +++ b/src/test/java/com/alibaba/easyexcel/test/core/parameter/ParameterDataListener.java @@ -0,0 +1,35 @@ +package com.alibaba.easyexcel.test.core.parameter; + +import java.util.ArrayList; +import java.util.List; + +import org.junit.Assert; +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 zhuangjiaju + */ +public class ParameterDataListener extends AnalysisEventListener { + private static final Logger LOGGER = LoggerFactory.getLogger(ParameterDataListener.class); + List list = new ArrayList(); + + @Override + public void invoke(ParameterData data, AnalysisContext context) { + list.add(data); + } + + @Override + public void doAfterAllAnalysed(AnalysisContext context) { + Assert.assertEquals(list.size(), 10); + Assert.assertEquals(list.get(0).getName(), "姓名0"); + Assert.assertEquals((int)(context.readSheetHolder().getSheetNo()), 0); + Assert.assertEquals( + context.readSheetHolder().getExcelReadHeadProperty().getHeadMap().get(0).getHeadNameList().get(0), "姓名"); + LOGGER.debug("First row:{}", JSON.toJSONString(list.get(0))); + } +} 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 new file mode 100644 index 0000000..34d0fad --- /dev/null +++ b/src/test/java/com/alibaba/easyexcel/test/core/parameter/ParameterDataTest.java @@ -0,0 +1,135 @@ +package com.alibaba.easyexcel.test.core.parameter; + +import java.io.File; +import java.io.FileOutputStream; +import java.util.ArrayList; +import java.util.List; + +import org.junit.BeforeClass; +import org.junit.FixMethodOrder; +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.ExcelReader; +import com.alibaba.excel.ExcelWriter; +import com.alibaba.excel.cache.MapCache; +import com.alibaba.excel.converters.string.StringStringConverter; +import com.alibaba.excel.read.metadata.ReadSheet; +import com.alibaba.excel.write.metadata.WriteSheet; +import com.alibaba.excel.write.metadata.WriteTable; + +/** + * + * @author zhuangjiaju + */ +@FixMethodOrder(MethodSorters.NAME_ASCENDING) +public class ParameterDataTest { + + private static File file; + + @BeforeClass + public static void init() { + file = TestFileUtil.createNewFile("parameter07.xlsx"); + } + + @Test + public void T01ReadAndWrite() throws Exception { + readAndWrite1(); + readAndWrite2(); + readAndWrite3(); + readAndWrite4(); + readAndWrite5(); + readAndWrite6(); + readAndWrite7(); + } + + 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(); + } + + private void readAndWrite2() { + EasyExcelFactory.write(file.getPath(), ParameterData.class).sheet().doWrite(data()).finish(); + EasyExcelFactory.read(file.getPath(), ParameterData.class, new ParameterDataListener()).sheet().doRead() + .finish(); + } + + 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(); + } + + 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(); + } + + private void readAndWrite5() throws Exception { + ExcelWriter excelWriter = EasyExcelFactory.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(); + excelWriter.write(data(), writeSheet, writeTable); + excelWriter.finish(); + + ExcelReader excelReader = + EasyExcelFactory.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) + .headRowNumber(1).sheetNo(0).sheetName("0").build(); + excelReader.read(readSheet); + excelReader.finish(); + + excelReader = EasyExcelFactory.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) + .relativeHeadRowIndex(0).build(); + WriteSheet writeSheet = EasyExcelFactory.writerSheet(0).relativeHeadRowIndex(0).needHead(Boolean.FALSE).build(); + WriteTable writeTable = EasyExcelFactory.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) + .mandatoryUseInputStream(Boolean.FALSE).autoCloseStream(Boolean.TRUE).readCache(new MapCache()).build(); + ReadSheet readSheet = EasyExcelFactory.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) + .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() + .registerConverter(new StringStringConverter()).needHead(Boolean.FALSE).table(0).needHead(Boolean.TRUE) + .doWrite(data()).finish(); + EasyExcelFactory.read(file.getPath()).head(ParameterData.class) + .registerReadListener(new ParameterDataListener()).sheet().registerConverter(new StringStringConverter()) + .doRead().finish(); + } + + private List data() { + List list = new ArrayList(); + for (int i = 0; i < 10; i++) { + ParameterData simpleData = new ParameterData(); + simpleData.setName("姓名" + i); + list.add(simpleData); + } + return list; + } +} 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 446d68c..a424730 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 @@ -70,7 +70,7 @@ 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).build(); + WriteTable writeTable = EasyExcelFactory.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(); 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 37e6659..823dff6 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 @@ -4,8 +4,12 @@ import java.io.File; import java.util.ArrayList; import java.util.List; +import org.apache.poi.ss.usermodel.BorderStyle; import org.apache.poi.ss.usermodel.FillPatternType; +import org.apache.poi.ss.usermodel.Font; +import org.apache.poi.ss.usermodel.HorizontalAlignment; import org.apache.poi.ss.usermodel.IndexedColors; +import org.apache.poi.ss.usermodel.VerticalAlignment; import org.junit.BeforeClass; import org.junit.FixMethodOrder; import org.junit.Test; @@ -13,8 +17,12 @@ import org.junit.runners.MethodSorters; import com.alibaba.easyexcel.test.util.TestFileUtil; import com.alibaba.excel.EasyExcelFactory; +import com.alibaba.excel.metadata.Head; +import com.alibaba.excel.write.merge.LoopMergeStrategy; +import com.alibaba.excel.write.merge.OnceAbsoluteMergeStrategy; import com.alibaba.excel.write.metadata.style.WriteCellStyle; import com.alibaba.excel.write.metadata.style.WriteFont; +import com.alibaba.excel.write.style.AbstractVerticalCellStyleStrategy; import com.alibaba.excel.write.style.HorizontalCellStyleStrategy; import com.alibaba.excel.write.style.column.SimpleColumnWidthStyleStrategy; import com.alibaba.excel.write.style.row.SimpleRowHeightStyleStrategy; @@ -45,6 +53,70 @@ public class StyleDataTest { readAndWrite(file03); } + @Test + public void T03AbstractVerticalCellStyleStrategy() { + AbstractVerticalCellStyleStrategy verticalCellStyleStrategy = new AbstractVerticalCellStyleStrategy() { + @Override + protected WriteCellStyle headCellStyle(Head head) { + WriteCellStyle writeCellStyle = new WriteCellStyle(); + writeCellStyle.setFillPatternType(FillPatternType.SOLID_FOREGROUND); + writeCellStyle.setDataFormat((short)0); + writeCellStyle.setHidden(false); + writeCellStyle.setLocked(true); + writeCellStyle.setQuotePrefix(true); + writeCellStyle.setHorizontalAlignment(HorizontalAlignment.CENTER); + writeCellStyle.setWrapped(true); + writeCellStyle.setVerticalAlignment(VerticalAlignment.CENTER); + writeCellStyle.setRotation((short)0); + writeCellStyle.setIndent((short)10); + writeCellStyle.setBorderLeft(BorderStyle.THIN); + writeCellStyle.setBorderRight(BorderStyle.THIN); + writeCellStyle.setBorderTop(BorderStyle.THIN); + writeCellStyle.setBorderBottom(BorderStyle.THIN); + writeCellStyle.setLeftBorderColor(IndexedColors.RED.getIndex()); + writeCellStyle.setRightBorderColor(IndexedColors.RED.getIndex()); + writeCellStyle.setTopBorderColor(IndexedColors.RED.getIndex()); + writeCellStyle.setBottomBorderColor(IndexedColors.RED.getIndex()); + writeCellStyle.setFillBackgroundColor(IndexedColors.RED.getIndex()); + writeCellStyle.setShrinkToFit(Boolean.TRUE); + + if (head.getColumnIndex() == 0) { + writeCellStyle.setFillForegroundColor(IndexedColors.YELLOW.getIndex()); + WriteFont writeFont = new WriteFont(); + writeFont.setItalic(true); + writeFont.setStrikeout(true); + writeFont.setTypeOffset(Font.SS_NONE); + writeFont.setUnderline(Font.U_DOUBLE); + writeFont.setBold(true); + writeFont.setCharset((int)Font.DEFAULT_CHARSET); + } else { + writeCellStyle.setFillForegroundColor(IndexedColors.BLUE.getIndex()); + } + return writeCellStyle; + } + + @Override + protected WriteCellStyle contentCellStyle(Head head) { + WriteCellStyle writeCellStyle = new WriteCellStyle(); + writeCellStyle.setFillPatternType(FillPatternType.SOLID_FOREGROUND); + if (head.getColumnIndex() == 0) { + writeCellStyle.setFillForegroundColor(IndexedColors.DARK_GREEN.getIndex()); + } else { + writeCellStyle.setFillForegroundColor(IndexedColors.PINK.getIndex()); + } + return writeCellStyle; + } + }; + EasyExcelFactory.write(file07, StyleData.class).registerWriteHandler(verticalCellStyleStrategy).sheet() + .doWrite(data()).finish(); + } + + @Test + public void T04LoopMergeStrategy() { + EasyExcelFactory.write(file07, StyleData.class).sheet().registerWriteHandler(new LoopMergeStrategy(2, 1)) + .doWrite(data10()).finish(); + } + private void readAndWrite(File file) { SimpleColumnWidthStyleStrategy simpleColumnWidthStyleStrategy = new SimpleColumnWidthStyleStrategy(50); SimpleRowHeightStyleStrategy simpleRowHeightStyleStrategy = @@ -63,9 +135,11 @@ public class StyleDataTest { headWriteCellStyle.setWriteFont(contentWriteFont); HorizontalCellStyleStrategy horizontalCellStyleStrategy = new HorizontalCellStyleStrategy(headWriteCellStyle, contentWriteCellStyle); + + OnceAbsoluteMergeStrategy onceAbsoluteMergeStrategy = new OnceAbsoluteMergeStrategy(2, 2, 0, 1); EasyExcelFactory.write(file, StyleData.class).registerWriteHandler(simpleColumnWidthStyleStrategy) .registerWriteHandler(simpleRowHeightStyleStrategy).registerWriteHandler(horizontalCellStyleStrategy) - .sheet().doWrite(data()).finish(); + .registerWriteHandler(onceAbsoluteMergeStrategy).sheet().doWrite(data()).finish(); EasyExcelFactory.read(file, StyleData.class, new StyleDataListener()).sheet().doRead().finish(); } @@ -81,4 +155,15 @@ public class StyleDataTest { list.add(data1); return list; } + + private List data10() { + List list = new ArrayList(); + for (int i = 0; i < 10; i++) { + StyleData data = new StyleData(); + data.setString("字符串0"); + data.setString1("字符串01"); + list.add(data); + } + return list; + } } diff --git a/src/test/java/com/alibaba/easyexcel/test/listen/AfterExcelWriteHandlerImpl.java b/src/test/java/com/alibaba/easyexcel/test/listen/AfterExcelWriteHandlerImpl.java deleted file mode 100644 index a83c282..0000000 --- a/src/test/java/com/alibaba/easyexcel/test/listen/AfterExcelWriteHandlerImpl.java +++ /dev/null @@ -1,59 +0,0 @@ -package com.alibaba.easyexcel.test.listen; - -import com.alibaba.excel.event.WriteHandler; -import org.apache.poi.ss.usermodel.*; -import org.apache.poi.xssf.usermodel.XSSFClientAnchor; -import org.apache.poi.xssf.usermodel.XSSFRichTextString; - -public class AfterExcelWriteHandlerImpl implements WriteHandler { - - // - CellStyle cellStyle; - - @Override - public void sheet(int sheetNo, Sheet sheet) { - Workbook workbook = sheet.getWorkbook(); - //要锁定单元格需先为此表单设置保护密码,设置之后此表单默认为所有单元格锁定,可使用setLocked(false)为指定单元格设置不锁定。 - //设置表单保护密码 - sheet.protectSheet("your password"); - //创建样式 - cellStyle = workbook.createCellStyle(); - //设置是否锁 - cellStyle.setLocked(false); - - } - - @Override - public void row(int rowNum, Row row) { - Workbook workbook = row.getSheet().getWorkbook(); - //设置行高 - row.setHeight((short)20); - } - - @Override - public void cell(int cellNum, Cell cell) { - Workbook workbook = cell.getSheet().getWorkbook(); - Sheet currentSheet = cell.getSheet(); - if (cellNum == 4 && cell.getRowIndex() == 30) { - //设置样式 - //注意:样式最好采用公用样式,样式在创建sheet后创建,如果有多个样式也需要在创建sheet时候创建后面直接使用,不要每个Cell Create 一个样式,不然会导致报错 The maximum number - // of Cell Styles was exceeded. - cell.setCellStyle(cellStyle); - - - - //设置备注 - Drawing draw = currentSheet.createDrawingPatriarch(); - Comment comment = draw.createCellComment(new XSSFClientAnchor(0, 0, 0, 0, 4, 25, 9, 30)); - XSSFRichTextString rtf = new XSSFRichTextString("添加批注内容收到货死的死哦多胡搜idsad是否会杜甫的范德萨发!1111"); - Font commentFormatter = workbook.createFont(); - commentFormatter.setFontName("宋体"); - //设置字体大小 - commentFormatter.setFontHeightInPoints((short)9); - rtf.applyFont(commentFormatter); - comment.setString(rtf); - comment.setAuthor("ceshi"); - cell.setCellComment(comment); - } - } -} diff --git a/src/test/java/com/alibaba/easyexcel/test/listen/ExcelListener.java b/src/test/java/com/alibaba/easyexcel/test/listen/ExcelListener.java deleted file mode 100644 index 0f17a39..0000000 --- a/src/test/java/com/alibaba/easyexcel/test/listen/ExcelListener.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.alibaba.easyexcel.test.listen; - -import com.alibaba.excel.context.AnalysisContext; -import com.alibaba.excel.event.AnalysisEventListener; - -import java.util.ArrayList; -import java.util.List; - -public class ExcelListener extends AnalysisEventListener { - - - private List data = new ArrayList(); - - @Override - public void invoke(Object object, AnalysisContext context) { - System.out.println(context.getCurrentSheet()); - data.add(object); - if(data.size()>=100){ - doSomething(); - data = new ArrayList(); - } - } - - @Override - public void doAfterAllAnalysed(AnalysisContext context) { - doSomething(); - } - public void doSomething(){ - for (Object o:data) { - System.out.println(o); - } - } -} diff --git a/src/test/java/com/alibaba/easyexcel/test/model/BaseReadModel.java b/src/test/java/com/alibaba/easyexcel/test/model/BaseReadModel.java deleted file mode 100644 index be65aa7..0000000 --- a/src/test/java/com/alibaba/easyexcel/test/model/BaseReadModel.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.alibaba.easyexcel.test.model; - -import com.alibaba.excel.annotation.ExcelProperty; -import com.alibaba.excel.metadata.BaseRowModel; - -public class BaseReadModel extends BaseRowModel { - @ExcelProperty(index = 0) - protected String str; - - @ExcelProperty(index = 1) - protected Float ff; - public String getStr() { - return str; - } - - - public void setStr(String str) { - this.str = str; - } - - public Float getFf() { - return ff; - } - - public void setFf(Float ff) { - this.ff = ff; - } -} diff --git a/src/test/java/com/alibaba/easyexcel/test/model/BaseWriteModel.java b/src/test/java/com/alibaba/easyexcel/test/model/BaseWriteModel.java deleted file mode 100644 index 8688216..0000000 --- a/src/test/java/com/alibaba/easyexcel/test/model/BaseWriteModel.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.alibaba.easyexcel.test.model; - -import com.alibaba.excel.annotation.ExcelProperty; -import com.alibaba.excel.metadata.BaseRowModel; - -public class BaseWriteModel extends BaseRowModel { - @ExcelProperty(value = {"表头1","表头1","表头31"},index = 0) - protected String p1; - - @ExcelProperty(value = {"表头1","表头1","表头32"},index = 1) - protected String p2; - - public String getP1() { - return p1; - } - - public void setP1(String p1) { - this.p1 = p1; - } - - public String getP2() { - return p2; - } - - public void setP2(String p2) { - this.p2 = p2; - } -} diff --git a/src/test/java/com/alibaba/easyexcel/test/model/ReadModel.java b/src/test/java/com/alibaba/easyexcel/test/model/ReadModel.java deleted file mode 100644 index fe90171..0000000 --- a/src/test/java/com/alibaba/easyexcel/test/model/ReadModel.java +++ /dev/null @@ -1,114 +0,0 @@ -package com.alibaba.easyexcel.test.model; - -import com.alibaba.excel.annotation.ExcelProperty; - -import java.math.BigDecimal; -import java.util.Date; - -public class ReadModel extends BaseReadModel { - - @ExcelProperty(index = 2) - private Integer mm; - - @ExcelProperty(index = 3) - private BigDecimal money; - - @ExcelProperty(index = 4) - private Long times; - - @ExcelProperty(index = 5) - private Double activityCode; - - @ExcelProperty(index = 6,format = "yyyy-MM-dd") - private Date date; - - @ExcelProperty(index = 7) - private String lx; - - @ExcelProperty(index = 8) - private String name; - - @ExcelProperty(index = 18) - private String kk; - - - public Integer getMm() { - return mm; - } - - public void setMm(Integer mm) { - this.mm = mm; - } - - public BigDecimal getMoney() { - return money; - } - - public void setMoney(BigDecimal money) { - this.money = money; - } - - public Long getTimes() { - return times; - } - - public void setTimes(Long times) { - this.times = times; - } - - public Double getActivityCode() { - return activityCode; - } - - public void setActivityCode(Double activityCode) { - this.activityCode = activityCode; - } - - public Date getDate() { - return date; - } - - public void setDate(Date date) { - this.date = date; - } - - public String getLx() { - return lx; - } - - public void setLx(String lx) { - this.lx = lx; - } - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - - public String getKk() { - return kk; - } - - public void setKk(String kk) { - this.kk = kk; - } - - @Override - public String toString() { - return "JavaModel{" + - "str='" + str + '\'' + - ", ff=" + ff + - ", mm=" + mm + - ", money=" + money + - ", times=" + times + - ", activityCode=" + activityCode + - ", date=" + date + - ", lx='" + lx + '\'' + - ", name='" + name + '\'' + - ", kk='" + kk + '\'' + - '}'; - } -} diff --git a/src/test/java/com/alibaba/easyexcel/test/model/ReadModel2.java b/src/test/java/com/alibaba/easyexcel/test/model/ReadModel2.java deleted file mode 100644 index a64f701..0000000 --- a/src/test/java/com/alibaba/easyexcel/test/model/ReadModel2.java +++ /dev/null @@ -1,136 +0,0 @@ -package com.alibaba.easyexcel.test.model; - -import com.alibaba.excel.annotation.ExcelProperty; -import com.alibaba.excel.metadata.BaseRowModel; - -import java.math.BigDecimal; -import java.util.Date; - -public class ReadModel2 extends BaseRowModel { - @ExcelProperty(index = 0) - private String str; - - @ExcelProperty(index = 1) - private Float ff; - - @ExcelProperty(index = 2) - private Integer mm; - - @ExcelProperty(index = 3) - private BigDecimal money; - - @ExcelProperty(index = 4) - private Long times; - - @ExcelProperty(index = 5) - private Double activityCode; - - @ExcelProperty(index = 6,format = "yyyy-MM-dd") - private Date date; - - @ExcelProperty(index = 7) - private String lx; - - @ExcelProperty(index = 8) - private String name; - - @ExcelProperty(index = 18) - private String kk; - - public String getStr() { - return str; - } - - - public void setStr(String str) { - this.str = str; - } - - public Float getFf() { - return ff; - } - - public void setFf(Float ff) { - this.ff = ff; - } - - public Integer getMm() { - return mm; - } - - public void setMm(Integer mm) { - this.mm = mm; - } - - public BigDecimal getMoney() { - return money; - } - - public void setMoney(BigDecimal money) { - this.money = money; - } - - public Long getTimes() { - return times; - } - - public void setTimes(Long times) { - this.times = times; - } - - public Double getActivityCode() { - return activityCode; - } - - public void setActivityCode(Double activityCode) { - this.activityCode = activityCode; - } - - public Date getDate() { - return date; - } - - public void setDate(Date date) { - this.date = date; - } - - public String getLx() { - return lx; - } - - public void setLx(String lx) { - this.lx = lx; - } - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - - public String getKk() { - return kk; - } - - public void setKk(String kk) { - this.kk = kk; - } - - @Override - public String toString() { - return "JavaModel2{" + - "str='" + str + '\'' + - ", ff=" + ff + - ", mm=" + mm + - ", money=" + money + - ", times=" + times + - ", activityCode=" + activityCode + - ", date=" + date + - ", lx='" + lx + '\'' + - ", name='" + name + '\'' + - ", kk='" + kk + '\'' + - '}'; - } -} diff --git a/src/test/java/com/alibaba/easyexcel/test/model/WriteModel.java b/src/test/java/com/alibaba/easyexcel/test/model/WriteModel.java deleted file mode 100644 index c3e306b..0000000 --- a/src/test/java/com/alibaba/easyexcel/test/model/WriteModel.java +++ /dev/null @@ -1,131 +0,0 @@ -package com.alibaba.easyexcel.test.model; - -import com.alibaba.excel.annotation.ExcelProperty; - -import java.math.BigDecimal; -import java.util.Date; - -public class WriteModel extends BaseWriteModel { - - - - @ExcelProperty(value = {"表头3","表头3","表头3"},index = 2) - private int p3; - - @ExcelProperty(value = {"表头1","表头4","表头4"},index = 3) - private long p4; - - @ExcelProperty(value = {"表头5","表头51","表头52"},index = 4) - private String p5; - - @ExcelProperty(value = {"表头6","表头61","表头611"},index = 5) - private float p6; - - @ExcelProperty(value = {"表头6","表头61","表头612"},index = 6) - private BigDecimal p7; - - @ExcelProperty(value = {"表头6","表头62","表头621"},index = 7, format = "yyyy-MM-dd") - private Date p8; - - @ExcelProperty(value = {"表头6","表头62","表头622"},index = 8) - private String p9; - - @ExcelProperty(value = {"表头6","表头62","表头622"},index = 9) - private double p10; - - public String getP1() { - return p1; - } - - public void setP1(String p1) { - this.p1 = p1; - } - - public String getP2() { - return p2; - } - - public void setP2(String p2) { - this.p2 = p2; - } - - public int getP3() { - return p3; - } - - public void setP3(int p3) { - this.p3 = p3; - } - - public long getP4() { - return p4; - } - - public void setP4(long p4) { - this.p4 = p4; - } - - public String getP5() { - return p5; - } - - public void setP5(String p5) { - this.p5 = p5; - } - - public float getP6() { - return p6; - } - - public void setP6(float p6) { - this.p6 = p6; - } - - public BigDecimal getP7() { - return p7; - } - - public void setP7(BigDecimal p7) { - this.p7 = p7; - } - - public Date getP8() { - return p8; - } - - public void setP8(Date p8) { - this.p8 = p8; - } - - public String getP9() { - return p9; - } - - public void setP9(String p9) { - this.p9 = p9; - } - - public double getP10() { - return p10; - } - - public void setP10(double p10) { - this.p10 = p10; - } - - @Override - public String toString() { - return "JavaModel1{" + - "p1='" + p1 + '\'' + - ", p2='" + p2 + '\'' + - ", p3=" + p3 + - ", p4=" + p4 + - ", p5='" + p5 + '\'' + - ", p6=" + p6 + - ", p7=" + p7 + - ", p8=" + p8 + - ", p9='" + p9 + '\'' + - ", p10=" + p10 + - '}'; - } -} diff --git a/src/test/java/com/alibaba/easyexcel/test/util/DataUtil.java b/src/test/java/com/alibaba/easyexcel/test/util/DataUtil.java deleted file mode 100644 index 505dab5..0000000 --- a/src/test/java/com/alibaba/easyexcel/test/util/DataUtil.java +++ /dev/null @@ -1,93 +0,0 @@ -package com.alibaba.easyexcel.test.util; - -import com.alibaba.easyexcel.test.model.WriteModel; -import com.alibaba.excel.metadata.Font; -import com.alibaba.excel.metadata.TableStyle; -import org.apache.poi.ss.usermodel.IndexedColors; - -import java.math.BigDecimal; -import java.util.ArrayList; -import java.util.Date; -import java.util.List; - -public class DataUtil { - - - public static List> createTestListObject() { - List> object = new ArrayList>(); - for (int i = 0; i < 1000; i++) { - List da = new ArrayList(); - da.add("字符串"+i); - da.add(Long.valueOf(187837834l+i)); - da.add(Integer.valueOf(2233+i)); - da.add(Double.valueOf(2233.00+i)); - da.add(Float.valueOf(2233.0f+i)); - da.add(new Date()); - da.add(new BigDecimal("3434343433554545"+i)); - da.add(Short.valueOf((short)i)); - object.add(da); - } - return object; - } - - public static List> createTestListStringHead(){ - //写sheet3 模型上没有注解,表头数据动态传入 - List> head = new ArrayList>(); - List headCoulumn1 = new ArrayList(); - List headCoulumn2 = new ArrayList(); - List headCoulumn3 = new ArrayList(); - List headCoulumn4 = new ArrayList(); - List headCoulumn5 = new ArrayList(); - - headCoulumn1.add("第一列");headCoulumn1.add("第一列");headCoulumn1.add("第一列"); - headCoulumn2.add("第一列");headCoulumn2.add("第一列");headCoulumn2.add("第一列"); - - headCoulumn3.add("第二列");headCoulumn3.add("第二列");headCoulumn3.add("第二列"); - headCoulumn4.add("第三列");headCoulumn4.add("第三列2");headCoulumn4.add("第三列2"); - headCoulumn5.add("第一列");headCoulumn5.add("第3列");headCoulumn5.add("第4列"); - - head.add(headCoulumn1); - head.add(headCoulumn2); - head.add(headCoulumn3); - head.add(headCoulumn4); - head.add(headCoulumn5); - return head; - } - - public static List createTestListJavaMode(){ - List model1s = new ArrayList(); - for (int i = 0; i <10000 ; i++) { - WriteModel model1 = new WriteModel(); - model1.setP1("第一列,第行"); - model1.setP2("121212jjj"); - model1.setP3(33+i); - model1.setP4(44); - model1.setP5("555"); - model1.setP6(666.2f); - model1.setP7(new BigDecimal("454545656343434"+i)); - model1.setP8(new Date()); - model1.setP9("llll9999>&&&&&6666^^^^"); - model1.setP10(1111.77+i); - model1s.add(model1); - } - return model1s; - } - - public static TableStyle createTableStyle() { - TableStyle tableStyle = new TableStyle(); - Font headFont = new Font(); - headFont.setBold(true); - headFont.setFontHeightInPoints((short)22); - headFont.setFontName("楷体"); - tableStyle.setTableHeadFont(headFont); - tableStyle.setTableHeadBackGroundColor(IndexedColors.BLUE); - - Font contentFont = new Font(); - contentFont.setBold(true); - contentFont.setFontHeightInPoints((short)22); - contentFont.setFontName("黑体"); - tableStyle.setTableContentFont(contentFont); - tableStyle.setTableContentBackGroundColor(IndexedColors.GREEN); - return tableStyle; - } -} diff --git a/src/test/resources/2003.xls b/src/test/resources/2003.xls deleted file mode 100644 index 3c2fa34d11c842c0d622d3dc3186571b789486cb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 105984 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 D=TWv- diff --git a/src/test/resources/2007.xlsx b/src/test/resources/2007.xlsx deleted file mode 100644 index 1c17101aa5cad9a3fbb63e7f26bc2ba2e8c69811..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 159492 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 diff --git a/src/test/resources/temp.xlsx b/src/test/resources/temp.xlsx deleted file mode 100644 index 2149a2375c48784d2f56dd642cba3f753ec3f980..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11303 zcmeHN1y>yD(jMI1Ex5b8ySoR6;BLVkg1fszaQ6`0g1c*iXCSzLWcS{0ce8tc!M#1_ zbe}oh^~{;KpQozcs#1~#14joy0-yl^05QPZCJoaP1OUi`007Vc(4e}a_I562b}j~L z9u8*CdJOMvZHNlML8x4c9-6_byZz&Uh8d;)JWwRo!nV*b{K6 zm#}MD$7%-mh?R=+UUc*{e-F_?YYem@5%o?%F#3>;LdfuCGduI*iG(1j`lAcXXmVsI z&*y2VI9O}{CF~rD4JljqHLu56V|2@dT%4k(ZZdDOp{-npw=XD?MHfgU{EC|iWX^_Q zOw|ZmZLvnE{CjW507vYQG7$}6-isSU!Z#MES&}kIfFXAyEF4?c@6ymBb7vU1da1y% z_?d&fX3=Ki#{4AzTRQ0j6_A}C2e-E3QfItbcLd!a7vMItlaKLaht!IzfPBw@t|_+ zilwP&Ez6f3*(8;iJr}D(o@CI(g+VLE55?q956~Hu*WNI`tp=GFQ9Z2+t!?4VJ4&3) z^jl0RIYbcrz%6$&la4X$Y;3+6Q-|X_-rIFlCW&!HCX*!BpWbKRG_bS=D+{| zTmUr4dmF~zb>eRCWNmD3Z~Zfn{aZ62uhH!F+5hgNGjY=Dl{16Dpst{4AIAhcvm~Cb zDB&928vup!&Qw1~$~C3EV4`Td&Lp^}40At-j@#k!;2PS)G;t9finjn=R|)`TfCcf`>Y z5p9|d+0Y0@ct251-yUb^NUC8yUZ1Hf(<-~s@PYq4Z&;d0d!^NaexQdAMrasAs4pyh z^i{&sZpJmfA`Ihq6Y3%Nm9VUJ<8!!wV$cs5j?L*;7n=?V03f|mEzgXr=5mKpU~2VmMvAUWY`+{|YmOL7>{Ny8OzSUtW$d?NJZ z-Uh8gCb`0g=T3JRg-l4{MtcWQpd|r6wMfnA5}h);|M{z!UUG=6nLeOD&3uiHR%vgK z4Oc!y%`{7R1#Zm=6V{jbu?|UIsRq2dtJp~)dCtig5wM~gzcEJm@Mch#T;Dg3n~1_K>HDN+5CVyIN>g zl*NU>b|^WsRbNF`1AP!pWMP8&*1*yb{oWO)lYp{9FGbOpFVxU&p<&@hO9&s+iK5)o zjbxDfVv3pa`dsyE=HGThEe(}}hwvIK-6YULLcv`^w28=Chz;Hcr_E8TW0C^pM1O2> zB1+ow7_E5~N!2sHyiAehHyoa7p@+_hk{|X1m&;VvHP^l!gqX+-+TkfWrO5c>IF7Z##E4yM4@M29}=V7 zH|n%_6;5Y`bX}N0iNsd@bhW$UTUzeJ$zkM`o$buAh~!jTGqDpGDK=3Nm2%aJBjS58 z>ez#pI7oHi@)&&zwmXZyw1W&~NH%wd!%J?G_U;fW#U!e^6+vSy^sKdcdFLBHiKbq@ zQ2h~s^2jsr^z>;x_Mu}l8Rff;*SLn6WK6_~j#ZLj=2yG9TmwZhkP&&cGqt((Ny-A; z*aF<-V5^Twrsy##r*zb1(8+-*GChafkcI5pBl8By&w{Vq{=5GysC_}whXMe`iGFSa zeq+Cjg_*4x<8No?pWgFCTQ?Gq6Wy2bQV{;)`z^=r7^?j_`>H7?j5cL)td8zARRs=? z^hPvHK!QNBNPb*OC%TNmy^;(ZJzFEv6XSZq)L866{JWF*1*huFgp_qX%-F~5!b0a5 zfo$&f+llNnPsud6-h>o`Pf9=dv!a&L$YxXgoVlpjycMOAqEO6W?C#*`9^IQaeUC|2 z5>R65pnileiO>rsI5n%&MWDcwItGk8fNsiT$HoUs3ed-J^FVen(`(2S>o7}@op*r` z3xHxmf_ASf{U)1jgr|A-%+>t+rZe26 zBcz41AYrUdi*0tQfiUaa+S!v!nJ+qZD6+2r6mB#i`<2jZ+5AjzBr= zb;sUJBc?JwJ07^m;WYT|VPzNv_VwqQr)(-t?tr+_H`aD=% z6({y7zC(&gR=0If)q$?%PWtPI%bIcarlc=Y%aCR4fXgcS3?VYRRetvoq3ix0k76Du zUvwjI&hvpwkA)0MgXF6SFIi|S-CIbJGWyMv^&dP@?HcQSk{qbb5Cw?4VQD&cox$Hw z2N;q?(N$-+JESBSNN=#bO?U1^M2bq&SZV|ZMOsa(9kpsuE@?kAeXj*hi`$U4k%cj2 zcYI(*TQ&(>haO-p9VZKyJL%X#RzdezOn2$IN$V1wW9^CYwP>nQl2;X;z|4 z&Gd9WOs7m9Y_PW@&({n9frQfyr)Ae0;^PyQ$=>W5IJ*I$$2IoJ*eYW?qcCK5Ej;pr z^TWFjW$eN^Orqcrp^hZ-#y}^<(cadek>5B*b zuIGa%eUqI2Cn2*$cMq3I%8jKT>BurSUjuja@;d}TH!KFhu;)&x))U`00nAanzu?MY z+KtAioO2}tQE*NrEg-A%>+K8`#7jJBI&sjZm}mOh3nLT{7ko-RI)?@=OB>#5=#9^X zfR1=~qE`>*%aW_QROPq>HI7^bT|RbH%7P`GL}DAsy~9&>#a1>z6hY5<7p%XWt~KqV zHLY}%ny(|__!XAP76aq`*Xu3uuCHOjE5f1g@RRmUFiIQKJEN*$C(K@@VD}BZhioIA)5R)KZS}#C&at~qHA=z3st*%O z;(42>Fbc^WpXQa+Pj5i)myEzRjbC6(tLcxtp|zVKL~Ebni0r~U{GO$U)G~A(TRBI8 zFkoA?+QGMCz~D_K*)o1_7h!a47Z}ezCvuUN79%ZGOt^n!kkipPb3kS-M*P=1_annm zi^a}}8SbPQQl3a9w}Ld&oL=_u>MzrZw1n7-%NafS#|(UFAHlAZ71zxP=SQ6(Ex(zU z4A30Sxg;JQ^X?&3{1Bb1rzy63QlNLLwq|HUM4k7L;oF__i2>_jqR;)pBCp-4&==9r zpuF11N(T+EILC2o>ng#;e_l^1IGjD9<0?dVER%hE|81>v{vA|H0H3FWA6Kc$fl_Za zyQI=(F=rgL?Ptt3(gs`<0S{*do#%CxCB*jRT3sskUSHxe$YK#v8%?-VrplBDqqezY zweLMWB!#W`B`w!rt-X1XC*SpBYt}c1#&k2_NHMX}Kjku7^<6#rwC%Ka6MoF}*d!I= zakowuZdf^)gB`c>QiAr(mdIbOa)s^EY1zQLY&R<8Zr%5i#Kmu{SkGIqN4NTF*MdAJ zGx{jepoBz|?51STc`y8+uQB*}RP}z?8|3@Eo9*j%{~y9}x{T1h&g-2YumAw|@8S4o zGU{w$X6E9|_}hi$XH3r0SdGbKLiVYd^Aqw_{2WIMtL-}SjY9q7#|?b~V^E#Xb8ZQG z>Q6T@#Kb*QrcI`t0qMJ}Ie5DxeX<$YP^02sSdg}>L*O$YZ1Bu^k$he_fKhS8WFyUF zMmSefv=|3Q_vd|k!?z6|sFER>OnXJ+liI8^NIqD|h^2mI1Ct+qFGI%nBb(YuVWe3r ziK4_-8;q6QF;oUJwL2sz#0Y;12kx4B+*G>PQiSZpK+KV0!p8Cpvpwl--)93xD+6qR zLc#b>Cys;^VQrqlB+CZ%>;d9N%COVnwqbjdJCk}3LDmxAfkKO_ihiq%@*>tn${Dz^b3W0VeyjQfpwqGt0}@`7uPMU3dRZ(qbpa} zC-K=4j!<~o8h8a!B%j{z?O|UIi^_5dnfW6syhM|CL+i|owE}S9u)*am@?iUj&YbfE z9mC0ZMsHl2&T!lSorb5+K-N7jGJ_L4 zE>d^yXx3oPCQ9D>^fSFI7}9*=R$JGw;jOPz zbl=Ix;HVvJ(vs--1;rhjiW#q-Lba)2h!ZrxcB-Bq7+Wl4TfX zfm)B{A}YV4+S={O?M5;=>5_twg-GR7P>jXAXF&dv=0ixD3=j^?8|csW-0e(@7?`z$~QY zd&Va*=V5-jh@6J#|Xj3)^6ud&DylyB1n5{m;{-JBmHqHhJtOx_U!ms|m(gT456sG)I-_kwGABBoc%U#ud=Y(kS636k0 zhUAd+jCrV1;dFc~})88*V^~K42#55HNx7{!2K8Owo2XW1S zJ$Wm{y5%lj{IqTNy#G+0gX>sE$yX(*_*uC7^a1|M_y!U$0cP5#zG`Na7O?K;t3D>^AfgPv-t1s|>jO9h*oL{)DT_JyEVrQp zCNyAyYOFv%5Z>yyE`Z$^g%>4j~2O~RIDt}#0^>P44suY@2lGsMC!T}pm{#*o0 zbiQCW%T96lC=1k`ve!*(YpeR$JjvuF^tuegKvBcz+d`?K@W4ve#Ei^cbMTu>BU)VR z3!&EQE6epd%J=Ynvn`XI=UKInHznwP1%l24#y0G49{`eB4Sm_z|2s36#jF zC9%E_`M^$FoIDFZ<8+ErFXoey*|d{f2Rf8MI}rIa54qt@m9<`tAe!!2eT{YRINK>J z|IhJI)$`~9`&ECLuT87}5D$Obqh@K0*sU@lcVQg}B6ng=GYp~FK!s;Da-&m4FqmhQ z(2*pRC0wGSKiwdT%QhGH!|a44z4OQ#!iiyP+en63VJdGeD_L^qi_#JwNYJdHe!km% zHjav)Dbh(0QL~B2P3v83c$J?nF`@cInuNbnIrT(SHQJ&&n>o31Oqn)BhTL$1MQbvx z=6piD*{&L<-IfPw3t49`CULxd53=?kbtYUpgLX0f2UCb?w{!^st@1rJSaOzAK)toeo0)E> znztgnMZ_C5?m5 zOx(y{PWojzC$C82CpC0`1X7wdZWkqM)5R~ka0L2BVv917^?KI8cLYT2(O_S^pakD= zKU4jXc(=@&6Bjnfdc>D&Fxo`SvC2Z3@r6Rg1_hm}|D%<0Oh@i#4vwtB+W9#u`zW^v zV(`3=Lhb1uXzpNMGB=nlH9AG2a4+a4cJziP8ZZj<-$OCOxZWDhOa~C~i4Ivz&U(y~ z5a?VU!qfM@A+UCo<2s^KI1uujoMK+NaM5p)3d8i_5sei1d5h9F2T|=1CA)c8XocK& zj<%+Zn#a$Z8*$rxsknqswE`iq7Hj&Ed|+KR;$fGFK{4poCR>CO_LMVfmnx>3xV&u%NkXg)q!2ZB_NMEH<94bXI+7ILa)g@33cB^Cc{^^Pu0uo>#4^i=Cbd}$*%xmgg~rsZ zahv*0Oc5!wgii*C?8S}B@tX?GF^)c*=c5NI1VcPlV6G~W4Qs6yj-JJ@L7wm-^{X|` z_JQqYnv9?{==pFe)wfXtb(k z!dB-(q|CS5YF<|vIc_TyOfxsEIMgvkx8&^b`re3Y>Ow2~+Bo%hk(780WcsXmEAK%j zDhD%VHmyv7{aW_7)Rq+D^sug=tua)v8S$Ae`x9$D%l_cQH=;j8hOTM`Hio@OAY#Zg z)l!kjm5EzFR>_^TMoc%dk|{rZY43#}Jtn3MXXy!Uq?(i#{eeB+7`>a&=)BSS{`uQO zZe!JFaoX|)T*n>4Q&U4+p94~zvuH~K~P2bLi!YTHWgVX zW6U=LR|u&AXN;TPH?dpK*L|8V+-m|Y7aema7FL@Yl8M*2N76XFE-GcbF!0jgx(X;G zs@PiV4_`k8jt>eGthg~q?LyIs9OZ@4go|-l!V-$g3m#iWL zd$zO;-}Em*d?U4nhCku|6jBj!syZCZpvW1>-e+NnYlbcOowY!I7u+_aXcAzNRFEm% zAduYJP8RK0sw-uFhV4hRev!*3_AJ!CPx$k4FMRRR{bFSQ0{5^;MP#ud=|U_uo|5I@STrTO)v{GGww$25!z&?6=9x|qBU2^mgOl~^tAc@*zDaA-_>b)N7iyr zaPT$X+v*c0F5PO4!?mmRhDk|-C%^5?&9^E-m|cd-tgSf13`;SO1BQ{)7E?2v=5$kU zoO2&kZyXQW+;|-MdDC{%`7;$ncoF#h*b!3pjc{XH!)`k9T4VN`THxgc-csqHN_ZGl zd=fFCMTZHshv_|}-G=A*^N`A>C9O)D}-rp%S1Q2)V>sMAZ86#rQPPP>G< zi}R6d0ok~uvE(a677i#=D5v9WY)AuPBCxc6=rA1G@Q)z-WwL2BC*sTE#b-tzshW*? zeUz~gB=rsCdr&szXZaCXK~qIP=~aPgXL6MtR^_)XA`t3F?W=>Q?1-vs7h()_Cz(q? z#eT}$le63%Hc7{yWYg;D;6UM)%&Q5^Z-jf8=ZyYhY3OYzo#M$j6x!iaK02f@=_t+di5hPXT4e)zF}nrklz9_z`go2+Nu z!T~h%Gy5=5QU_zfT~I5{#bF8}h#`t`0I}tZ^?qP#raTq{3pRK5oOgL3jk z#5sUrMU%w++S5`nnzMiv?eUI(xceV@uJgp4tp3V#hu5Af%Aa{|V((=3Kcc^`*}smc z1OwSVCiH<#h;Gplugntl_$jyBuz;ema-+A!0PpC5qP!PT)hKm;F}@n^g|0S%J_= z#k19&yW$#LnfcQQFdCK~YR=DD90S?*9YKao-lJ!xYgM(z3-pi8vM@W(N_1qLD@QXB zWA#b+fzc3&+nW-xz*TsAe`s$3o~=0{(I^Fef@`_NF~|70{nGK z>)(byuLZA;{7*AmzZ(8^a^=s4L$8wv|9Ot(SDatx7ydwkc`aJ~GR^R-@vrUQKa8Q^ z|FIeTE5NS>>puWeUfaq4`t`q+uYX1PwaoSh3I*0bqWo5L`xWKaV!}WP zSCn5jNq?YR68whpw=L7J2)`!pe<0)#{*Lhfsr;{|e@z1ZFa!YNNdbUgQ-WWu|LR)* fZ0$kuC+mMZS|wSCSEc~~@IODVWQCyq`R)Gz3XHg!