java导出定制列数的excel表

   当下许多业务都需对列表进行导出,而且还需对于列表中所有列表选择几项进行导出。
   在项目中,我们使用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;
    }

}

以上内容,仅供参考。

你可能感兴趣的:(java,excel,状态模式)