首页 > 其他分享 >EasyExecl导出模板,实现动态下拉列

EasyExecl导出模板,实现动态下拉列

时间:2022-08-15 23:11:10浏览次数:54  
标签:map String dropDownSetField 下拉列 EasyExecl import null response 模板

1.需要效果.

 

 

2.引入的jar包.

        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>easyexcel</artifactId>
            <version>2.0.2</version>
        </dependency>

3.自定义注解.

import java.lang.annotation.*;

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.FIELD})
public @interface DropDownSetField {

     /*
     * 定义固定下拉内容
     */
    String[] source() default {};
 
    /*
     * 列标号必须和字段下标一致
     */
    int indexNum() default 0;
}

4.实体类添加 easyexecl注释 和自定义注释.

 

 

5.controller.

    @GetMapping("/downloadTemplate")
    public void downloadTemplate(HttpServletResponse response) {
        try {
            Field[] fields = MerchantsCarrier.class.getDeclaredFields();
            Map<Integer, String[]> map = new HashMap<>();
            Field field = null;
            for (int i = 0; i < fields.length; i++) {
                field = fields[i];
                DropDownSetField dropDownSetField = field.getAnnotation(DropDownSetField.class);
                if (null != dropDownSetField) {
                    String[] name = dropDownSetField.source();
                    if (name != null) {
                        ExcelUtil.insertMap(map, name, dropDownSetField, i);
                    } else {
                        ExcelUtil.insertMap(map, null, dropDownSetField, i);
                    }

                }
            }
            String fileName = URLEncoder.encode("导入招商载体模板.xlsx", "UTF-8");
            OutputStream fileOutputStream = null;
            response.setHeader("Content-Disposition", "attachment;filename=" + fileName);
            response.setContentType("application/x-download");
            response.setCharacterEncoding("UTF-8");
            response.addHeader("Pargam", "no-cache");
            response.addHeader("Cache-Control", "no-cache");
            response.flushBuffer();
            fileOutputStream = response.getOutputStream();
            ExcelWriter excelWriter = EasyExcel.write(fileOutputStream, MerchantsCarrier.class)
                    .registerWriteHandler(new ProductCellWriteHandler(map)).build();
            WriteSheet sheet = EasyExcel.writerSheet(0, "导入招商载体模板").build();
            excelWriter.write(null, sheet);
            excelWriter.finish();
            fileOutputStream.flush();
            fileOutputStream.close();
        } catch (Exception e) {
            log.error("下载模板失败", e);
        }
    }

6.工具类

import java.io.OutputStream;
import java.net.URLEncoder;
import java.util.List;
import java.util.Map;
import java.util.Optional;

import javax.servlet.http.HttpServletResponse;

import org.apache.poi.ss.usermodel.HorizontalAlignment;

import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.support.ExcelTypeEnum;
import com.alibaba.excel.write.metadata.style.WriteCellStyle;
import com.alibaba.excel.write.style.HorizontalCellStyleStrategy;

public class ExcelUtil {

    public static void writeExcel(HttpServletResponse response, List<? extends Object> data, String fileName,
            String sheetName, Class<?> clazz) throws Exception {
        // 表头样式
        WriteCellStyle headWriteCellStyle = new WriteCellStyle();
        // 设置表头居中对齐
        headWriteCellStyle.setHorizontalAlignment(HorizontalAlignment.CENTER);
        // 内容样式
        WriteCellStyle contentWriteCellStyle = new WriteCellStyle();
        // 设置内容靠左对齐
        contentWriteCellStyle.setHorizontalAlignment(HorizontalAlignment.LEFT);
        HorizontalCellStyleStrategy horizontalCellStyleStrategy = new HorizontalCellStyleStrategy(headWriteCellStyle,
                contentWriteCellStyle);
        EasyExcel.write(getOutputStream(fileName, response), clazz).excelType(ExcelTypeEnum.XLSX).sheet(sheetName)
                .registerWriteHandler(horizontalCellStyleStrategy).doWrite(data);
    }

    private static OutputStream getOutputStream(String fileName, HttpServletResponse response) throws Exception {
        fileName = URLEncoder.encode(fileName, "UTF-8");
        response.setContentType("application/vnd.ms-excel");
        response.setCharacterEncoding("utf8");
        response.setHeader("Content-Disposition", "attachment;filename=" + fileName + ".xlsx");
        return response.getOutputStream();
    }
    
    public static String[] resove(DropDownSetField dropDownSetField, String[] strings) {
        if (!Optional.ofNullable(dropDownSetField).isPresent()) {
            return null;
        }
 
        // 获取固定下拉信息
        String[] source = dropDownSetField.source();
        if (null != source && source.length > 0) {
            return source;
        }
 
        if (null != strings && strings.length > 0) {
            try {
                String[] dynamicSource = strings;
                if (null != dynamicSource && dynamicSource.length > 0) {
                    return dynamicSource;
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        return null;
    }
    
 
    //插入到map中
    public static void insertMap(Map<Integer, String[]> map, String[] params, DropDownSetField dropDownSetField, int i) {
        String[] sources = ExcelUtil.resove(dropDownSetField, params);
        if (null != sources && sources.length > 0) {
            map.put(i, sources);
        }
    }
}

7.监听器

import java.util.Map;

import org.apache.poi.ss.usermodel.DataValidation;
import org.apache.poi.ss.usermodel.DataValidationConstraint;
import org.apache.poi.ss.usermodel.DataValidationHelper;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.util.CellRangeAddressList;
import org.springframework.stereotype.Component;

import com.alibaba.excel.write.handler.SheetWriteHandler;
import com.alibaba.excel.write.metadata.holder.WriteSheetHolder;
import com.alibaba.excel.write.metadata.holder.WriteWorkbookHolder;

@Component
public class ProductCellWriteHandler implements SheetWriteHandler{

    private Map<Integer,String[]> map = null;
     
    public ProductCellWriteHandler(Map<Integer,String[]> map){
        this.map = map;
    }
 
    @Override
    public void beforeSheetCreate(WriteWorkbookHolder writeWorkbookHolder, WriteSheetHolder writeSheetHolder) {
    }
 
    @Override
    public void afterSheetCreate(WriteWorkbookHolder writeWorkbookHolder, WriteSheetHolder writeSheetHolder) {
        // 这里可以对cell进行任何操作
        Sheet sheet = writeSheetHolder.getSheet();
        DataValidationHelper helper = sheet.getDataValidationHelper();
        // k 为存在下拉数据集的单元格下表, v为下拉数据集
        map.forEach((k, v) -> {
            // 下拉列表约束数据
            DataValidationConstraint constraint = helper.createExplicitListConstraint(v);
            // 设置下拉单元格的首行, 末行,首列, 末列
            CellRangeAddressList rangeList = new CellRangeAddressList(1, 65536, k, k);
            // 设置约束
            DataValidation validation = helper.createValidation(constraint, rangeList);
            validation.setErrorStyle(DataValidation.ErrorStyle.STOP);
            validation.setShowErrorBox(true);
            validation.setSuppressDropDownArrow(true);
            validation.createErrorBox("提示","请输入正确的格式的值");
            sheet.addValidationData(validation);
        });
    }

}

 

标签:map,String,dropDownSetField,下拉列,EasyExecl,import,null,response,模板
From: https://www.cnblogs.com/sx-jd/p/16386308.html

相关文章

  • FusionAccess模板制作并发放
    FusionAccess安装并对接具体安装步骤欢迎参照我的博客:https://www.cnblogs.com/kongshuo/p/16333561.html在FC上创建win10虚拟机创建虚拟机,下一步名称随意,操作系统类......
  • Python语言开发基础模板
    内容概要基础阶段变量常量与用户交互输入/格式化输出基本运算符常见操作符逻辑运算符成员运算与身份运算分支结构之if分支循环结构之while循环循环结构之for循环变......
  • Shell语言开发基础模板
    内容概要基础阶段脚本处理/测试变量操作符分支结构之if分支分支结构之case分支循环结构之while循环循环结构之for循环函数脚本处理/测试#脚本处理window回车是......
  • Python调用函数模板
    内容概要函数阶段语法结构定义调用返回值参数名称空间闭包函数装饰器(难点)递归函数、二分法、匿名函数、三元表达式、列表生成式迭代器、生成器常见内置函数函数......
  • excel单元格添加下拉列表框,单元格根据不同值自动变不同的颜色
    数据-->插入下拉列表  弹出的窗口中,写入你的列表项   设置单元格根据不同的值,自动变不同颜色开始-->条件格式-->新建规则       效果: ......
  • xdocrepor读取resource目录下的word模板报:fr.opensagres.xdocreport.core.XDocReportE
    使用xdocrepor导出的时候模板在服务器读取指定路径是没问题的,但是我想放入自己项目resource目录中,总是报格式不支持错误!  模板是放入项目中,编辑的时候会破坏模板结构,......
  • java实现word模板导出
    Xdocreport和Freemaker生成docx只使用freemaker生成简单的word文档很容易,但是当word文档需要插入动态图片,带循环数据,且含有富文本时解决起来相对比较复杂,但是使用Xdocrepo......
  • 开机自启rc.local文件模板
    #Ubuntu没有开机自启文件,可以在/etc/目录下面创建一个rc.local文件,并且给他一个可执行权限就行了#rc.local文件格式如下:#!/bin/sh-e#rc.local##Thisscriptisexecut......
  • 书写数据库视图模板-九五小庞
     当你需要在数据库中创建视图时,可以使用此模板。select''as,--''as,--''as,--''as,--''as,--''as,--''as,--''as,--''as......
  • [模板] 计算几何
    #include<bits/stdc++.h>#definedebug(x)std::cerr<<"["<<__LINE__<<"]:"<<#x<<"="<<x<<"\n"usingi64=longlong;#defineUP1#defineDOW......