之前实现的导出功能都是在实体类上面加注解这样导出的字段都是固定的加注解的字段,很不灵活,如果想要实现用户可以自定义选择导出的字段就不能采用注解的方式实现了
/**
* 省
*/
@Excel(name = "省", needMerge = true)
private String province;
/**
* 市
*/
@Excel(name = "市", needMerge = true)
private String city;
/**
* 区
*/
@Excel(name = "区/县", needMerge = true)
private String area;
/**
* 详细地址
*/
@Excel(name = "详细地址", needMerge = true)
private String address;
想实现用户自定义字段导出,首先要让用户自定义选择好要导出的模版我们以JSON的形式存放到数据库中,其中value就是要导出的字段名。表中还可以存入表名等一些相关信息
[{"name":"公司名称","value":"companyName"},{"name":"省","value":"province"},{"name":"市","value":"city"},{"name":"区/县","value":"area"},{"name":"详细地址","value":"address"}]
当用户选择某一个模版导出时,只需把数据ID传入我们查出要导出的字段名
ExportParams exportParams = new ExportParams("企业信息", "企业信息");
exportParams.setStyle(ExcelStyleUtil.class);
exportParams.setDictHandler(excelDictHandler);
//根据ID查出要导出的字段
CommonUserExportField exportField = commonUserExportFieldService.getById(id);
//工具类构造动态导出表单 一对多导出 合并单元格 固定宽度
List<ExcelExportEntity> list = ExcelUtil.dynamicTemplate(exportField.getExportFieid());
//设置一对多中 的字段名
ExcelExportEntity excelentity = new ExcelExportEntity("股权结构", "shareholderStrs");
List<ExcelExportEntity> temp = new ArrayList<ExcelExportEntity>();
//股权结构中的字段名
ExcelExportEntity excelExportEntity = new ExcelExportEntity("股东名字", "shareholderName");
excelExportEntity.setHeight(-1);
temp.add(excelExportEntity);
//股权结构中的字段名2
ExcelExportEntity excelExportEntity1 = new ExcelExportEntity("持股比例", "ratio");
excelExportEntity1.setHeight(-1);
temp.add(excelExportEntity1);
excelentity.setList(temp);
list.add(excelentity);
//调用 方法exportParams为设置的sheet页信息 list为拼装好的导出字段信息 jsonObjects为数据项
workbook = ExcelExportUtil.exportExcel(exportParams,
list, jsonObjects);
构造动态表单方法 构造动态导出表单 一对多导出 合并单元格 固定宽度
public static List<ExcelExportEntity> dynamicTemplate(String field) {
List<Map> list = JSONUtil.toList(field, Map.class);
List<ExcelExportEntity> entity = new ArrayList<ExcelExportEntity>();
ExcelExportEntity excelentity = null;
for (Map map : list) {
//构造普通字段
excelentity = new ExcelExportEntity((String) map.get("name"), map.get("value"));
//宽度
excelentity.setWidth(15);
//是否合并 等价于注解中的needMerge = true
excelentity.setNeedMerge(true);
//高度 设置为-1为自适应高度 PS:好像没有效果
excelentity.setHeight(-1);
entity.add(excelentity);
}
return entity;
}
亲测有效的设置高度的方法
//设置-1为自适应高度,其他为对应的值
int lastRowNum = sheet.getLastRowNum();
for (int i = 0; i <=lastRowNum; i++) {
sheet.getRow(i).setHeight((short) -1);
}