diff --git a/fastexcel/src/main/java/cn/idev/excel/annotation/write/style/HeadStyle.java b/fastexcel/src/main/java/cn/idev/excel/annotation/write/style/HeadStyle.java index 5bb19873b..b79b82e34 100644 --- a/fastexcel/src/main/java/cn/idev/excel/annotation/write/style/HeadStyle.java +++ b/fastexcel/src/main/java/cn/idev/excel/annotation/write/style/HeadStyle.java @@ -5,6 +5,9 @@ import cn.idev.excel.enums.poi.FillPatternTypeEnum; import cn.idev.excel.enums.poi.HorizontalAlignmentEnum; import cn.idev.excel.enums.poi.VerticalAlignmentEnum; +import cn.idev.excel.write.handler.impl.HiddenShellWriteHandler; +import cn.idev.excel.write.metadata.holder.WriteSheetHolder; +import cn.idev.excel.write.metadata.holder.WriteWorkbookHolder; import java.lang.annotation.ElementType; import java.lang.annotation.Inherited; import java.lang.annotation.Retention; @@ -31,6 +34,7 @@ /** * Set the cell's using this style to be hidden + * @see HiddenShellWriteHandler#afterSheetCreate(WriteWorkbookHolder writeWorkbookHolder, WriteSheetHolder writeSheetHolder) */ BooleanEnum hidden() default BooleanEnum.DEFAULT; diff --git a/fastexcel/src/main/java/cn/idev/excel/write/handler/impl/HiddenRowWriteHandler.java b/fastexcel/src/main/java/cn/idev/excel/write/handler/impl/HiddenRowWriteHandler.java new file mode 100644 index 000000000..5c9e47489 --- /dev/null +++ b/fastexcel/src/main/java/cn/idev/excel/write/handler/impl/HiddenRowWriteHandler.java @@ -0,0 +1,79 @@ +package cn.idev.excel.write.handler.impl; + +import cn.idev.excel.write.handler.RowWriteHandler; +import cn.idev.excel.write.metadata.holder.WriteSheetHolder; +import cn.idev.excel.write.metadata.holder.WriteTableHolder; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Objects; +import lombok.Getter; +import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.lang3.StringUtils; +import org.apache.poi.ss.usermodel.Row; + +/** + * Hides rows in the sheet. + */ +@Getter +public class HiddenRowWriteHandler implements RowWriteHandler { + + /*** + * sheetNo + */ + private final Integer sheetNo; + + /*** + * sheetName + */ + private final String sheetName; + + private Collection hiddenColumns = new ArrayList<>(); + + public HiddenRowWriteHandler() { + this.sheetNo = null; + this.sheetName = null; + } + + public HiddenRowWriteHandler(Integer sheetNo, String sheetName) { + this.sheetNo = sheetNo; + this.sheetName = sheetName; + } + + public HiddenRowWriteHandler(Integer sheetNo, String sheetName, Collection hiddenColumns) { + if (CollectionUtils.isNotEmpty(hiddenColumns)) { + this.hiddenColumns = hiddenColumns; + } + this.sheetNo = sheetNo; + this.sheetName = sheetName; + } + + public HiddenRowWriteHandler addHiddenColumns(Collection hiddenColumns) { + this.hiddenColumns.addAll(hiddenColumns); + return this; + } + + public HiddenRowWriteHandler addHiddenColumns(Integer hiddenColumn) { + this.hiddenColumns.add(hiddenColumn); + return this; + } + + @Override + public void afterRowDispose( + WriteSheetHolder writeSheetHolder, + WriteTableHolder writeTableHolder, + Row row, + Integer relativeRowIndex, + Boolean isHead) { + if (CollectionUtils.isEmpty(this.hiddenColumns)) { + return; + } + boolean isSheetName = + (null == this.sheetName || StringUtils.equals(this.sheetName, writeSheetHolder.getSheetName())); + boolean isSheetNo = (null == this.sheetNo || Objects.equals(this.sheetNo, writeSheetHolder.getSheetNo())); + if (isSheetName && isSheetNo) { + if (this.hiddenColumns.contains(relativeRowIndex)) { + row.setZeroHeight(true); + } + } + } +} diff --git a/fastexcel/src/main/java/cn/idev/excel/write/handler/impl/HiddenShellWriteHandler.java b/fastexcel/src/main/java/cn/idev/excel/write/handler/impl/HiddenShellWriteHandler.java new file mode 100644 index 000000000..feb5bf96b --- /dev/null +++ b/fastexcel/src/main/java/cn/idev/excel/write/handler/impl/HiddenShellWriteHandler.java @@ -0,0 +1,36 @@ +package cn.idev.excel.write.handler.impl; + +import cn.idev.excel.annotation.write.style.HeadStyle; +import cn.idev.excel.metadata.property.StyleProperty; +import cn.idev.excel.util.BooleanUtils; +import cn.idev.excel.write.handler.SheetWriteHandler; +import cn.idev.excel.write.metadata.holder.WriteSheetHolder; +import cn.idev.excel.write.metadata.holder.WriteWorkbookHolder; +import cn.idev.excel.write.property.ExcelWriteHeadProperty; +import org.apache.poi.ss.usermodel.Sheet; + +/** + * Hides columns in the sheet. + * + * @see HeadStyle#hidden() + */ +public class HiddenShellWriteHandler implements SheetWriteHandler { + + @Override + public void afterSheetCreate(WriteWorkbookHolder writeWorkbookHolder, WriteSheetHolder writeSheetHolder) { + ExcelWriteHeadProperty excelWriteHeadProperty = writeWorkbookHolder.getExcelWriteHeadProperty(); + if (excelWriteHeadProperty != null) { + excelWriteHeadProperty.getHeadMap().forEach((key, value) -> { + if (null != value) { + StyleProperty headStyleProperty = value.getHeadStyleProperty(); + if (null != headStyleProperty) { + if (BooleanUtils.isTrue(headStyleProperty.getHidden())) { + Sheet sheet = writeSheetHolder.getSheet(); + sheet.setColumnHidden(key, true); + } + } + } + }); + } + } +} diff --git a/fastexcel/src/main/java/cn/idev/excel/write/metadata/holder/AbstractWriteHolder.java b/fastexcel/src/main/java/cn/idev/excel/write/metadata/holder/AbstractWriteHolder.java index 4485c2bdd..d2fbc67c9 100644 --- a/fastexcel/src/main/java/cn/idev/excel/write/metadata/holder/AbstractWriteHolder.java +++ b/fastexcel/src/main/java/cn/idev/excel/write/metadata/holder/AbstractWriteHolder.java @@ -23,6 +23,7 @@ import cn.idev.excel.write.handler.chain.SheetHandlerExecutionChain; import cn.idev.excel.write.handler.chain.WorkbookHandlerExecutionChain; import cn.idev.excel.write.handler.context.CellWriteHandlerContext; +import cn.idev.excel.write.handler.impl.HiddenShellWriteHandler; import cn.idev.excel.write.merge.LoopMergeStrategy; import cn.idev.excel.write.merge.OnceAbsoluteMergeStrategy; import cn.idev.excel.write.metadata.WriteBasicParameter; @@ -282,6 +283,9 @@ protected void initAnnotationConfig(List handlerList, WriteBasicPa dealColumnWidth(handlerList); } + // fix #116 + handlerList.add(new HiddenShellWriteHandler()); + dealStyle(handlerList); dealRowHigh(handlerList); dealOnceAbsoluteMerge(handlerList); diff --git a/fastexcel/src/test/java/cn/idev/excel/fix/issue116/HiddenRowTest.java b/fastexcel/src/test/java/cn/idev/excel/fix/issue116/HiddenRowTest.java new file mode 100644 index 000000000..67ff93467 --- /dev/null +++ b/fastexcel/src/test/java/cn/idev/excel/fix/issue116/HiddenRowTest.java @@ -0,0 +1,55 @@ +package cn.idev.excel.fix.issue116; + +import cn.idev.excel.EasyExcel; +import cn.idev.excel.annotation.ExcelProperty; +import cn.idev.excel.annotation.write.style.HeadStyle; +import cn.idev.excel.enums.BooleanEnum; +import cn.idev.excel.test.util.TestFileUtil; +import cn.idev.excel.write.handler.impl.HiddenRowWriteHandler; +import java.util.ArrayList; +import java.util.List; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +import org.junit.jupiter.api.Test; + +/** + * @see HiddenRowWriteHandler + */ +public class HiddenRowTest { + + @Test + public void test() { + String fileName = TestFileUtil.getPath() + "hiddenRowTest" + System.currentTimeMillis() + ".xlsx"; + List dataList = new ArrayList<>(); + HiddenRowWriteHandler hiddenRowWriteHandler = new HiddenRowWriteHandler(); + for (int i = 2; i <= 50; i++) { + String category = "我是姓名" + i; + DemoModel exportModel = new DemoModel(category, i, "test-" + i); + dataList.add(exportModel); + if (i % 5 == 0) { + hiddenRowWriteHandler.addHiddenColumns(i - 2); + } + } + EasyExcel.write(fileName, DemoModel.class) + .sheet("模板") + .registerWriteHandler(hiddenRowWriteHandler) + .doWrite(dataList); + } + + @Data + @AllArgsConstructor + @NoArgsConstructor + public static class DemoModel { + + @ExcelProperty("名字") + @HeadStyle(hidden = BooleanEnum.TRUE) + private String name; + + @ExcelProperty("年龄") + private Integer age; + + @ExcelProperty("test") + private String test; + } +} diff --git a/fastexcel/src/test/java/cn/idev/excel/fix/issue116/HiddenShellTest.java b/fastexcel/src/test/java/cn/idev/excel/fix/issue116/HiddenShellTest.java new file mode 100644 index 000000000..fe262f5b0 --- /dev/null +++ b/fastexcel/src/test/java/cn/idev/excel/fix/issue116/HiddenShellTest.java @@ -0,0 +1,51 @@ +package cn.idev.excel.fix.issue116; + +import cn.idev.excel.EasyExcel; +import cn.idev.excel.annotation.ExcelProperty; +import cn.idev.excel.annotation.write.style.HeadStyle; +import cn.idev.excel.enums.BooleanEnum; +import cn.idev.excel.test.util.TestFileUtil; +import java.util.ArrayList; +import java.util.List; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +import org.junit.jupiter.api.Test; + +/** + * @see cn.idev.excel.write.handler.impl.HiddenShellWriteHandler + */ +public class HiddenShellTest { + + @Test + public void test() { + String fileName = TestFileUtil.getPath() + "hiddenShellTest" + System.currentTimeMillis() + ".xlsx"; + EasyExcel.write(fileName, DemoModel.class).sheet("模板").doWrite(listDemoModel()); + } + + public static List listDemoModel() { + List dataList = new ArrayList<>(); + for (int i = 1; i <= 5; i++) { + String category = "我是姓名" + i; + DemoModel exportModel = new DemoModel(category, i, "test" + i); + dataList.add(exportModel); + } + return dataList; + } + + @Data + @AllArgsConstructor + @NoArgsConstructor + public static class DemoModel { + + @ExcelProperty("名字") + private String name; + + @ExcelProperty("年龄") + @HeadStyle(hidden = BooleanEnum.TRUE) + private Integer age; + + @ExcelProperty("test") + private String test; + } +}