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);
    }
}
相关推荐
四谎真好看1 小时前
Java 黑马程序员学习笔记(进阶篇18)
java·笔记·学习·学习笔记
桦说编程1 小时前
深入解析CompletableFuture源码实现(2)———双源输入
java·后端·源码
java_t_t1 小时前
ZIP工具类
java·zip
lang201509282 小时前
Spring Boot优雅关闭全解析
java·spring boot·后端
pengzhuofan2 小时前
第10章 Maven
java·maven
百锦再3 小时前
Vue Scoped样式混淆问题详解与解决方案
java·前端·javascript·数据库·vue.js·学习·.net
刘一说3 小时前
Spring Boot 启动慢?启动过程深度解析与优化策略
java·spring boot·后端
壹佰大多3 小时前
【spring如何扫描一个路径下被注解修饰的类】
java·后端·spring
百锦再3 小时前
对前后端分离与前后端不分离(通常指服务端渲染)的架构进行全方位的对比分析
java·开发语言·python·架构·eclipse·php·maven
DokiDoki之父3 小时前
Spring—注解开发
java·后端·spring