EasyExcel导出模板实现下拉选(解决下拉超过50个限制)

您所在的位置:网站首页 SKU列表不能超过50个 EasyExcel导出模板实现下拉选(解决下拉超过50个限制)

EasyExcel导出模板实现下拉选(解决下拉超过50个限制)

2024-07-16 10:09| 来源: 网络整理| 查看: 265

原创 小道仙97 小道仙97 2023-09-07 13:12 发表于广东

收录于合集#技术学习107个

一、主流程代码

二、处理器代码

三、两个VO

先来看看最终实现效果,如果效果是你想要的,再看看实现逻辑。

图片

在这里插入图片描述

 

EasyExcel本身是支持设置下拉校验的,但有个问题,一旦下拉数据超过50个左右的时候就无法正常展示,当然,现在这个问题得到了解决。

来看整体的项目目录

图片

如果你之前使用过EasyExcel那上面主流程代码你将会很熟悉,下拉选相较于之前的导出只是多注册了一个 Handler。

一、主流程代码 @RestController @RequestMapping("/one") public class OneController {     // 测试数据构建     private static List countryList = Arrays.asList("中国","美国","俄罗斯","德国","日本");     private static List cityList = Arrays.asList("深圳","广州","上海","北京","纽约","莫斯科","东京");     private static Map dropDownData = new HashMap(2);     private static List cityEntityList = new ArrayList(cityList.size());     static {         dropDownData.put("country", countryList);         dropDownData.put("city", cityList);         for (String item : cityList) {             cityEntityList.add(new SheetOneVO(item));         }     }     @GetMapping("/kk-one")     public void one(HttpServletResponse response) throws Exception {         // 通用内容设置         String fileName = URLEncoder.encode("templateOne.xlsx",CharEncoding.UTF_8);         response.setContentType("application/octet-stream");         response.setCharacterEncoding(CharEncoding.UTF_8);         response.setHeader(HttpHeaders.CONTENT_DISPOSITION, "attachment;filename=" + fileName);         // 构建模板数据         ExcelWriter excelWriter = EasyExcel.write(response.getOutputStream()).build();         WriteSheet writeSheet = EasyExcel                 .writerSheet(0, "one")                 .registerWriteHandler(new XdxCellWriteHandler(dropDownData))                 .head(TemplateOneVO.class)                 .build();         WriteSheet citySheet = EasyExcel                 .writerSheet(1, "city")                 .head(SheetOneVO.class)                 .needHead(false)                 .build();         excelWriter.write(Arrays.asList(new TemplateOneVO("张三","美国", "胡佛")), writeSheet)                 .write(cityEntityList, citySheet).                 finish();     } }

二、处理器代码

这个handler重写了单元格拦截器,在遍历表头的时候,设置下拉选。

正常是超过50个下拉才会出问题,这里懒得造那么多数据所以设置了一个LIMIT,超过它就会换成联动sheet方式,从而就解决了个数限制的问题。

public class XdxCellWriteHandler implements CellWriteHandler {     /**      * 超过 LIMIT 的大小就使用 sheet关联下拉,否则直接设置下拉      */     private static final Integer LIMIT = 6;     private Map dropDownData;     public XdxCellWriteHandler(Map dropDownData) {         this.dropDownData = dropDownData;     }     /**      * 设置下拉框数据      * @param writeSheetHolder      * @param key 当前列名      * @param rowIndex 行号      * @param columnIndex 列号      */     private void setSelectDataList(WriteSheetHolder writeSheetHolder, String key, int rowIndex, int columnIndex) {         if (dropDownData.get(key) == null) {             return;         }         Sheet sheet = writeSheetHolder.getSheet();         DataValidationHelper helper = sheet.getDataValidationHelper();         // 设置下拉列表的行: 首行,末行,首列,末列         CellRangeAddressList rangeList = new CellRangeAddressList(rowIndex, 50000, columnIndex, columnIndex);         // 设置下拉列表的值         DataValidationConstraint constraint;         if (dropDownData.get(key).size() 


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3