Skip to content
Open
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
package cn.idev.excel.test.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.*;
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

don't use *

import org.junit.jupiter.api.Test;

/**
* @author zz_zhi
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please remove author's info

*/
public class HiddenRowTest {

@Test
public void test() {
String fileName = TestFileUtil.getPath() + "hiddenRowTest" + System.currentTimeMillis() + ".xlsx";
List<DemoModel> 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;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
package cn.idev.excel.test.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.*;
import org.junit.jupiter.api.Test;

/**
* @author zz_zhi
*/
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<DemoModel> listDemoModel() {
List<DemoModel> 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;
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can you try to write a real unit test? not just perform the method

}

@Data
@AllArgsConstructor
@NoArgsConstructor
public static class DemoModel {

@ExcelProperty("名字")
private String name;

@ExcelProperty("年龄")
@HeadStyle(hidden = BooleanEnum.TRUE)
private Integer age;

@ExcelProperty("test")
private String test;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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;

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,76 @@
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.*;
import lombok.Getter;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import org.apache.poi.ss.usermodel.Row;

/**
* @author zz_zhi
*/
@Getter
public class HiddenRowWriteHandler implements RowWriteHandler {
/***
* sheetNo
*/
private final Integer sheetNo;

/***
* sheetName
*/
private final String sheetName;

private Collection<Integer> 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<Integer> hiddenColumns) {
if (CollectionUtils.isNotEmpty(hiddenColumns)) {
this.hiddenColumns = hiddenColumns;
}
this.sheetNo = sheetNo;
this.sheetName = sheetName;
}

public HiddenRowWriteHandler addHiddenColumns(Collection<Integer> 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);
}
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
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.
*
* @author zz_zhi
* @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);
}
}
}
});
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -284,6 +285,9 @@ protected void initAnnotationConfig(List<WriteHandler> handlerList, WriteBasicPa
dealColumnWidth(handlerList);
}

// fix #116
handlerList.add(new HiddenShellWriteHandler());

dealStyle(handlerList);
dealRowHigh(handlerList);
dealOnceAbsoluteMerge(handlerList);
Expand Down