当下许多业务都需对列表进行导出,而且还需对于列表中所有列表选择几项进行导出。
在项目中,我们使用swagger完成接口的文档定义,通过注解完成数据列的列名与字段名,以及枚举类型(字典表)配置,完成相应的后,只需前端在对应列上赋上展示顺序就可以完成定制列的列表导出。
前端接口对应类定义:
package com.bean.vo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@ApiModel(description = "导出对象")
@Data
@AllArgsConstructor
@NoArgsConstructor
public class ExpQuery extends Query {
@ApiModelProperty(name = "expCols", value = "导出列")
private ExpVo expCols;
}
导出对象类继承列表的查询类,完成列表查询条件的不变。增加expCols属性来完成导出列的配置。
package com.bean.vo;
import com.alibaba.fastjson.annotation.JSONField;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.jfinger.cloud.annotation.Dict;
import java.math.BigDecimal;
import java.util.Date;
@ApiModel(description = "导出设置表")
@Data
@AllArgsConstructor
@NoArgsConstructor
public class ExpVo {
@ApiModelProperty(name = "expCols.applyNo", value = "申报编号")
private Integer applyNo;
@ApiModelProperty(name="expCols.recordProjectCode",value="备案项目代码")
private Integer recordProjectCode;
@Dict(dicCode = "common_yes_no")
@ApiModelProperty(name="expCols.creditLossFlag",value="是否失信企业")
private Integer creditLossFlag;
}
通过注解ApiModelProperty完成属性与列名对配置,通过注解Dict完成字典表的对应。前端调用时相应的值进行排序。
导出设置表所属应与导出对象一一对应。
接口实现类示例:
@ApiOperation(value = "导出列表", notes = "liyw@导出列表")
@GetMapping("/exportList")
public void exportList(Query query, HttpServletResponse response) throws Exception {
query.setPageSize(10000);
//取1万条数据
IPage<GovList> pageInfo = service.listGovPage(query);
List<ExportColSet> cols = new ArrayList<>();
//填充导出列设置,并返回列表标题
List<List<String>> heads = exportUtils.getHeads(query.getExpCols(), cols);
List<List<String>> values = new ArrayList<>();
//填充每行内容
for(GovList gov: pageInfo.getRecords()){
List<String> value = exportUtils.getValues(detail, cols);
values.add(value);
}
response.setContentType("application/vnd.ms-excel");
response.setCharacterEncoding("utf-8");
String fileName = URLEncoder.encode("导出列表","utf-8");
response.setHeader("Content-disposition", "attachment;filename=" + fileName + ".xlsx");
//使用EasyExcel完成数据组装
EasyExcel.write(response.getOutputStream())
.head(heads).registerWriteHandler(new LongestMatchColumnWidthStyleStrategy())
.sheet(" 列表").doWrite(values);
}
public class ExportColSet{
//表格列名
private String title;
//表格排序
private Integer order;
//对应的属性名,如果是子类时属性时,以.分隔
private String fieldName;
//字典表对应的key
private String code;
}
取列表标题以及取列表内容实现类
package com..util;
import com..SysDdUtil;
import com..bean.vo.ExportColSet;
import com.annotation.Dict;
import io.swagger.annotations.ApiModelProperty;
import org.apache.commons.beanutils.BeanUtilsBean;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.util.ClassUtils;
import java.beans.PropertyDescriptor;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.List;
@Component
public class ExcelDefColsExportUtils {
@Autowired
private SysDdUtil sysDdUtil;
private ExcelDefColsExportUtils() {
}
private void setExportCols(BeanUtilsBean beanutil, Object o, List<ExportColSet> cols, String fieldPre){
PropertyDescriptor[] sourDescriptors = beanutil.getPropertyUtils().getPropertyDescriptors(o.getClass());
for (int i = 0; i < sourDescriptors.length; i++) {
String name = sourDescriptors[i].getName();
try {
Field field = o.getClass().getDeclaredField(name);
Object oValue = beanutil.getPropertyUtils().getSimpleProperty(o, name);
if (oValue != null) {
String className = oValue.getClass().getSimpleName();
if ("Integer".equals(className)) {
Integer value = (Integer) oValue;
if (value != null && value > 0) {
ApiModelProperty pro = field.getAnnotation(ApiModelProperty.class);
if (pro != null) {
ExportColSetcol = new ExportColSet();
col.setTitle(pro.value());
col.setOrder(value);
col.setFieldName(fieldPre + name);
Dict dict = field.getAnnotation(Dict.class);
if (dict != null) {
col.setCode(dict.dicCode());
} else {
col.setCode("");
}
cols.add(col);
}
}
} else if(!ClassUtils.isPrimitiveOrWrapper(oValue.getClass()) && !oValue.getClass().isAssignableFrom(String.class)){
//如果有成员为对象时可以向下检索
setExportCols(beanutil, oValue, cols, fieldPre + name + ".");
}
}
}catch (Exception e){
}
}
}
public Object getFieldValue(Object o, String strfield){
Object ret = null;
try {
Field field = o.getClass().getDeclaredField(strfield);
if (field != null){
field.setAccessible(true);
ret = field.get(o);
field.setAccessible(false);
Dict dict = field.getAnnotation(Dict.class);
if (dict != null){
//返回字典名称
return sysDdUtil.getDictListValue(dict.dicCode(), ret.toString());
}
}
}
} catch (Exception e) {
}
return ret;
}
public Object getFieldValues(Object o, String strfield){
Object ret = o;
String[] fields = null;
if(StringUtils.isNotBlank(strfield)){
fields = strfield.split("\\.");
}
for(String fn : fields){
ret = getFieldValue(ret, fn);
if (ret == null){
return "";
}
}
return ret;
}
public List<List<String>> getHeads(Object expVo, List<ExportColSet> cols){
List<List<String>> ret = new ArrayList<>();
BeanUtilsBean beanutil =BeanUtilsBean.getInstance();
setExportCols(beanutil, expVo, cols, "");
//进行列排序
cols.sort((t1,t2) ->{return t1.getOrder().compareTo(t2.getOrder());});
for(SmeExportCol col : cols){
List<String> heads = new ArrayList<>();
heads.add(col.getTitle());
ret.add(heads);
}
return ret;
}
public List<String> getValues(Object detail, List<ExportColSet> cols){
List<String> value = new ArrayList<>();
for(ExportColSet col : cols){
Object o = getFieldValues(detail, col.getFieldName());
if(o == null){
value.add("");
}else {
value.add(o.toString());
}
}
return value;
}
}
以上内容,仅供参考。