EasyPOI导出动态表头

该文章介绍了如何在Java项目中,利用EasyPoi库处理Excel数据,包括创建BaseMaterialProductExcel数据模型,以及在Controller中进行文件导入和导出操作,同时实现动态生成表头功能。
摘要由CSDN通过智能技术生成

PO


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

 /**
     * 查询泡豆单导出
     */
    @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


    @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


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
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值