From 73185a398a3aec6836e8d85eb4e5d66a3a9344d6 Mon Sep 17 00:00:00 2001 From: Jiaju Zhuang Date: Thu, 28 Oct 2021 20:20:00 +0800 Subject: [PATCH] =?UTF-8?q?=E4=B8=B4=E6=97=B6=E6=B5=8B=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../alibaba/excel/util/WriteHandlerUtils.java | 177 +++++++++---- .../write/executor/ExcelWriteAddExecutor.java | 3 +- .../handler/CellHandlerExecutionChain.java | 52 ++++ .../handler/DefaultWriteHandlerLoader.java | 6 +- .../excel/write/handler/WriteHandler.java | 3 +- .../context/CellWriteHandlerContext.java | 7 + .../impl/FillStyleCellWriteHandler.java | 2 +- .../metadata/holder/AbstractWriteHolder.java | 46 +++- .../write/metadata/holder/WriteHolder.java | 8 + .../metadata/holder/WriteWorkbookHolder.java | 18 +- .../write/metadata/style/WriteCellStyle.java | 3 + .../style/HorizontalCellStyleStrategy.java | 3 +- .../test/core/large/LargeDataTest.java | 237 ++++++++++++------ 13 files changed, 424 insertions(+), 141 deletions(-) create mode 100644 src/main/java/com/alibaba/excel/write/handler/CellHandlerExecutionChain.java diff --git a/src/main/java/com/alibaba/excel/util/WriteHandlerUtils.java b/src/main/java/com/alibaba/excel/util/WriteHandlerUtils.java index a1ac1efd..a26b4d89 100644 --- a/src/main/java/com/alibaba/excel/util/WriteHandlerUtils.java +++ b/src/main/java/com/alibaba/excel/util/WriteHandlerUtils.java @@ -6,6 +6,7 @@ import java.util.Map; import com.alibaba.excel.context.WriteContext; import com.alibaba.excel.metadata.Head; import com.alibaba.excel.metadata.property.ExcelContentProperty; +import com.alibaba.excel.write.handler.CellHandlerExecutionChain; import com.alibaba.excel.write.handler.CellWriteHandler; import com.alibaba.excel.write.handler.RowWriteHandler; import com.alibaba.excel.write.handler.SheetWriteHandler; @@ -16,9 +17,6 @@ import com.alibaba.excel.write.handler.context.RowWriteHandlerContext; import com.alibaba.excel.write.handler.context.SheetWriteHandlerContext; import com.alibaba.excel.write.handler.context.WorkbookWriteHandlerContext; import com.alibaba.excel.write.handler.impl.DefaultRowWriteHandler; -import com.alibaba.excel.write.handler.impl.FillStyleCellWriteHandler; -import com.alibaba.excel.write.metadata.holder.AbstractWriteHolder; -import com.alibaba.excel.write.style.DefaultStyle; import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections4.CollectionUtils; @@ -151,72 +149,153 @@ public class WriteHandlerUtils { public static CellWriteHandlerContext createCellWriteHandlerContext(WriteContext writeContext, Row row, Integer rowIndex, Head head, Integer columnIndex, Integer relativeRowIndex, Boolean isHead, ExcelContentProperty excelContentProperty) { - List handlerList = writeContext.currentWriteHolder().writeHandlerMap().get( + CellHandlerExecutionChain heade = writeContext.currentWriteHolder().writeHandlerMap2().get( CellWriteHandler.class); - return new CellWriteHandlerContext(writeContext, writeContext.writeWorkbookHolder(), + CellWriteHandlerContext context = new CellWriteHandlerContext(writeContext, writeContext.writeWorkbookHolder(), writeContext.writeSheetHolder(), writeContext.writeTableHolder(), row, rowIndex, null, columnIndex, - relativeRowIndex, head, null, null, isHead, excelContentProperty, handlerList); + relativeRowIndex, head, null, null, isHead, excelContentProperty, + writeContext.currentWriteHolder().writeHandlerMap().get( + CellWriteHandler.class)); + context.setCellHandlerExecutionChain(heade); + return context; } public static void beforeCellCreate(CellWriteHandlerContext context) { - List handlerList = context.getHandlerList(); - DefaultStyle.defaultStyle.beforeCellCreate(context); - AbstractWriteHolder.abstractVerticalCellStyleStrategy.beforeCellCreate(context); - if (CollectionUtils.isNotEmpty(handlerList)) { - CostUtil.count++; - for (WriteHandler writeHandler : handlerList) { + context.getCellHandlerExecutionChain().beforeCellCreate(context); - ((CellWriteHandler)writeHandler).beforeCellCreate(context); - } - } - FillStyleCellWriteHandler.fillStyleCellWriteHandler.beforeCellCreate(context); } public static void afterCellCreate(CellWriteHandlerContext context) { - List handlerList = context.getHandlerList(); - DefaultStyle.defaultStyle.afterCellCreate(context); - AbstractWriteHolder.abstractVerticalCellStyleStrategy.afterCellCreate(context); - if (CollectionUtils.isNotEmpty(handlerList)) { - CostUtil.count++; - - for (WriteHandler writeHandler : handlerList) { - - ((CellWriteHandler)writeHandler).afterCellCreate(context); - } - } - FillStyleCellWriteHandler.fillStyleCellWriteHandler.afterCellCreate(context); + context.getCellHandlerExecutionChain().afterCellCreate(context); } public static void afterCellDataConverted(CellWriteHandlerContext context) { - List handlerList = context.getHandlerList(); - DefaultStyle.defaultStyle.afterCellDataConverted(context); - AbstractWriteHolder.abstractVerticalCellStyleStrategy.afterCellDataConverted(context); - if (CollectionUtils.isNotEmpty(handlerList)) { - CostUtil.count++; - for (WriteHandler writeHandler : handlerList) { - ((CellWriteHandler)writeHandler).afterCellDataConverted(context); - } - } - FillStyleCellWriteHandler.fillStyleCellWriteHandler.afterCellDataConverted(context); + context.getCellHandlerExecutionChain().afterCellDataConverted(context); } public static void afterCellDispose(CellWriteHandlerContext context) { - List handlerList = context.getHandlerList(); - DefaultStyle.defaultStyle.afterCellDispose(context); - AbstractWriteHolder.abstractVerticalCellStyleStrategy.afterCellDispose(context); - if (CollectionUtils.isNotEmpty(handlerList)) { - CostUtil.count++; - for (WriteHandler writeHandler : handlerList) { - ((CellWriteHandler)writeHandler).afterCellDispose(context); - } - } - FillStyleCellWriteHandler.fillStyleCellWriteHandler.afterCellDispose(context); - + context.getCellHandlerExecutionChain().afterCellDispose(context); } + //public static void beforeCellCreate(CellWriteHandlerContext context) { + // + // List handlerList = context.getHandlerList(); + // if (CollectionUtils.isNotEmpty(handlerList)) { + // CostUtil.count++; + // + // for (WriteHandler writeHandler : handlerList) { + // + // ((CellWriteHandler)writeHandler).beforeCellCreate(context); + // } + // } + //} + // + //public static void afterCellCreate(CellWriteHandlerContext context) { + // + // List handlerList = context.getHandlerList(); + // if (CollectionUtils.isNotEmpty(handlerList)) { + // CostUtil.count++; + // + // for (WriteHandler writeHandler : handlerList) { + // + // ((CellWriteHandler)writeHandler).afterCellCreate(context); + // } + // } + // + //} + // + //public static void afterCellDataConverted(CellWriteHandlerContext context) { + // + // List handlerList = context.getHandlerList(); + // if (CollectionUtils.isNotEmpty(handlerList)) { + // CostUtil.count++; + // for (WriteHandler writeHandler : handlerList) { + // ((CellWriteHandler)writeHandler).afterCellDataConverted(context); + // } + // } + // + //} + // + //public static void afterCellDispose(CellWriteHandlerContext context) { + // List handlerList = context.getHandlerList(); + // if (CollectionUtils.isNotEmpty(handlerList)) { + // CostUtil.count++; + // for (WriteHandler writeHandler : handlerList) { + // ((CellWriteHandler)writeHandler).afterCellDispose(context); + // } + // } + //} + + // + //public static void beforeCellCreate(CellWriteHandlerContext context) { + // + // context.getCellHandlerExecutionChain().beforeCellCreate(context); + // + // //List handlerList = context.getHandlerList(); + // //DefaultStyle.defaultStyle.beforeCellCreate(context); + // //AbstractWriteHolder.abstractVerticalCellStyleStrategy.beforeCellCreate(context); + // //if (CollectionUtils.isNotEmpty(handlerList)) { + // // CostUtil.count++; + // // + // // for (WriteHandler writeHandler : handlerList) { + // // + // // ((CellWriteHandler)writeHandler).beforeCellCreate(context); + // // } + // //} + // //FillStyleCellWriteHandler.fillStyleCellWriteHandler.beforeCellCreate(context); + //} + // + //public static void afterCellCreate(CellWriteHandlerContext context) { + // context.getCellHandlerExecutionChain().afterCellCreate(context); + // + // //List handlerList = context.getHandlerList(); + // //DefaultStyle.defaultStyle.afterCellCreate(context); + // //AbstractWriteHolder.abstractVerticalCellStyleStrategy.afterCellCreate(context); + // //if (CollectionUtils.isNotEmpty(handlerList)) { + // // CostUtil.count++; + // // + // // for (WriteHandler writeHandler : handlerList) { + // // + // // ((CellWriteHandler)writeHandler).afterCellCreate(context); + // // } + // //} + // //FillStyleCellWriteHandler.fillStyleCellWriteHandler.afterCellCreate(context); + // + //} + // + //public static void afterCellDataConverted(CellWriteHandlerContext context) { + // context.getCellHandlerExecutionChain().afterCellDataConverted(context); + // + // //List handlerList = context.getHandlerList(); + // ////DefaultStyle.defaultStyle.afterCellDataConverted(context); + // ////AbstractWriteHolder.abstractVerticalCellStyleStrategy.afterCellDataConverted(context); + // //if (CollectionUtils.isNotEmpty(handlerList)) { + // // CostUtil.count++; + // // for (WriteHandler writeHandler : handlerList) { + // // ((CellWriteHandler)writeHandler).afterCellDataConverted(context); + // // } + // //} + // //FillStyleCellWriteHandler.fillStyleCellWriteHandler.afterCellDataConverted(context); + // + //} + // + //public static void afterCellDispose(CellWriteHandlerContext context) { + // context.getCellHandlerExecutionChain().afterCellDispose(context); + // //List handlerList = context.getHandlerList(); + // //DefaultStyle.defaultStyle.afterCellDispose(context); + // ////AbstractWriteHolder.abstractVerticalCellStyleStrategy.afterCellDispose(context); + // //if (CollectionUtils.isNotEmpty(handlerList)) { + // // CostUtil.count++; + // // for (WriteHandler writeHandler : handlerList) { + // // ((CellWriteHandler)writeHandler).afterCellDispose(context); + // // } + // //} + // //FillStyleCellWriteHandler.fillStyleCellWriteHandler.afterCellDispose(context); + //} + public static RowWriteHandlerContext createRowWriteHandlerContext(WriteContext writeContext, Integer rowIndex, Integer relativeRowIndex, Boolean isHead) { List handlerList = writeContext.currentWriteHolder().writeHandlerMap().get( 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 ffb8844c..34d0ce09 100644 --- a/src/main/java/com/alibaba/excel/write/executor/ExcelWriteAddExecutor.java +++ b/src/main/java/com/alibaba/excel/write/executor/ExcelWriteAddExecutor.java @@ -142,6 +142,7 @@ public class ExcelWriteAddExecutor extends AbstractExcelWriteExecutor { Map sortedAllFiledMap) { WriteHolder currentWriteHolder = writeContext.currentWriteHolder(); BeanMap beanMap = BeanMapUtils.create(oneRowData); + Set keySet = new HashSet<>(beanMap.keySet()); Set beanMapHandledSet = new HashSet<>(); int maxCellIndex = -1; // If it's a class it needs to be cast by type @@ -151,7 +152,7 @@ public class ExcelWriteAddExecutor extends AbstractExcelWriteExecutor { int columnIndex = entry.getKey(); Head head = entry.getValue(); String name = head.getFieldName(); - if (!beanMap.containsKey(name)) { + if (!keySet.contains(name)) { continue; } diff --git a/src/main/java/com/alibaba/excel/write/handler/CellHandlerExecutionChain.java b/src/main/java/com/alibaba/excel/write/handler/CellHandlerExecutionChain.java new file mode 100644 index 00000000..3241117f --- /dev/null +++ b/src/main/java/com/alibaba/excel/write/handler/CellHandlerExecutionChain.java @@ -0,0 +1,52 @@ +package com.alibaba.excel.write.handler; + +import com.alibaba.excel.write.handler.context.CellWriteHandlerContext; + +import lombok.Data; + +@Data +public class CellHandlerExecutionChain { + private CellHandlerExecutionChain next; + private CellWriteHandler handler; + + public CellHandlerExecutionChain(CellWriteHandler handler) { + this.handler = handler; + } + + public void beforeCellCreate(CellWriteHandlerContext context) { + this.handler.beforeCellCreate(context); + if (this.next != null) { + this.next.beforeCellCreate(context); + } + } + + public void afterCellCreate(CellWriteHandlerContext context) { + this.handler.afterCellCreate(context); + if (this.next != null) { + this.next.afterCellCreate(context); + } + } + + public void afterCellDataConverted(CellWriteHandlerContext context) { + this.handler.afterCellDataConverted(context); + if (this.next != null) { + this.next.afterCellDataConverted(context); + } + } + + public void afterCellDispose(CellWriteHandlerContext context) { + this.handler.afterCellDispose(context); + if (this.next != null) { + this.next.afterCellDispose(context); + } + } + + public void addLast(CellWriteHandler handler) { + CellHandlerExecutionChain context = this; + while (context.next != null) { + context = context.next; + } + context.next = new CellHandlerExecutionChain(handler); + } + +} diff --git a/src/main/java/com/alibaba/excel/write/handler/DefaultWriteHandlerLoader.java b/src/main/java/com/alibaba/excel/write/handler/DefaultWriteHandlerLoader.java index 9f0e21c4..7fda3908 100644 --- a/src/main/java/com/alibaba/excel/write/handler/DefaultWriteHandlerLoader.java +++ b/src/main/java/com/alibaba/excel/write/handler/DefaultWriteHandlerLoader.java @@ -5,6 +5,8 @@ import java.util.List; import com.alibaba.excel.write.handler.impl.DefaultRowWriteHandler; import com.alibaba.excel.write.handler.impl.DimensionWorkbookWriteHandler; +import com.alibaba.excel.write.handler.impl.FillStyleCellWriteHandler; +import com.alibaba.excel.write.style.DefaultStyle; /** * Load default handler @@ -18,7 +20,7 @@ public class DefaultWriteHandlerLoader { static { DEFAULT_WRITE_HANDLER_LIST.add(new DimensionWorkbookWriteHandler()); DEFAULT_WRITE_HANDLER_LIST.add(new DefaultRowWriteHandler()); - //DEFAULT_WRITE_HANDLER_LIST.add(new FillStyleCellWriteHandler()); + DEFAULT_WRITE_HANDLER_LIST.add(new FillStyleCellWriteHandler()); } /** @@ -29,7 +31,7 @@ public class DefaultWriteHandlerLoader { public static List loadDefaultHandler(Boolean useDefaultStyle) { List handlerList = new ArrayList<>(); if (useDefaultStyle) { - //handlerList.add(new DefaultStyle()); + handlerList.add(new DefaultStyle()); } handlerList.addAll(DEFAULT_WRITE_HANDLER_LIST); return handlerList; diff --git a/src/main/java/com/alibaba/excel/write/handler/WriteHandler.java b/src/main/java/com/alibaba/excel/write/handler/WriteHandler.java index 3864ac7b..15ac9338 100644 --- a/src/main/java/com/alibaba/excel/write/handler/WriteHandler.java +++ b/src/main/java/com/alibaba/excel/write/handler/WriteHandler.java @@ -7,4 +7,5 @@ import com.alibaba.excel.event.Handler; * * @author Jiaju Zhuang */ -public interface WriteHandler extends Handler {} +public interface WriteHandler extends Handler { +} diff --git a/src/main/java/com/alibaba/excel/write/handler/context/CellWriteHandlerContext.java b/src/main/java/com/alibaba/excel/write/handler/context/CellWriteHandlerContext.java index d585db93..0ee4f7b6 100644 --- a/src/main/java/com/alibaba/excel/write/handler/context/CellWriteHandlerContext.java +++ b/src/main/java/com/alibaba/excel/write/handler/context/CellWriteHandlerContext.java @@ -7,6 +7,7 @@ import com.alibaba.excel.enums.CellDataTypeEnum; import com.alibaba.excel.metadata.Head; import com.alibaba.excel.metadata.data.WriteCellData; import com.alibaba.excel.metadata.property.ExcelContentProperty; +import com.alibaba.excel.write.handler.CellHandlerExecutionChain; import com.alibaba.excel.write.handler.WriteHandler; import com.alibaba.excel.write.handler.impl.FillStyleCellWriteHandler; import com.alibaba.excel.write.metadata.holder.WriteSheetHolder; @@ -111,6 +112,12 @@ public class CellWriteHandlerContext { */ private List handlerList; + private CellHandlerExecutionChain cellHandlerExecutionChain; + + public CellWriteHandlerContext(){ + + } + public CellWriteHandlerContext(WriteContext writeContext, WriteWorkbookHolder writeWorkbookHolder, WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, Row row, Integer rowIndex, Cell cell, Integer columnIndex, diff --git a/src/main/java/com/alibaba/excel/write/handler/impl/FillStyleCellWriteHandler.java b/src/main/java/com/alibaba/excel/write/handler/impl/FillStyleCellWriteHandler.java index ef1269fc..3553c8d3 100644 --- a/src/main/java/com/alibaba/excel/write/handler/impl/FillStyleCellWriteHandler.java +++ b/src/main/java/com/alibaba/excel/write/handler/impl/FillStyleCellWriteHandler.java @@ -30,7 +30,7 @@ public class FillStyleCellWriteHandler implements CellWriteHandler { @Override public void beforeCellCreate(CellWriteHandlerContext context) { - + //count++; } @Override 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 64ef6360..53352c4e 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 @@ -22,6 +22,8 @@ import com.alibaba.excel.metadata.property.ExcelContentProperty; 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.MapUtils; +import com.alibaba.excel.write.handler.CellHandlerExecutionChain; import com.alibaba.excel.write.handler.CellWriteHandler; import com.alibaba.excel.write.handler.DefaultWriteHandlerLoader; import com.alibaba.excel.write.handler.RowWriteHandler; @@ -66,6 +68,10 @@ public abstract class AbstractWriteHolder extends AbstractHolder implements Writ * Write handler */ private Map, List> writeHandlerMap; + /** + * Write handler + */ + private Map, CellHandlerExecutionChain> writeHandlerMap2; /** * Own write handler.Created in the sheet in the workbook interceptors will not be executed because the workbook to * create an event long past. So when initializing sheet, supplementary workbook event. @@ -189,6 +195,39 @@ public abstract class AbstractWriteHolder extends AbstractHolder implements Writ } this.writeHandlerMap = sortAndClearUpAllHandler(handlerList, parentWriteHandlerMap); + List cc = writeHandlerMap.get(CellWriteHandler.class); + writeHandlerMap2= MapUtils.newHashMap(); + if (CollectionUtils.isNotEmpty(cc)) { + CellHandlerExecutionChain headChain = new CellHandlerExecutionChain(new CellWriteHandler() { + @Override + public void beforeCellCreate(CellWriteHandlerContext context) { + + } + + @Override + public void afterCellCreate(CellWriteHandlerContext context) { + + } + + @Override + public void afterCellDataConverted(CellWriteHandlerContext context) { + + } + + @Override + public void afterCellDispose(CellWriteHandlerContext context) { + + } + }); + writeHandlerMap2.put(CellWriteHandler.class, headChain); + + for (WriteHandler writeHandler : cc) { + headChain.addLast((CellWriteHandler)writeHandler); + + } + + } + // Set converterMap if (parentAbstractWriteHolder == null) { setConverterMap(DefaultConverterLoader.loadDefaultWriteConverter()); @@ -275,7 +314,7 @@ public abstract class AbstractWriteHolder extends AbstractHolder implements Writ } }; //abstractVerticalCellStyleStrategy = styleStrategy; - //handlerList.add(abstractVerticalCellStyleStrategy); + handlerList.add(abstractVerticalCellStyleStrategy); } private void dealLoopMerge(List handlerList, Head head) { @@ -444,6 +483,11 @@ public abstract class AbstractWriteHolder extends AbstractHolder implements Writ return getWriteHandlerMap(); } + @Override + public Map, CellHandlerExecutionChain> writeHandlerMap2() { + return getWriteHandlerMap2(); + } + @Override public Map, List> ownWriteHandlerMap() { return getOwnWriteHandlerMap(); diff --git a/src/main/java/com/alibaba/excel/write/metadata/holder/WriteHolder.java b/src/main/java/com/alibaba/excel/write/metadata/holder/WriteHolder.java index 4896b034..8bb7d97d 100644 --- a/src/main/java/com/alibaba/excel/write/metadata/holder/WriteHolder.java +++ b/src/main/java/com/alibaba/excel/write/metadata/holder/WriteHolder.java @@ -4,6 +4,7 @@ import java.util.List; import java.util.Map; import com.alibaba.excel.metadata.ConfigurationHolder; +import com.alibaba.excel.write.handler.CellHandlerExecutionChain; import com.alibaba.excel.write.handler.WriteHandler; import com.alibaba.excel.write.property.ExcelWriteHeadProperty; @@ -28,6 +29,13 @@ public interface WriteHolder extends ConfigurationHolder { */ Map, List> writeHandlerMap(); + /** + * What handler does the currently operated cell need to execute + * + * @return + */ + Map, CellHandlerExecutionChain> writeHandlerMap2(); + /** * create your own write handler. * 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 ef619196..4b5974a4 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 @@ -43,6 +43,8 @@ import org.apache.poi.xssf.usermodel.XSSFWorkbook; @Data @Slf4j public class WriteWorkbookHolder extends AbstractWriteHolder { + + public static int count = 0; /*** * Current poi Workbook.This is only for writing, and there may be no data in version 07 when template data needs to * be read. @@ -248,6 +250,8 @@ public class WriteWorkbookHolder extends AbstractWriteHolder { return HolderEnum.WORKBOOK; } + private static Map map2 = MapUtils.newHashMap(); + /** * create a cell style. * @@ -259,9 +263,6 @@ public class WriteWorkbookHolder extends AbstractWriteHolder { if (writeCellStyle == null) { return originCellStyle; } - WriteCellStyle tempWriteCellStyle = new WriteCellStyle(); - WriteCellStyle.merge(writeCellStyle, tempWriteCellStyle); - short styleIndex = -1; Font originFont = null; boolean useCache = true; @@ -274,13 +275,20 @@ public class WriteWorkbookHolder extends AbstractWriteHolder { } useCache = false; } - Map cellStyleMap = cellStyleIndexMap.computeIfAbsent(styleIndex, key -> MapUtils.newHashMap()); - CellStyle cellStyle = cellStyleMap.get(tempWriteCellStyle); + + //CellStyle cellStyle = map2.get(writeCellStyle.hashCode()); + //if (cellStyle != null) { + // return cellStyle; + //} + CellStyle cellStyle = cellStyleMap.get(writeCellStyle); + count++; if (cellStyle != null) { return cellStyle; } + WriteCellStyle tempWriteCellStyle = new WriteCellStyle(); + WriteCellStyle.merge(writeCellStyle, tempWriteCellStyle); if (log.isDebugEnabled()) { log.info("create new style:{},{}", tempWriteCellStyle, originCellStyle); } diff --git a/src/main/java/com/alibaba/excel/write/metadata/style/WriteCellStyle.java b/src/main/java/com/alibaba/excel/write/metadata/style/WriteCellStyle.java index 9298f9da..774c3dc7 100644 --- a/src/main/java/com/alibaba/excel/write/metadata/style/WriteCellStyle.java +++ b/src/main/java/com/alibaba/excel/write/metadata/style/WriteCellStyle.java @@ -353,4 +353,7 @@ public class WriteCellStyle { } + public int nativeHashCode() { + return super.hashCode(); + } } diff --git a/src/main/java/com/alibaba/excel/write/style/HorizontalCellStyleStrategy.java b/src/main/java/com/alibaba/excel/write/style/HorizontalCellStyleStrategy.java index 646b77ec..78f8b85e 100644 --- a/src/main/java/com/alibaba/excel/write/style/HorizontalCellStyleStrategy.java +++ b/src/main/java/com/alibaba/excel/write/style/HorizontalCellStyleStrategy.java @@ -17,6 +17,7 @@ import org.apache.commons.collections4.CollectionUtils; */ @Data public class HorizontalCellStyleStrategy extends AbstractCellStyleStrategy { + public static int count=0; private WriteCellStyle headWriteCellStyle; private List contentWriteCellStyleList; @@ -67,7 +68,7 @@ public class HorizontalCellStyleStrategy extends AbstractCellStyleStrategy { @Override public void beforeCellCreate(CellWriteHandlerContext context) { - + //count++; } @Override diff --git a/src/test/java/com/alibaba/easyexcel/test/core/large/LargeDataTest.java b/src/test/java/com/alibaba/easyexcel/test/core/large/LargeDataTest.java index 4ab85507..682772fb 100644 --- a/src/test/java/com/alibaba/easyexcel/test/core/large/LargeDataTest.java +++ b/src/test/java/com/alibaba/easyexcel/test/core/large/LargeDataTest.java @@ -3,20 +3,23 @@ package com.alibaba.easyexcel.test.core.large; import java.io.File; import java.io.FileOutputStream; import java.util.ArrayList; -import java.util.Iterator; import java.util.List; import com.alibaba.easyexcel.test.util.TestFileUtil; import com.alibaba.excel.EasyExcel; import com.alibaba.excel.ExcelWriter; import com.alibaba.excel.util.CostUtil; +import com.alibaba.excel.write.handler.WriteHandler; +import com.alibaba.excel.write.handler.context.CellWriteHandlerContext; import com.alibaba.excel.write.handler.impl.FillStyleCellWriteHandler; import com.alibaba.excel.write.metadata.WriteSheet; +import com.alibaba.excel.write.metadata.holder.WriteWorkbookHolder; import org.apache.poi.xssf.streaming.SXSSFCell; import org.apache.poi.xssf.streaming.SXSSFRow; import org.apache.poi.xssf.streaming.SXSSFSheet; import org.apache.poi.xssf.streaming.SXSSFWorkbook; +import org.junit.Assert; import org.junit.BeforeClass; import org.junit.FixMethodOrder; import org.junit.Test; @@ -85,6 +88,54 @@ public class LargeDataTest { LOGGER.info("CSV large data total time spent:{}", System.currentTimeMillis() - start); } + @Test + public void t04Write666() throws Exception { + long start = System.currentTimeMillis(); + ExcelWriter excelWriter = EasyExcel.write(fileWrite07, LargeData.class).build(); + WriteSheet writeSheet = EasyExcel.writerSheet().build(); + for (int j = 0; j < 2; j++) { + excelWriter.write(data(), writeSheet); + LOGGER.info("{} write success.", j); + } + excelWriter.finish(); + long cost = System.currentTimeMillis() - start; + LOGGER.info("write cost:{}", cost); + + start = System.currentTimeMillis(); + excelWriter = EasyExcel.write(fileWrite07, LargeData.class).build(); + writeSheet = EasyExcel.writerSheet().build(); + for (int j = 0; j < 100; j++) { + excelWriter.write(data(), writeSheet); + LOGGER.info("{} write success.", j); + } + excelWriter.finish(); + cost = System.currentTimeMillis() - start; + LOGGER.info("write cost:{}", cost); + start = System.currentTimeMillis(); + try (FileOutputStream fileOutputStream = new FileOutputStream(fileWritePoi07)) { + SXSSFWorkbook workbook = new SXSSFWorkbook(); + SXSSFSheet sheet = workbook.createSheet("sheet1"); + for (int i = 0; i < 100 * 5000; i++) { + SXSSFRow row = sheet.createRow(i); + for (int j = 0; j < 25; j++) { + SXSSFCell cell = row.createCell(j); + cell.setCellValue("str-" + j + "-" + i); + } + if (i % 5000 == 0) { + LOGGER.info("{} write success.", i); + } + } + workbook.write(fileOutputStream); + workbook.dispose(); + workbook.close(); + } + long costPoi = System.currentTimeMillis() - start; + LOGGER.info("poi write cost:{}", System.currentTimeMillis() - start); + LOGGER.info("{} vs {}", cost, costPoi); + + Assert.assertTrue(costPoi * 3 > cost); + } + @Test public void t04Write44() throws Exception { //read(); @@ -132,82 +183,88 @@ public class LargeDataTest { @Test public void t04Write() throws Exception { - Cellhanderl cellhanderl1 = new Cellhanderl(); - Cellhanderl cellhanderl2 = new Cellhanderl(); - Cellhanderl cellhanderl3 = new Cellhanderl(); - Cellhanderl cellhanderl4 = new Cellhanderl(); - List list = new ArrayList<>(); + WriteHandler cellhanderl1 = new Cellhanderl(); + WriteHandler cellhanderl2 = new Cellhanderl(); + WriteHandler cellhanderl3 = new Cellhanderl(); + WriteHandler cellhanderl4 = new Cellhanderl(); + List list = new ArrayList<>(); list.add(cellhanderl1); list.add(cellhanderl2); list.add(cellhanderl3); + //list.add(cellhanderl4); long start = System.currentTimeMillis(); - for (int i = 0; i < 25000075; i++) { + for (int i = 0; i < 6250025; i++) { + CellWriteHandlerContext content=new CellWriteHandlerContext(); + content.setColumnIndex(99); for (int j = 0; j < list.size(); j++) { - Cellhanderl writeHandler = list.get(0); - writeHandler.beforeCellCreate(null); - writeHandler.afterCellCreate(null); - writeHandler.afterCellDataConverted(null); - writeHandler.afterCellDispose(null); + WriteHandler writeHandler = list.get(0); + ((Cellhanderl)writeHandler).beforeCellCreate(content); + ((Cellhanderl)writeHandler).afterCellCreate(content); + ((Cellhanderl)writeHandler).afterCellDataConverted(content); + ((Cellhanderl)writeHandler).afterCellDispose(content); } } LOGGER.info("第一次:{}", System.currentTimeMillis() - start); start = System.currentTimeMillis(); - for (int i = 0; i < 25000075; i++) { - for (Cellhanderl writeHandler : list) { - writeHandler.beforeCellCreate(null); - writeHandler.afterCellCreate(null); - writeHandler.afterCellDataConverted(null); - writeHandler.afterCellDispose(null); + for (int i = 0; i < 6250025; i++) { + CellWriteHandlerContext content=new CellWriteHandlerContext(); + content.setColumnIndex(99); + for (WriteHandler writeHandler : list) { + + ((Cellhanderl)writeHandler).beforeCellCreate(content); + ((Cellhanderl)writeHandler).afterCellCreate(content); + ((Cellhanderl)writeHandler).afterCellDataConverted(content); + ((Cellhanderl)writeHandler).afterCellDispose(content); } } LOGGER.info("第二次:{}", System.currentTimeMillis() - start); - - start = System.currentTimeMillis(); - for (int i = 0; i < 25000075; i++) { - cellhanderl1.beforeCellCreate(null); - cellhanderl1.afterCellCreate(null); - cellhanderl1.afterCellDataConverted(null); - cellhanderl1.afterCellDispose(null); - cellhanderl2.beforeCellCreate(null); - cellhanderl2.afterCellCreate(null); - cellhanderl2.afterCellDataConverted(null); - cellhanderl2.afterCellDispose(null); - cellhanderl3.beforeCellCreate(null); - cellhanderl3.afterCellCreate(null); - cellhanderl3.afterCellDataConverted(null); - cellhanderl3.afterCellDispose(null); - - } - LOGGER.info("第三次:{}", System.currentTimeMillis() - start); - - start = System.currentTimeMillis(); - for (int i = 0; i < 25000075; i++) { - Iterator iterator = list.iterator(); - while (iterator.hasNext()) { - Cellhanderl writeHandler = iterator.next(); - writeHandler.beforeCellCreate(null); - writeHandler.afterCellCreate(null); - writeHandler.afterCellDataConverted(null); - writeHandler.afterCellDispose(null); - } - } - - LOGGER.info("第四次:{}", System.currentTimeMillis() - start); - - start = System.currentTimeMillis(); - for (int i = 0; i < 25000075; i++) { - list.stream().forEach(writeHandler->{ - writeHandler.beforeCellCreate(null); - writeHandler.afterCellCreate(null); - writeHandler.afterCellDataConverted(null); - writeHandler.afterCellDispose(null); - }); - } - - LOGGER.info("第五次:{}", System.currentTimeMillis() - start); + // + //start = System.currentTimeMillis(); + //for (int i = 0; i < 6250025; i++) { + // cellhanderl1.beforeCellCreate(null); + // cellhanderl1.afterCellCreate(null); + // cellhanderl1.afterCellDataConverted(null); + // cellhanderl1.afterCellDispose(null); + // cellhanderl2.beforeCellCreate(null); + // cellhanderl2.afterCellCreate(null); + // cellhanderl2.afterCellDataConverted(null); + // cellhanderl2.afterCellDispose(null); + // cellhanderl3.beforeCellCreate(null); + // cellhanderl3.afterCellCreate(null); + // cellhanderl3.afterCellDataConverted(null); + // cellhanderl3.afterCellDispose(null); + // + //} + //LOGGER.info("第三次:{}", System.currentTimeMillis() - start); + // + //start = System.currentTimeMillis(); + //for (int i = 0; i < 25000075; i++) { + // Iterator iterator = list.iterator(); + // while (iterator.hasNext()) { + // Cellhanderl writeHandler = iterator.next(); + // writeHandler.beforeCellCreate(null); + // writeHandler.afterCellCreate(null); + // writeHandler.afterCellDataConverted(null); + // writeHandler.afterCellDispose(null); + // } + //} + // + //LOGGER.info("第四次:{}", System.currentTimeMillis() - start); + // + //start = System.currentTimeMillis(); + //for (int i = 0; i < 25000075; i++) { + // list.stream().forEach(writeHandler -> { + // writeHandler.beforeCellCreate(null); + // writeHandler.afterCellCreate(null); + // writeHandler.afterCellDataConverted(null); + // writeHandler.afterCellDispose(null); + // }); + //} + // + //LOGGER.info("第五次:{}", System.currentTimeMillis() - start); } private void v2(Cellhanderl cellhanderl1) { @@ -217,25 +274,45 @@ public class LargeDataTest { cellhanderl1.afterCellDispose(null); } + @Test + public void t04Writev32() throws Exception { + //System.setProperty(DebuggingClassWriter.DEBUG_LOCATION_PROPERTY, "/Users/zhuangjiaju/test"); + //read(); + Thread.sleep(10*1000); + read(); + + } + + + @Test + public void t04Writev33() throws Exception { + //read(); + //Thread.sleep(10*1000); + + read(); + + } + + private void read() throws Exception { long start = System.currentTimeMillis(); - try (FileOutputStream fileOutputStream = new FileOutputStream(fileWritePoi07)) { - SXSSFWorkbook workbook = new SXSSFWorkbook(); - SXSSFSheet sheet = workbook.createSheet("sheet1"); - for (int i = 0; i < 20 * 5000; i++) { - SXSSFRow row = sheet.createRow(i); - for (int j = 0; j < 25; j++) { - SXSSFCell cell = row.createCell(j); - cell.setCellValue("str-" + j + "-" + i); - } - if (i % 5000 == 0) { - //LOGGER.info("{} write success.", i); - } - } - workbook.write(fileOutputStream); - workbook.dispose(); - workbook.close(); - } + //try (FileOutputStream fileOutputStream = new FileOutputStream(fileWritePoi07)) { + // SXSSFWorkbook workbook = new SXSSFWorkbook(); + // SXSSFSheet sheet = workbook.createSheet("sheet1"); + // for (int i = 0; i < 20 * 5000; i++) { + // SXSSFRow row = sheet.createRow(i); + // for (int j = 0; j < 25; j++) { + // SXSSFCell cell = row.createCell(j); + // cell.setCellValue("str-" + j + "-" + i); + // } + // if (i % 5000 == 0) { + // //LOGGER.info("{} write success.", i); + // } + // } + // workbook.write(fileOutputStream); + // workbook.dispose(); + // workbook.close(); + //} long costPoi = System.currentTimeMillis() - start; LOGGER.info("poi写入消费:{}", System.currentTimeMillis() - start); @@ -263,7 +340,7 @@ public class LargeDataTest { LOGGER.info("easyxcel写入:{}", CostUtil.count2); LOGGER.info("easyxcel写入:{}", CostUtil.count); LOGGER.info("easyxcel写入:{}", FillStyleCellWriteHandler.count); - + LOGGER.info("easyxcel写入:{}", WriteWorkbookHolder.count); }