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);
    }
}
相关推荐
驭渊的小故事3 小时前
MyBatis XML 开发实战:从配置到 CRUD 全解析
xml·java·mybatis
哦虎!8 小时前
【JavaEE】网络初识
java
for_ever_love__8 小时前
MySQL ORDER BY 排序优化:从 Using filesort 到索引有序扫描(含双路 / 单路排序原理)
java·mysql·优化·存储·by·order·filesort
我是人✓9 小时前
Java文件上传三方式对比:从传统到SpringBoot
java·开发语言
欣栀♡9 小时前
JVM 频繁 Full GC 先看日志括号里的 cause,jstat 的 FGC 在 JDK 8 上会骗人
java·jvm
IT研究室9 小时前
最新计算机毕业设计选题推荐-基于spring boot的葡萄酒文化宣传网站-网站-文档指导-Java-springboot
java·spring boot·课程设计
慧都小项9 小时前
MyEclipse 中创建和测试 JAX-RS REST 接口:从项目配置到 REST Explorer
java·restful·myeclipse·jax-rs
Wang's Blog9 小时前
Java 项目实战: 交友项目 - 入门案例:编写 Dubbo 服务提供者
java·dubbo·交友
秋饼10 小时前
Spring AI 2.0 结构化输出企业级实战:从 BeanOutputConverter 源码到生产级解析容错
java·ai·技术分享·后端开发
摇滚侠10 小时前
《计算机是如何工作的:人人都能懂的计算机软硬件工作原理》第 9 章 机器码与汇编语言 阅读笔记 9
java·开发语言·笔记