easyPoi 注解导出 动态隐藏列
1.先写个poi工具类
/**
* 动态显示Excel导出列
* @param <T>
*/
public class EasyPoiUtil<T> {
/**
* 需要被反射的对象,使用泛型规范传入对象
*/
public T t;
/**
* 动态更改EasyPoi中控制列显示的值 * * @param columnName 需要转换的列属性名称 * @param target 默认true * @throws NoSuchFieldException * @throws IllegalAccessException
*/
public void hihdColumn(String columnName, Boolean target) throws Exception {
if (t == null) {
throw new ClassNotFoundException("TARGET OBJECT NOT FOUNT");
}
if (StringUtils.isEmpty(columnName)) {
throw new NullPointerException("COLUMN NAME NOT NULL");
}
if (target == null) {
target = true;
}
//获取目标对象的属性值
Field field = t.getClass().getDeclaredField(columnName);
//获取注解反射对象
Excel excelAnnon = field.getAnnotation(Excel.class);
//获取代理
InvocationHandler invocationHandler = Proxy.getInvocationHandler(excelAnnon);
Field excelField = invocationHandler.getClass().getDeclaredField("memberValues");
excelField.setAccessible(true);
Map memberValues = (Map) excelField.get(invocationHandler);
memberValues.put("isColumnHidden", target);
}
}
2.controller 中设置
@GetMapping("/export")
public BaseResult export(SysPost post) {
List<SysPost> list = postService.selectPostList(post);
/**
* 动态隐藏 列
*/
for (SysPost item : list){
EasyPoiUtil<SysPost> easyPoiUtil = new EasyPoiUtil<>();
easyPoiUtil.t = item;
try {
//隐藏bean 字段为postId的列
easyPoiUtil.hihdColumn("postId", true);
} catch (Exception e) {
log.info("列隐藏转换失败:{}", e.getMessage());
e.printStackTrace();
}
}
Workbook workbook = ExcelExportUtil.exportExcel(new ExportParams("岗位管理表", "岗位管理", ExcelType.XSSF),
SysPost.class, list);
return ExcelUtil.exportExcel(workbook, "岗位数据");
}
3.bean代码如下
@Data
public class SysPost extends BaseEntity
{
private static final long serialVersionUID = 1L;
/** 岗位序号 */
@Excel(name = "岗位序号",orderNum = "1",width = 20)
private Long postId;
/** 岗位编码 */
@Excel(name = "岗位编码",orderNum = "2",width = 20)
@NotBlank(message = "岗位编码不能为空")
@Size(min = 0, max = 64, message = "岗位编码长度不能超过64个字符")
private String postCode;
/** 岗位名称 */
@Excel(name = "岗位名称",orderNum = "3",width = 20)
@NotBlank(message = "岗位名称不能为空")
@Size(min = 0, max = 50, message = "岗位名称长度不能超过50个字符")
private String postName;
/** 岗位排序 */
@Excel(name = "岗位排序",orderNum = "4",width = 10)
@NotBlank(message = "显示顺序不能为空")
private String postSort;
/** 状态(0正常 1停用) */
@Excel(name = "状态",orderNum = "5",width = 20,replace = {"正常_0","停用_1"})
private String status;
}