Browse Source

临时测试

test
Jiaju Zhuang 3 years ago
parent
commit
73185a398a
  1. 177
      src/main/java/com/alibaba/excel/util/WriteHandlerUtils.java
  2. 3
      src/main/java/com/alibaba/excel/write/executor/ExcelWriteAddExecutor.java
  3. 52
      src/main/java/com/alibaba/excel/write/handler/CellHandlerExecutionChain.java
  4. 6
      src/main/java/com/alibaba/excel/write/handler/DefaultWriteHandlerLoader.java
  5. 3
      src/main/java/com/alibaba/excel/write/handler/WriteHandler.java
  6. 7
      src/main/java/com/alibaba/excel/write/handler/context/CellWriteHandlerContext.java
  7. 2
      src/main/java/com/alibaba/excel/write/handler/impl/FillStyleCellWriteHandler.java
  8. 46
      src/main/java/com/alibaba/excel/write/metadata/holder/AbstractWriteHolder.java
  9. 8
      src/main/java/com/alibaba/excel/write/metadata/holder/WriteHolder.java
  10. 18
      src/main/java/com/alibaba/excel/write/metadata/holder/WriteWorkbookHolder.java
  11. 3
      src/main/java/com/alibaba/excel/write/metadata/style/WriteCellStyle.java
  12. 3
      src/main/java/com/alibaba/excel/write/style/HorizontalCellStyleStrategy.java
  13. 237
      src/test/java/com/alibaba/easyexcel/test/core/large/LargeDataTest.java

177
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.context.WriteContext;
import com.alibaba.excel.metadata.Head; import com.alibaba.excel.metadata.Head;
import com.alibaba.excel.metadata.property.ExcelContentProperty; 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.CellWriteHandler;
import com.alibaba.excel.write.handler.RowWriteHandler; import com.alibaba.excel.write.handler.RowWriteHandler;
import com.alibaba.excel.write.handler.SheetWriteHandler; 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.SheetWriteHandlerContext;
import com.alibaba.excel.write.handler.context.WorkbookWriteHandlerContext; import com.alibaba.excel.write.handler.context.WorkbookWriteHandlerContext;
import com.alibaba.excel.write.handler.impl.DefaultRowWriteHandler; 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 lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.collections4.CollectionUtils;
@ -151,72 +149,153 @@ public class WriteHandlerUtils {
public static CellWriteHandlerContext createCellWriteHandlerContext(WriteContext writeContext, Row row, public static CellWriteHandlerContext createCellWriteHandlerContext(WriteContext writeContext, Row row,
Integer rowIndex, Head head, Integer columnIndex, Integer relativeRowIndex, Boolean isHead, Integer rowIndex, Head head, Integer columnIndex, Integer relativeRowIndex, Boolean isHead,
ExcelContentProperty excelContentProperty) { ExcelContentProperty excelContentProperty) {
List<WriteHandler> handlerList = writeContext.currentWriteHolder().writeHandlerMap().get( CellHandlerExecutionChain heade = writeContext.currentWriteHolder().writeHandlerMap2().get(
CellWriteHandler.class); CellWriteHandler.class);
return new CellWriteHandlerContext(writeContext, writeContext.writeWorkbookHolder(), CellWriteHandlerContext context = new CellWriteHandlerContext(writeContext, writeContext.writeWorkbookHolder(),
writeContext.writeSheetHolder(), writeContext.writeTableHolder(), row, rowIndex, null, columnIndex, 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) { public static void beforeCellCreate(CellWriteHandlerContext context) {
List<WriteHandler> 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) { public static void afterCellCreate(CellWriteHandlerContext context) {
List<WriteHandler> handlerList = context.getHandlerList(); context.getCellHandlerExecutionChain().afterCellCreate(context);
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) { public static void afterCellDataConverted(CellWriteHandlerContext context) {
List<WriteHandler> handlerList = context.getHandlerList(); context.getCellHandlerExecutionChain().afterCellDataConverted(context);
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) { public static void afterCellDispose(CellWriteHandlerContext context) {
List<WriteHandler> handlerList = context.getHandlerList(); context.getCellHandlerExecutionChain().afterCellDispose(context);
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 void beforeCellCreate(CellWriteHandlerContext context) {
//
// List<WriteHandler> handlerList = context.getHandlerList();
// if (CollectionUtils.isNotEmpty(handlerList)) {
// CostUtil.count++;
//
// for (WriteHandler writeHandler : handlerList) {
//
// ((CellWriteHandler)writeHandler).beforeCellCreate(context);
// }
// }
//}
//
//public static void afterCellCreate(CellWriteHandlerContext context) {
//
// List<WriteHandler> handlerList = context.getHandlerList();
// if (CollectionUtils.isNotEmpty(handlerList)) {
// CostUtil.count++;
//
// for (WriteHandler writeHandler : handlerList) {
//
// ((CellWriteHandler)writeHandler).afterCellCreate(context);
// }
// }
//
//}
//
//public static void afterCellDataConverted(CellWriteHandlerContext context) {
//
// List<WriteHandler> handlerList = context.getHandlerList();
// if (CollectionUtils.isNotEmpty(handlerList)) {
// CostUtil.count++;
// for (WriteHandler writeHandler : handlerList) {
// ((CellWriteHandler)writeHandler).afterCellDataConverted(context);
// }
// }
//
//}
//
//public static void afterCellDispose(CellWriteHandlerContext context) {
// List<WriteHandler> 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<WriteHandler> 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<WriteHandler> 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<WriteHandler> 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<WriteHandler> 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, public static RowWriteHandlerContext createRowWriteHandlerContext(WriteContext writeContext, Integer rowIndex,
Integer relativeRowIndex, Boolean isHead) { Integer relativeRowIndex, Boolean isHead) {
List<WriteHandler> handlerList = writeContext.currentWriteHolder().writeHandlerMap().get( List<WriteHandler> handlerList = writeContext.currentWriteHolder().writeHandlerMap().get(

3
src/main/java/com/alibaba/excel/write/executor/ExcelWriteAddExecutor.java

@ -142,6 +142,7 @@ public class ExcelWriteAddExecutor extends AbstractExcelWriteExecutor {
Map<Integer, Field> sortedAllFiledMap) { Map<Integer, Field> sortedAllFiledMap) {
WriteHolder currentWriteHolder = writeContext.currentWriteHolder(); WriteHolder currentWriteHolder = writeContext.currentWriteHolder();
BeanMap beanMap = BeanMapUtils.create(oneRowData); BeanMap beanMap = BeanMapUtils.create(oneRowData);
Set<String> keySet = new HashSet<>(beanMap.keySet());
Set<String> beanMapHandledSet = new HashSet<>(); Set<String> beanMapHandledSet = new HashSet<>();
int maxCellIndex = -1; int maxCellIndex = -1;
// If it's a class it needs to be cast by type // 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(); int columnIndex = entry.getKey();
Head head = entry.getValue(); Head head = entry.getValue();
String name = head.getFieldName(); String name = head.getFieldName();
if (!beanMap.containsKey(name)) { if (!keySet.contains(name)) {
continue; continue;
} }

52
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);
}
}

6
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.DefaultRowWriteHandler;
import com.alibaba.excel.write.handler.impl.DimensionWorkbookWriteHandler; 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 * Load default handler
@ -18,7 +20,7 @@ public class DefaultWriteHandlerLoader {
static { static {
DEFAULT_WRITE_HANDLER_LIST.add(new DimensionWorkbookWriteHandler()); DEFAULT_WRITE_HANDLER_LIST.add(new DimensionWorkbookWriteHandler());
DEFAULT_WRITE_HANDLER_LIST.add(new DefaultRowWriteHandler()); 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<WriteHandler> loadDefaultHandler(Boolean useDefaultStyle) { public static List<WriteHandler> loadDefaultHandler(Boolean useDefaultStyle) {
List<WriteHandler> handlerList = new ArrayList<>(); List<WriteHandler> handlerList = new ArrayList<>();
if (useDefaultStyle) { if (useDefaultStyle) {
//handlerList.add(new DefaultStyle()); handlerList.add(new DefaultStyle());
} }
handlerList.addAll(DEFAULT_WRITE_HANDLER_LIST); handlerList.addAll(DEFAULT_WRITE_HANDLER_LIST);
return handlerList; return handlerList;

3
src/main/java/com/alibaba/excel/write/handler/WriteHandler.java

@ -7,4 +7,5 @@ import com.alibaba.excel.event.Handler;
* *
* @author Jiaju Zhuang * @author Jiaju Zhuang
*/ */
public interface WriteHandler extends Handler {} public interface WriteHandler extends Handler {
}

7
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.Head;
import com.alibaba.excel.metadata.data.WriteCellData; import com.alibaba.excel.metadata.data.WriteCellData;
import com.alibaba.excel.metadata.property.ExcelContentProperty; 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.WriteHandler;
import com.alibaba.excel.write.handler.impl.FillStyleCellWriteHandler; import com.alibaba.excel.write.handler.impl.FillStyleCellWriteHandler;
import com.alibaba.excel.write.metadata.holder.WriteSheetHolder; import com.alibaba.excel.write.metadata.holder.WriteSheetHolder;
@ -111,6 +112,12 @@ public class CellWriteHandlerContext {
*/ */
private List<WriteHandler> handlerList; private List<WriteHandler> handlerList;
private CellHandlerExecutionChain cellHandlerExecutionChain;
public CellWriteHandlerContext(){
}
public CellWriteHandlerContext(WriteContext writeContext, public CellWriteHandlerContext(WriteContext writeContext,
WriteWorkbookHolder writeWorkbookHolder, WriteSheetHolder writeSheetHolder, WriteWorkbookHolder writeWorkbookHolder, WriteSheetHolder writeSheetHolder,
WriteTableHolder writeTableHolder, Row row, Integer rowIndex, Cell cell, Integer columnIndex, WriteTableHolder writeTableHolder, Row row, Integer rowIndex, Cell cell, Integer columnIndex,

2
src/main/java/com/alibaba/excel/write/handler/impl/FillStyleCellWriteHandler.java

@ -30,7 +30,7 @@ public class FillStyleCellWriteHandler implements CellWriteHandler {
@Override @Override
public void beforeCellCreate(CellWriteHandlerContext context) { public void beforeCellCreate(CellWriteHandlerContext context) {
//count++;
} }
@Override @Override

46
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.LoopMergeProperty;
import com.alibaba.excel.metadata.property.OnceAbsoluteMergeProperty; import com.alibaba.excel.metadata.property.OnceAbsoluteMergeProperty;
import com.alibaba.excel.metadata.property.RowHeightProperty; 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.CellWriteHandler;
import com.alibaba.excel.write.handler.DefaultWriteHandlerLoader; import com.alibaba.excel.write.handler.DefaultWriteHandlerLoader;
import com.alibaba.excel.write.handler.RowWriteHandler; import com.alibaba.excel.write.handler.RowWriteHandler;
@ -66,6 +68,10 @@ public abstract class AbstractWriteHolder extends AbstractHolder implements Writ
* Write handler * Write handler
*/ */
private Map<Class<? extends WriteHandler>, List<WriteHandler>> writeHandlerMap; private Map<Class<? extends WriteHandler>, List<WriteHandler>> writeHandlerMap;
/**
* Write handler
*/
private Map<Class<? extends WriteHandler>, CellHandlerExecutionChain> writeHandlerMap2;
/** /**
* Own write handler.Created in the sheet in the workbook interceptors will not be executed because the workbook to * 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. * 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); this.writeHandlerMap = sortAndClearUpAllHandler(handlerList, parentWriteHandlerMap);
List<WriteHandler> 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 // Set converterMap
if (parentAbstractWriteHolder == null) { if (parentAbstractWriteHolder == null) {
setConverterMap(DefaultConverterLoader.loadDefaultWriteConverter()); setConverterMap(DefaultConverterLoader.loadDefaultWriteConverter());
@ -275,7 +314,7 @@ public abstract class AbstractWriteHolder extends AbstractHolder implements Writ
} }
}; };
//abstractVerticalCellStyleStrategy = styleStrategy; //abstractVerticalCellStyleStrategy = styleStrategy;
//handlerList.add(abstractVerticalCellStyleStrategy); handlerList.add(abstractVerticalCellStyleStrategy);
} }
private void dealLoopMerge(List<WriteHandler> handlerList, Head head) { private void dealLoopMerge(List<WriteHandler> handlerList, Head head) {
@ -444,6 +483,11 @@ public abstract class AbstractWriteHolder extends AbstractHolder implements Writ
return getWriteHandlerMap(); return getWriteHandlerMap();
} }
@Override
public Map<Class<? extends WriteHandler>, CellHandlerExecutionChain> writeHandlerMap2() {
return getWriteHandlerMap2();
}
@Override @Override
public Map<Class<? extends WriteHandler>, List<WriteHandler>> ownWriteHandlerMap() { public Map<Class<? extends WriteHandler>, List<WriteHandler>> ownWriteHandlerMap() {
return getOwnWriteHandlerMap(); return getOwnWriteHandlerMap();

8
src/main/java/com/alibaba/excel/write/metadata/holder/WriteHolder.java

@ -4,6 +4,7 @@ import java.util.List;
import java.util.Map; import java.util.Map;
import com.alibaba.excel.metadata.ConfigurationHolder; 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.handler.WriteHandler;
import com.alibaba.excel.write.property.ExcelWriteHeadProperty; import com.alibaba.excel.write.property.ExcelWriteHeadProperty;
@ -28,6 +29,13 @@ public interface WriteHolder extends ConfigurationHolder {
*/ */
Map<Class<? extends WriteHandler>, List<WriteHandler>> writeHandlerMap(); Map<Class<? extends WriteHandler>, List<WriteHandler>> writeHandlerMap();
/**
* What handler does the currently operated cell need to execute
*
* @return
*/
Map<Class<? extends WriteHandler>, CellHandlerExecutionChain> writeHandlerMap2();
/** /**
* create your own write handler. * create your own write handler.
* *

18
src/main/java/com/alibaba/excel/write/metadata/holder/WriteWorkbookHolder.java

@ -43,6 +43,8 @@ import org.apache.poi.xssf.usermodel.XSSFWorkbook;
@Data @Data
@Slf4j @Slf4j
public class WriteWorkbookHolder extends AbstractWriteHolder { 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 * Current poi Workbook.This is only for writing, and there may be no data in version 07 when template data needs to
* be read. * be read.
@ -248,6 +250,8 @@ public class WriteWorkbookHolder extends AbstractWriteHolder {
return HolderEnum.WORKBOOK; return HolderEnum.WORKBOOK;
} }
private static Map<Integer, CellStyle> map2 = MapUtils.newHashMap();
/** /**
* create a cell style. * create a cell style.
* *
@ -259,9 +263,6 @@ public class WriteWorkbookHolder extends AbstractWriteHolder {
if (writeCellStyle == null) { if (writeCellStyle == null) {
return originCellStyle; return originCellStyle;
} }
WriteCellStyle tempWriteCellStyle = new WriteCellStyle();
WriteCellStyle.merge(writeCellStyle, tempWriteCellStyle);
short styleIndex = -1; short styleIndex = -1;
Font originFont = null; Font originFont = null;
boolean useCache = true; boolean useCache = true;
@ -274,13 +275,20 @@ public class WriteWorkbookHolder extends AbstractWriteHolder {
} }
useCache = false; useCache = false;
} }
Map<WriteCellStyle, CellStyle> cellStyleMap = cellStyleIndexMap.computeIfAbsent(styleIndex, Map<WriteCellStyle, CellStyle> cellStyleMap = cellStyleIndexMap.computeIfAbsent(styleIndex,
key -> MapUtils.newHashMap()); 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) { if (cellStyle != null) {
return cellStyle; return cellStyle;
} }
WriteCellStyle tempWriteCellStyle = new WriteCellStyle();
WriteCellStyle.merge(writeCellStyle, tempWriteCellStyle);
if (log.isDebugEnabled()) { if (log.isDebugEnabled()) {
log.info("create new style:{},{}", tempWriteCellStyle, originCellStyle); log.info("create new style:{},{}", tempWriteCellStyle, originCellStyle);
} }

3
src/main/java/com/alibaba/excel/write/metadata/style/WriteCellStyle.java

@ -353,4 +353,7 @@ public class WriteCellStyle {
} }
public int nativeHashCode() {
return super.hashCode();
}
} }

3
src/main/java/com/alibaba/excel/write/style/HorizontalCellStyleStrategy.java

@ -17,6 +17,7 @@ import org.apache.commons.collections4.CollectionUtils;
*/ */
@Data @Data
public class HorizontalCellStyleStrategy extends AbstractCellStyleStrategy { public class HorizontalCellStyleStrategy extends AbstractCellStyleStrategy {
public static int count=0;
private WriteCellStyle headWriteCellStyle; private WriteCellStyle headWriteCellStyle;
private List<WriteCellStyle> contentWriteCellStyleList; private List<WriteCellStyle> contentWriteCellStyleList;
@ -67,7 +68,7 @@ public class HorizontalCellStyleStrategy extends AbstractCellStyleStrategy {
@Override @Override
public void beforeCellCreate(CellWriteHandlerContext context) { public void beforeCellCreate(CellWriteHandlerContext context) {
//count++;
} }
@Override @Override

237
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.File;
import java.io.FileOutputStream; import java.io.FileOutputStream;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Iterator;
import java.util.List; import java.util.List;
import com.alibaba.easyexcel.test.util.TestFileUtil; import com.alibaba.easyexcel.test.util.TestFileUtil;
import com.alibaba.excel.EasyExcel; import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.ExcelWriter; import com.alibaba.excel.ExcelWriter;
import com.alibaba.excel.util.CostUtil; 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.handler.impl.FillStyleCellWriteHandler;
import com.alibaba.excel.write.metadata.WriteSheet; 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.SXSSFCell;
import org.apache.poi.xssf.streaming.SXSSFRow; import org.apache.poi.xssf.streaming.SXSSFRow;
import org.apache.poi.xssf.streaming.SXSSFSheet; import org.apache.poi.xssf.streaming.SXSSFSheet;
import org.apache.poi.xssf.streaming.SXSSFWorkbook; import org.apache.poi.xssf.streaming.SXSSFWorkbook;
import org.junit.Assert;
import org.junit.BeforeClass; import org.junit.BeforeClass;
import org.junit.FixMethodOrder; import org.junit.FixMethodOrder;
import org.junit.Test; import org.junit.Test;
@ -85,6 +88,54 @@ public class LargeDataTest {
LOGGER.info("CSV large data total time spent:{}", System.currentTimeMillis() - start); 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 @Test
public void t04Write44() throws Exception { public void t04Write44() throws Exception {
//read(); //read();
@ -132,82 +183,88 @@ public class LargeDataTest {
@Test @Test
public void t04Write() throws Exception { public void t04Write() throws Exception {
Cellhanderl cellhanderl1 = new Cellhanderl(); WriteHandler cellhanderl1 = new Cellhanderl();
Cellhanderl cellhanderl2 = new Cellhanderl(); WriteHandler cellhanderl2 = new Cellhanderl();
Cellhanderl cellhanderl3 = new Cellhanderl(); WriteHandler cellhanderl3 = new Cellhanderl();
Cellhanderl cellhanderl4 = new Cellhanderl(); WriteHandler cellhanderl4 = new Cellhanderl();
List<Cellhanderl> list = new ArrayList<>(); List<WriteHandler> list = new ArrayList<>();
list.add(cellhanderl1); list.add(cellhanderl1);
list.add(cellhanderl2); list.add(cellhanderl2);
list.add(cellhanderl3); list.add(cellhanderl3);
//list.add(cellhanderl4); //list.add(cellhanderl4);
long start = System.currentTimeMillis(); 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++) { for (int j = 0; j < list.size(); j++) {
Cellhanderl writeHandler = list.get(0); WriteHandler writeHandler = list.get(0);
writeHandler.beforeCellCreate(null); ((Cellhanderl)writeHandler).beforeCellCreate(content);
writeHandler.afterCellCreate(null); ((Cellhanderl)writeHandler).afterCellCreate(content);
writeHandler.afterCellDataConverted(null); ((Cellhanderl)writeHandler).afterCellDataConverted(content);
writeHandler.afterCellDispose(null); ((Cellhanderl)writeHandler).afterCellDispose(content);
} }
} }
LOGGER.info("第一次:{}", System.currentTimeMillis() - start); LOGGER.info("第一次:{}", System.currentTimeMillis() - start);
start = System.currentTimeMillis(); start = System.currentTimeMillis();
for (int i = 0; i < 25000075; i++) { for (int i = 0; i < 6250025; i++) {
for (Cellhanderl writeHandler : list) { CellWriteHandlerContext content=new CellWriteHandlerContext();
writeHandler.beforeCellCreate(null); content.setColumnIndex(99);
writeHandler.afterCellCreate(null); for (WriteHandler writeHandler : list) {
writeHandler.afterCellDataConverted(null);
writeHandler.afterCellDispose(null); ((Cellhanderl)writeHandler).beforeCellCreate(content);
((Cellhanderl)writeHandler).afterCellCreate(content);
((Cellhanderl)writeHandler).afterCellDataConverted(content);
((Cellhanderl)writeHandler).afterCellDispose(content);
} }
} }
LOGGER.info("第二次:{}", System.currentTimeMillis() - start); LOGGER.info("第二次:{}", System.currentTimeMillis() - start);
//
start = System.currentTimeMillis(); //start = System.currentTimeMillis();
for (int i = 0; i < 25000075; i++) { //for (int i = 0; i < 6250025; i++) {
cellhanderl1.beforeCellCreate(null); // cellhanderl1.beforeCellCreate(null);
cellhanderl1.afterCellCreate(null); // cellhanderl1.afterCellCreate(null);
cellhanderl1.afterCellDataConverted(null); // cellhanderl1.afterCellDataConverted(null);
cellhanderl1.afterCellDispose(null); // cellhanderl1.afterCellDispose(null);
cellhanderl2.beforeCellCreate(null); // cellhanderl2.beforeCellCreate(null);
cellhanderl2.afterCellCreate(null); // cellhanderl2.afterCellCreate(null);
cellhanderl2.afterCellDataConverted(null); // cellhanderl2.afterCellDataConverted(null);
cellhanderl2.afterCellDispose(null); // cellhanderl2.afterCellDispose(null);
cellhanderl3.beforeCellCreate(null); // cellhanderl3.beforeCellCreate(null);
cellhanderl3.afterCellCreate(null); // cellhanderl3.afterCellCreate(null);
cellhanderl3.afterCellDataConverted(null); // cellhanderl3.afterCellDataConverted(null);
cellhanderl3.afterCellDispose(null); // cellhanderl3.afterCellDispose(null);
//
} //}
LOGGER.info("第三次:{}", System.currentTimeMillis() - start); //LOGGER.info("第三次:{}", System.currentTimeMillis() - start);
//
start = System.currentTimeMillis(); //start = System.currentTimeMillis();
for (int i = 0; i < 25000075; i++) { //for (int i = 0; i < 25000075; i++) {
Iterator<Cellhanderl> iterator = list.iterator(); // Iterator<Cellhanderl> iterator = list.iterator();
while (iterator.hasNext()) { // while (iterator.hasNext()) {
Cellhanderl writeHandler = iterator.next(); // Cellhanderl writeHandler = iterator.next();
writeHandler.beforeCellCreate(null); // writeHandler.beforeCellCreate(null);
writeHandler.afterCellCreate(null); // writeHandler.afterCellCreate(null);
writeHandler.afterCellDataConverted(null); // writeHandler.afterCellDataConverted(null);
writeHandler.afterCellDispose(null); // writeHandler.afterCellDispose(null);
} // }
} //}
//
LOGGER.info("第四次:{}", System.currentTimeMillis() - start); //LOGGER.info("第四次:{}", System.currentTimeMillis() - start);
//
start = System.currentTimeMillis(); //start = System.currentTimeMillis();
for (int i = 0; i < 25000075; i++) { //for (int i = 0; i < 25000075; i++) {
list.stream().forEach(writeHandler->{ // list.stream().forEach(writeHandler -> {
writeHandler.beforeCellCreate(null); // writeHandler.beforeCellCreate(null);
writeHandler.afterCellCreate(null); // writeHandler.afterCellCreate(null);
writeHandler.afterCellDataConverted(null); // writeHandler.afterCellDataConverted(null);
writeHandler.afterCellDispose(null); // writeHandler.afterCellDispose(null);
}); // });
} //}
//
LOGGER.info("第五次:{}", System.currentTimeMillis() - start); //LOGGER.info("第五次:{}", System.currentTimeMillis() - start);
} }
private void v2(Cellhanderl cellhanderl1) { private void v2(Cellhanderl cellhanderl1) {
@ -217,25 +274,45 @@ public class LargeDataTest {
cellhanderl1.afterCellDispose(null); 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 { private void read() throws Exception {
long start = System.currentTimeMillis(); long start = System.currentTimeMillis();
try (FileOutputStream fileOutputStream = new FileOutputStream(fileWritePoi07)) { //try (FileOutputStream fileOutputStream = new FileOutputStream(fileWritePoi07)) {
SXSSFWorkbook workbook = new SXSSFWorkbook(); // SXSSFWorkbook workbook = new SXSSFWorkbook();
SXSSFSheet sheet = workbook.createSheet("sheet1"); // SXSSFSheet sheet = workbook.createSheet("sheet1");
for (int i = 0; i < 20 * 5000; i++) { // for (int i = 0; i < 20 * 5000; i++) {
SXSSFRow row = sheet.createRow(i); // SXSSFRow row = sheet.createRow(i);
for (int j = 0; j < 25; j++) { // for (int j = 0; j < 25; j++) {
SXSSFCell cell = row.createCell(j); // SXSSFCell cell = row.createCell(j);
cell.setCellValue("str-" + j + "-" + i); // cell.setCellValue("str-" + j + "-" + i);
} // }
if (i % 5000 == 0) { // if (i % 5000 == 0) {
//LOGGER.info("{} write success.", i); // //LOGGER.info("{} write success.", i);
} // }
} // }
workbook.write(fileOutputStream); // workbook.write(fileOutputStream);
workbook.dispose(); // workbook.dispose();
workbook.close(); // workbook.close();
} //}
long costPoi = System.currentTimeMillis() - start; long costPoi = System.currentTimeMillis() - start;
LOGGER.info("poi写入消费:{}", 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.count2);
LOGGER.info("easyxcel写入:{}", CostUtil.count); LOGGER.info("easyxcel写入:{}", CostUtil.count);
LOGGER.info("easyxcel写入:{}", FillStyleCellWriteHandler.count); LOGGER.info("easyxcel写入:{}", FillStyleCellWriteHandler.count);
LOGGER.info("easyxcel写入:{}", WriteWorkbookHolder.count);
} }

Loading…
Cancel
Save