From b2102159c76698af03cb7a4c0d94b1ba9a4a7bab Mon Sep 17 00:00:00 2001 From: Jiaju Zhuang Date: Fri, 9 Apr 2021 14:04:54 +0800 Subject: [PATCH] =?UTF-8?q?=E5=88=A0=E9=99=A4=E9=9B=86=E5=90=88=E5=B7=A5?= =?UTF-8?q?=E5=85=B7=E7=B1=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 2 +- .../excel/analysis/ExcelAnalyserImpl.java | 2 +- .../excel/analysis/v07/XlsxSaxAnalyser.java | 2 +- .../analysis/v07/handlers/RowTagHandler.java | 11 +++---- .../java/com/alibaba/excel/cache/Ehcache.java | 30 ++++++++++-------- .../metadata/property/ExcelHeadProperty.java | 2 +- .../alibaba/excel/util/CollectionUtils.java | 22 ------------- .../write/executor/ExcelWriteAddExecutor.java | 2 +- .../executor/ExcelWriteFillExecutor.java | 19 ++++++----- .../metadata/holder/AbstractWriteHolder.java | 2 +- .../LongestMatchColumnWidthStyleStrategy.java | 2 +- .../easyexcel/test/demo/fill/FillTest.java | 18 ----------- src/test/resources/demo/fill/no_variable.xlsx | Bin 9946 -> 0 bytes 13 files changed, 37 insertions(+), 77 deletions(-) delete mode 100644 src/main/java/com/alibaba/excel/util/CollectionUtils.java delete mode 100644 src/test/resources/demo/fill/no_variable.xlsx diff --git a/pom.xml b/pom.xml index d03e18d1..01efe344 100644 --- a/pom.xml +++ b/pom.xml @@ -179,7 +179,7 @@ com.alibaba.p3c p3c-pmd - 2.1.1 + 1.3.6 diff --git a/src/main/java/com/alibaba/excel/analysis/ExcelAnalyserImpl.java b/src/main/java/com/alibaba/excel/analysis/ExcelAnalyserImpl.java index 5487ee10..e049dbfc 100644 --- a/src/main/java/com/alibaba/excel/analysis/ExcelAnalyserImpl.java +++ b/src/main/java/com/alibaba/excel/analysis/ExcelAnalyserImpl.java @@ -3,6 +3,7 @@ package com.alibaba.excel.analysis; import java.io.InputStream; import java.util.List; +import org.apache.commons.collections4.CollectionUtils; import org.apache.poi.hssf.record.crypto.Biff8EncryptionKey; import org.apache.poi.poifs.crypt.Decryptor; import org.apache.poi.poifs.filesystem.DocumentFactoryHelper; @@ -26,7 +27,6 @@ import com.alibaba.excel.read.metadata.holder.ReadWorkbookHolder; import com.alibaba.excel.read.metadata.holder.xls.XlsReadWorkbookHolder; import com.alibaba.excel.read.metadata.holder.xlsx.XlsxReadWorkbookHolder; import com.alibaba.excel.support.ExcelTypeEnum; -import com.alibaba.excel.util.CollectionUtils; import com.alibaba.excel.util.DateUtils; import com.alibaba.excel.util.FileUtils; import com.alibaba.excel.util.NumberDataFormatterUtils; 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 a0a9af0e..dbe4e3ab 100644 --- a/src/main/java/com/alibaba/excel/analysis/v07/XlsxSaxAnalyser.java +++ b/src/main/java/com/alibaba/excel/analysis/v07/XlsxSaxAnalyser.java @@ -12,6 +12,7 @@ import java.util.UUID; import javax.xml.parsers.SAXParser; import javax.xml.parsers.SAXParserFactory; +import org.apache.commons.collections4.CollectionUtils; import org.apache.poi.openxml4j.opc.OPCPackage; import org.apache.poi.openxml4j.opc.PackageAccess; import org.apache.poi.openxml4j.opc.PackagePart; @@ -37,7 +38,6 @@ import com.alibaba.excel.exception.ExcelAnalysisException; import com.alibaba.excel.metadata.CellExtra; import com.alibaba.excel.read.metadata.ReadSheet; import com.alibaba.excel.read.metadata.holder.xlsx.XlsxReadWorkbookHolder; -import com.alibaba.excel.util.CollectionUtils; import com.alibaba.excel.util.FileUtils; import com.alibaba.excel.util.SheetUtils; import com.alibaba.excel.util.StringUtils; diff --git a/src/main/java/com/alibaba/excel/analysis/v07/handlers/RowTagHandler.java b/src/main/java/com/alibaba/excel/analysis/v07/handlers/RowTagHandler.java index 877c6a5f..37965254 100644 --- a/src/main/java/com/alibaba/excel/analysis/v07/handlers/RowTagHandler.java +++ b/src/main/java/com/alibaba/excel/analysis/v07/handlers/RowTagHandler.java @@ -2,17 +2,17 @@ package com.alibaba.excel.analysis.v07.handlers; import java.util.LinkedHashMap; -import org.xml.sax.Attributes; - import com.alibaba.excel.constant.ExcelXmlConstants; import com.alibaba.excel.context.xlsx.XlsxReadContext; import com.alibaba.excel.enums.RowTypeEnum; import com.alibaba.excel.metadata.Cell; import com.alibaba.excel.read.metadata.holder.ReadRowHolder; import com.alibaba.excel.read.metadata.holder.xlsx.XlsxReadSheetHolder; -import com.alibaba.excel.util.CollectionUtils; import com.alibaba.excel.util.PositionUtils; +import org.apache.commons.collections4.MapUtils; +import org.xml.sax.Attributes; + /** * Cell Handler * @@ -40,13 +40,12 @@ public class RowTagHandler extends AbstractXlsxTagHandler { @Override public void endElement(XlsxReadContext xlsxReadContext, String name) { XlsxReadSheetHolder xlsxReadSheetHolder = xlsxReadContext.xlsxReadSheetHolder(); - RowTypeEnum rowType = - CollectionUtils.isEmpty(xlsxReadSheetHolder.getCellMap()) ? RowTypeEnum.EMPTY : RowTypeEnum.DATA; + RowTypeEnum rowType = MapUtils.isEmpty(xlsxReadSheetHolder.getCellMap()) ? RowTypeEnum.EMPTY : RowTypeEnum.DATA; xlsxReadContext.readRowHolder(new ReadRowHolder(xlsxReadSheetHolder.getRowIndex(), rowType, xlsxReadSheetHolder.getGlobalConfiguration(), xlsxReadSheetHolder.getCellMap())); xlsxReadContext.analysisEventProcessor().endRow(xlsxReadContext); xlsxReadSheetHolder.setColumnIndex(null); - xlsxReadSheetHolder.setCellMap(new LinkedHashMap()); + xlsxReadSheetHolder.setCellMap(new LinkedHashMap<>()); } } diff --git a/src/main/java/com/alibaba/excel/cache/Ehcache.java b/src/main/java/com/alibaba/excel/cache/Ehcache.java index 4e757fcd..f5bc5ff6 100644 --- a/src/main/java/com/alibaba/excel/cache/Ehcache.java +++ b/src/main/java/com/alibaba/excel/cache/Ehcache.java @@ -2,8 +2,11 @@ package com.alibaba.excel.cache; import java.io.File; import java.util.HashMap; +import java.util.Map; import java.util.UUID; +import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.collections4.MapUtils; import org.ehcache.CacheManager; import org.ehcache.config.CacheConfiguration; import org.ehcache.config.builders.CacheConfigurationBuilder; @@ -14,7 +17,6 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.alibaba.excel.context.AnalysisContext; -import com.alibaba.excel.util.CollectionUtils; import com.alibaba.excel.util.FileUtils; /** @@ -32,11 +34,11 @@ public class Ehcache implements ReadCache { * Key index */ private int index = 0; - private HashMap dataMap = new HashMap(BATCH_COUNT * 4 / 3 + 1); - private static CacheManager fileCacheManager; - private static CacheConfiguration fileCacheConfiguration; - private static CacheManager activeCacheManager; - private CacheConfiguration activeCacheConfiguration; + private HashMap dataMap = new HashMap<>(BATCH_COUNT * 4 / 3 + 1); + private static final CacheManager FILE_CACHE_MANAGER; + private static final CacheConfiguration FILE_CACHE_CONFIGURATION; + private static final CacheManager ACTIVE_CACHE_MANAGER; + private final CacheConfiguration activeCacheConfiguration; /** * Bulk storage data */ @@ -61,10 +63,10 @@ public class Ehcache implements ReadCache { static { File cacheFile = FileUtils.createCacheTmpFile(); - fileCacheManager = + FILE_CACHE_MANAGER = CacheManagerBuilder.newCacheManagerBuilder().with(CacheManagerBuilder.persistence(cacheFile)).build(true); - activeCacheManager = CacheManagerBuilder.newCacheManagerBuilder().build(true); - fileCacheConfiguration = CacheConfigurationBuilder + ACTIVE_CACHE_MANAGER = CacheManagerBuilder.newCacheManagerBuilder().build(true); + FILE_CACHE_CONFIGURATION = CacheConfigurationBuilder .newCacheConfigurationBuilder(Integer.class, HashMap.class, ResourcePoolsBuilder.newResourcePoolsBuilder().disk(10, MemoryUnit.GB)) .withSizeOfMaxObjectGraph(1000 * 1000L).withSizeOfMaxObjectSize(10, MemoryUnit.GB).build(); @@ -73,8 +75,8 @@ public class Ehcache implements ReadCache { @Override public void init(AnalysisContext analysisContext) { cacheAlias = UUID.randomUUID().toString(); - fileCache = fileCacheManager.createCache(cacheAlias, fileCacheConfiguration); - activeCache = activeCacheManager.createCache(cacheAlias, activeCacheConfiguration); + fileCache = FILE_CACHE_MANAGER.createCache(cacheAlias, FILE_CACHE_CONFIGURATION); + activeCache = ACTIVE_CACHE_MANAGER.createCache(cacheAlias, activeCacheConfiguration); } @Override @@ -113,7 +115,7 @@ public class Ehcache implements ReadCache { @Override public void putFinished() { - if (CollectionUtils.isEmpty(dataMap)) { + if (MapUtils.isEmpty(dataMap)) { return; } fileCache.put(index / BATCH_COUNT, dataMap); @@ -121,8 +123,8 @@ public class Ehcache implements ReadCache { @Override public void destroy() { - fileCacheManager.removeCache(cacheAlias); - activeCacheManager.removeCache(cacheAlias); + FILE_CACHE_MANAGER.removeCache(cacheAlias); + ACTIVE_CACHE_MANAGER.removeCache(cacheAlias); } } diff --git a/src/main/java/com/alibaba/excel/metadata/property/ExcelHeadProperty.java b/src/main/java/com/alibaba/excel/metadata/property/ExcelHeadProperty.java index a191260d..878e8c0d 100644 --- a/src/main/java/com/alibaba/excel/metadata/property/ExcelHeadProperty.java +++ b/src/main/java/com/alibaba/excel/metadata/property/ExcelHeadProperty.java @@ -8,6 +8,7 @@ import java.util.List; import java.util.Map; import java.util.TreeMap; +import org.apache.commons.collections4.CollectionUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -21,7 +22,6 @@ import com.alibaba.excel.exception.ExcelCommonException; import com.alibaba.excel.metadata.Head; import com.alibaba.excel.metadata.Holder; import com.alibaba.excel.util.ClassUtils; -import com.alibaba.excel.util.CollectionUtils; import com.alibaba.excel.util.StringUtils; import com.alibaba.excel.write.metadata.holder.AbstractWriteHolder; diff --git a/src/main/java/com/alibaba/excel/util/CollectionUtils.java b/src/main/java/com/alibaba/excel/util/CollectionUtils.java deleted file mode 100644 index f413be17..00000000 --- a/src/main/java/com/alibaba/excel/util/CollectionUtils.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.alibaba.excel.util; - -import java.util.Collection; -import java.util.Map; - -/** - * Collection utils - * - * @author jipengfei - */ -public class CollectionUtils { - - private CollectionUtils() {} - - public static boolean isEmpty(Collection collection) { - return (collection == null || collection.isEmpty()); - } - - public static boolean isEmpty(Map map) { - return (map == null || map.isEmpty()); - } -} diff --git a/src/main/java/com/alibaba/excel/write/executor/ExcelWriteAddExecutor.java b/src/main/java/com/alibaba/excel/write/executor/ExcelWriteAddExecutor.java index 832cbb8a..6e99a9a9 100644 --- a/src/main/java/com/alibaba/excel/write/executor/ExcelWriteAddExecutor.java +++ b/src/main/java/com/alibaba/excel/write/executor/ExcelWriteAddExecutor.java @@ -14,7 +14,6 @@ import com.alibaba.excel.metadata.CellData; import com.alibaba.excel.metadata.Head; import com.alibaba.excel.metadata.property.ExcelContentProperty; import com.alibaba.excel.util.ClassUtils; -import com.alibaba.excel.util.CollectionUtils; import com.alibaba.excel.util.FieldUtils; import com.alibaba.excel.util.WorkBookUtil; import com.alibaba.excel.util.WriteHandlerUtils; @@ -23,6 +22,7 @@ import com.alibaba.excel.write.metadata.holder.WriteSheetHolder; import com.alibaba.excel.write.metadata.holder.WriteWorkbookHolder; import net.sf.cglib.beans.BeanMap; +import org.apache.commons.collections4.CollectionUtils; import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.Row; diff --git a/src/main/java/com/alibaba/excel/write/executor/ExcelWriteFillExecutor.java b/src/main/java/com/alibaba/excel/write/executor/ExcelWriteFillExecutor.java index 4bfd06fc..b2f3362b 100644 --- a/src/main/java/com/alibaba/excel/write/executor/ExcelWriteFillExecutor.java +++ b/src/main/java/com/alibaba/excel/write/executor/ExcelWriteFillExecutor.java @@ -9,12 +9,6 @@ import java.util.List; import java.util.Map; import java.util.Set; -import org.apache.poi.ss.usermodel.Cell; -import org.apache.poi.ss.usermodel.CellStyle; -import org.apache.poi.ss.usermodel.CellType; -import org.apache.poi.ss.usermodel.Row; -import org.apache.poi.ss.usermodel.Sheet; - import com.alibaba.excel.context.WriteContext; import com.alibaba.excel.enums.CellDataTypeEnum; import com.alibaba.excel.enums.WriteDirectionEnum; @@ -22,7 +16,6 @@ import com.alibaba.excel.enums.WriteTemplateAnalysisCellTypeEnum; import com.alibaba.excel.exception.ExcelGenerateException; import com.alibaba.excel.metadata.CellData; import com.alibaba.excel.metadata.property.ExcelContentProperty; -import com.alibaba.excel.util.CollectionUtils; import com.alibaba.excel.util.StringUtils; import com.alibaba.excel.util.WriteHandlerUtils; import com.alibaba.excel.write.metadata.fill.AnalysisCell; @@ -31,6 +24,12 @@ import com.alibaba.excel.write.metadata.fill.FillWrapper; import com.alibaba.excel.write.metadata.holder.WriteSheetHolder; import net.sf.cglib.beans.BeanMap; +import org.apache.commons.collections4.CollectionUtils; +import org.apache.poi.ss.usermodel.Cell; +import org.apache.poi.ss.usermodel.CellStyle; +import org.apache.poi.ss.usermodel.CellType; +import org.apache.poi.ss.usermodel.Row; +import org.apache.poi.ss.usermodel.Sheet; /** * Fill the data into excel @@ -179,6 +178,9 @@ public class ExcelWriteFillExecutor extends AbstractExcelWriteExecutor { private void doFill(List analysisCellList, Object oneRowData, FillConfig fillConfig, Integer relativeRowIndex) { + if (CollectionUtils.isEmpty(analysisCellList)) { + return; + } Map dataMap; if (oneRowData instanceof Map) { dataMap = (Map) oneRowData; @@ -188,9 +190,6 @@ public class ExcelWriteFillExecutor extends AbstractExcelWriteExecutor { WriteSheetHolder writeSheetHolder = writeContext.writeSheetHolder(); Map fieldNameContentPropertyMap = writeContext.currentWriteHolder().excelWriteHeadProperty().getFieldNameContentPropertyMap(); - if(null == analysisCellList || analysisCellList.isEmpty()){ - return; - } for (AnalysisCell analysisCell : analysisCellList) { Cell cell = getOneCell(analysisCell, fillConfig); if (analysisCell.getOnlyOneVariable()) { 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 0fced0b5..6ba2c593 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 @@ -9,6 +9,7 @@ import java.util.Map; import java.util.Set; import java.util.TreeMap; +import org.apache.commons.collections4.CollectionUtils; import org.apache.poi.ss.usermodel.FillPatternType; import org.apache.poi.ss.usermodel.IndexedColors; @@ -25,7 +26,6 @@ import com.alibaba.excel.metadata.TableStyle; import com.alibaba.excel.metadata.property.LoopMergeProperty; import com.alibaba.excel.metadata.property.OnceAbsoluteMergeProperty; import com.alibaba.excel.metadata.property.RowHeightProperty; -import com.alibaba.excel.util.CollectionUtils; import com.alibaba.excel.write.handler.CellWriteHandler; import com.alibaba.excel.write.handler.DefaultWriteHandlerLoader; import com.alibaba.excel.write.handler.RowWriteHandler; diff --git a/src/main/java/com/alibaba/excel/write/style/column/LongestMatchColumnWidthStyleStrategy.java b/src/main/java/com/alibaba/excel/write/style/column/LongestMatchColumnWidthStyleStrategy.java index cc8dcb20..717077dc 100644 --- a/src/main/java/com/alibaba/excel/write/style/column/LongestMatchColumnWidthStyleStrategy.java +++ b/src/main/java/com/alibaba/excel/write/style/column/LongestMatchColumnWidthStyleStrategy.java @@ -4,12 +4,12 @@ import java.util.HashMap; import java.util.List; import java.util.Map; +import org.apache.commons.collections4.CollectionUtils; import org.apache.poi.ss.usermodel.Cell; import com.alibaba.excel.enums.CellDataTypeEnum; import com.alibaba.excel.metadata.CellData; import com.alibaba.excel.metadata.Head; -import com.alibaba.excel.util.CollectionUtils; import com.alibaba.excel.write.metadata.holder.WriteSheetHolder; /** diff --git a/src/test/java/com/alibaba/easyexcel/test/demo/fill/FillTest.java b/src/test/java/com/alibaba/easyexcel/test/demo/fill/FillTest.java index 3c77ba78..7a0e92e5 100644 --- a/src/test/java/com/alibaba/easyexcel/test/demo/fill/FillTest.java +++ b/src/test/java/com/alibaba/easyexcel/test/demo/fill/FillTest.java @@ -80,24 +80,6 @@ public class FillTest { excelWriter.finish(); } - /** - * 处理无变量问题 - * - * @since 2.1.1 - */ - @Test - public void noVariableFill() { - // 模板注意 用{} 来表示你要用的变量 如果本来就有"{","}" 特殊字符 用"\{","\}"代替 - // 填充list 的时候还要注意 模板中{.} 多了个点 表示list - String templateFileName = - TestFileUtil.getPath() + "demo" + File.separator + "fill" + File.separator + "no_variable.xlsx"; - - // 方案1 一下子全部放到内存里面 并填充 - String fileName = TestFileUtil.getPath() + "listFill" + System.currentTimeMillis() + ".xlsx"; - // 这里 会填充到第一个sheet, 然后文件流会自动关闭 - EasyExcel.write(fileName).withTemplate(templateFileName).sheet().doFill(data()); - } - /** * 复杂的填充 * diff --git a/src/test/resources/demo/fill/no_variable.xlsx b/src/test/resources/demo/fill/no_variable.xlsx deleted file mode 100644 index 982321d6e39412eef856e1691fe579c303e0324f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9946 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