EasyPOI导出动态表头

PO

bash 复制代码
import cn.afterturn.easypoi.excel.annotation.Excel;
import cn.afterturn.easypoi.handler.inter.IExcelDataModel;
import cn.afterturn.easypoi.handler.inter.IExcelModel;
import lombok.Data;

import javax.validation.constraints.NotNull;

@Data
public class BaseMaterialProductExcel implements IExcelDataModel, IExcelModel {


    /** 名称 */
    @NotNull(message = "名称不能为空")
    @Excel(name = "名称",width=20D)
    private String materialName;

    /** 规格型号 */
    // 规格型号 字典:jdz_prodect_spec
    @NotNull(message = "规格型号")
    @Excel(name = "规格型号",width=20D)
    private String specification;

    /** 单位 */
    //单位 字典:jdz_product_unit
    @NotNull(message = "单位不能为空")
    @Excel(name = "单位",width=20D)
    private String unit;





    private String erroMsg;

    private Integer rowNum;

    @Override
    public String getErrorMsg() {
        return this.erroMsg;
    }

    @Override
    public void setErrorMsg(String errorMsg) {
        this.erroMsg = errorMsg;
    }

    @Override
    public Integer getRowNum() {
        return this.rowNum;
    }

    @Override
    public void setRowNum(Integer rowNum) {
        this.rowNum = rowNum;
    }


}

controller

bash 复制代码
 /**
     * 查询泡豆单导出
     */
    @GetMapping("/importMaterialProductList")
    public Result importMaterialProductList(@RequestParam("file") final MultipartFile file) throws IOException {
        String msg = baseMaterialProductService.importMaterialProductList(file.getInputStream(), getCompanyId());
        return ResultGenerator.getSuccessResult(msg);
    }


    /**
     * 主产品导出
     */
    @GetMapping("/exportMaterialProductList")
    public void exportMaterialProductList(BaseMaterialProduct materialBillInfo, HttpServletResponse response) {
       //需要导出的数据
        List<BaseMaterialProductExcel> pageInfo = baseMaterialProductService.exportMaterialProductList(materialBillInfo);
        // 设置表头配置,重点
        BaseMaterialProductExcel materialProdExceBeanClass = baseMaterialProductService.getMaterialProdExceBeanClass(getCompanyId());

        final Workbook workbook = ExcelExportUtil.exportExcel(new ExportParams(null, "产成品", ExcelType.XSSF),
                materialProdExceBeanClass.getClass(), pageInfo);
        OutputStream out = null;
        try {
            out = response.getOutputStream();
            response.setHeader("Access-Control-Expose-Headers","Content-Disposition");
            response.setContentType("application/vnd.ms-excel");
            response.setHeader("Content-Disposition", "attachment; filename=" + URLEncoder.encode("产成品"+LocalDateTime.now() , "UTF-8")+".xls");

            workbook.write(out);
            out.flush();
        } catch (final Exception e) {

        } finally {
            try {
                out.close();
            } catch (final IOException e) {
            }
        }
    }

baseMaterialProductService

bash 复制代码
    @Override
    public BaseMaterialProductExcel getMaterialProdExceBeanClass(Integer companyId) {

        List<IotDictionary> jdz_product_unit = new LinkedList<>();
        List<IotDictionary> jdz_prodect_spec = new LinkedList<>();

        // 单位
        jdz_product_unit = dictionaryMapper.selectDictionaryByDictType(companyId,"jdz_product_unit");
        // 规格
        jdz_prodect_spec = dictionaryMapper.selectDictionaryByDictType(companyId,"jdz_prodect_spec");

        // 封装动态表头
        StringBuffer prodUnit = new StringBuffer("单位[");
        jdz_product_unit.stream().forEach(e->prodUnit.append(",").append(e.getDicName()));
        prodUnit.append("]");
        String unit = prodUnit.toString().replaceFirst(",", "");

        StringBuffer prodect_spec = new StringBuffer("规格型号[");
        jdz_prodect_spec.stream().forEach(e->prodect_spec.append(",").append(e.getDicName()));
        prodect_spec.append("]");
        String spec = prodect_spec.toString().replaceFirst(",", "");

        // 替换easyPoi @Excel 的name值
        BaseMaterialProductExcel excel = new BaseMaterialProductExcel();
        IotAnnotationUtils.changeAnnotationValue("specification",excel.getClass(), Excel.class,"name",spec);
        IotAnnotationUtils.changeAnnotationValue("unit",excel.getClass(), Excel.class,"name",unit);

        return excel;
    }

IotAnnotationUtils

bash 复制代码
import java.lang.annotation.Annotation;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Proxy;
import java.util.Map;

public class IotAnnotationUtils {
    /**
     * 变更注解的属性值
     *
     * @param variableName  属性名称
     * @param clazz     注解所在的实体类
     * @param tClass    注解类
     * @param filedName 要修改的注解属性名
     * @param value     要设置的属性值
     */
    public static <A extends Annotation> Class<?> changeAnnotationValue(String variableName, Class<?> clazz, Class<A> tClass, String filedName, Object value) {
        try {
            // 返回所有的属性
            Field field = clazz.getDeclaredField(variableName);
            A annotation = field.getAnnotation(tClass);
            setAnnotationValue(annotation, filedName, value);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return clazz;
    }

    /**
     * 设置注解中的字段值
     *
     * @param annotation   要修改的注解实例
     * @param fieldName    要修改的注解属性名
     * @param value        要设置的属性值
     */
    public static void setAnnotationValue( Annotation annotation, String fieldName, Object value) throws NoSuchFieldException, IllegalAccessException {
        InvocationHandler handler = Proxy.getInvocationHandler(annotation);
        Field field = handler.getClass().getDeclaredField("memberValues");
        //允许访问私有变量
        field.setAccessible(true);
        // 获取 memberValues
        Map memberValues = (Map) field.get(handler);
        // 修改 value 属性值
        memberValues.put(fieldName, value);
    }
}
相关推荐
考虑考虑20 小时前
Jpa使用union all
java·spring boot·后端
用户37215742613520 小时前
Java 实现 Excel 与 TXT 文本高效互转
java
浮游本尊21 小时前
Java学习第22天 - 云原生与容器化
java
渣哥1 天前
原来 Java 里线程安全集合有这么多种
java
间彧1 天前
Spring Boot集成Spring Security完整指南
java
间彧1 天前
Spring Secutiy基本原理及工作流程
java
Java水解1 天前
JAVA经典面试题附答案(持续更新版)
java·后端·面试
洛小豆1 天前
在Java中,Integer.parseInt和Integer.valueOf有什么区别
java·后端·面试
前端小张同学1 天前
服务器上如何搭建jenkins 服务CI/CD😎😎
java·后端
ytadpole1 天前
Spring Cloud Gateway:一次不规范 URL 引发的路由转发404问题排查
java·后端