EasyExcel导出表格——下拉筛选

news/2025/1/8 20:01:18/

EasyExcel导出表格——下拉筛选

单元格添加下拉筛选
  1. 确保输入内容规范和准确
  2. 减少数据查询,提高用户使用感
  3. 根据用户权限,下拉筛选项控制
Controller层
 /*** 模板下载* @param response*/
@GetMapping(value = "/download")
public void download(HttpServletResponse response) {// 导出模板名称String fileName = "负责人批量修改模板.xlsx";ClassPathResource classPathResource = new ClassPathResource("template/payment_permission.xlsx");try (InputStream inputStream = classPathResource.getInputStream();OutputStream out = response.getOutputStream();) {response.setContentType("application/vnd.ms-excel");response.setCharacterEncoding("utf-8");// URLEncoder.encode防止中文乱码response.setHeader("Content-disposition", "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8")+ ";filename*=UTF-8" + URLEncoder.encode(fileName, "UTF-8"));// 表格填充数据List<PermissionExcel> excelList = permissionSettingService.listPermissionExcel();ExcelWriterBuilder writerBuilder = EasyExcel.write(out).withTemplate(inputStream);// PermissionExcelWriteHandler处理下拉的handlerwriterBuilder.sheet(0).registerWriteHandler(new PermissionExcelWriteHandler()).doFill(excelList);} catch (IOException e) {log.error(e.getMessage(), e);response.setStatus(500);}
}
处理字典项的Handler(下拉选项不超过50个)
public class PermissionExcelWriteHandler implements SheetWriteHandler {@Overridepublic void beforeSheetCreate(WriteWorkbookHolder writeWorkbookHolder, WriteSheetHolder writeSheetHolder) {}@Overridepublic void afterSheetCreate(WriteWorkbookHolder writeWorkbookHolder, WriteSheetHolder writeSheetHolder) {DataValidationHelper helper = writeSheetHolder.getSheet().getDataValidationHelper();// 设置下拉单元格的首行、末行、首列、末列CellRangeAddressList accountTypeCellRangeAddressList = new CellRangeAddressList(1, 2000, 2, 2);// AccountTypeEnum.dropIndex() 等于 String[] array = new String[]{"账户1", "账户2"};DataValidationConstraint accountTypeConstraint = helper.createExplicitListConstraint(AccountTypeEnum.dropIndex());DataValidation accountTypeDataValidation = helper.createValidation(accountTypeConstraint, accountTypeCellRangeAddressList);writeSheetHolder.getSheet().addValidationData(accountTypeDataValidation);}
}

当下拉选项值超过50个时,使用上述方式handler处理,导出的表格中下拉选项不显示,这时候需要将下拉选的内容存在另一个sheet页中。

处理字典项的Handler(下拉选项超过50个)

阿里云参考文档

public class SocialBillExtendExcelWriteHandler implements SheetWriteHandler {/*** key 下拉选项需要填充的列序号,value存放对应的下拉选项内容*/private Map<Integer, List<String>> selectMap;private char[] alphabet = new char[]{'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z'};public SocialBillExtendExcelWriteHandler(Map<Integer, List<String>> selectMap) {this.selectMap = selectMap;}@Overridepublic void beforeSheetCreate(WriteWorkbookHolder writeWorkbookHolder, WriteSheetHolder writeSheetHolder) {}@Overridepublic void afterSheetCreate(WriteWorkbookHolder writeWorkbookHolder, WriteSheetHolder writeSheetHolder) {if (CollUtil.isEmpty(selectMap)) {return;}// 需要设置下拉框的sheet页Sheet curSheet = writeSheetHolder.getSheet();DataValidationHelper helper = curSheet.getDataValidationHelper();String dictSheetName = "数据字典";Workbook workbook = writeWorkbookHolder.getWorkbook();// 创建数据字典的sheet页Sheet dictSheet = workbook.createSheet(dictSheetName);// 提升用户体验,隐藏数据字典的sheet页workbook.setSheetHidden(workbook.getSheetIndex(dictSheet), true);for (Map.Entry<Integer, List<String>> entry : selectMap.entrySet()) {// 设置下拉单元格的首行、末行、首列、末列CellRangeAddressList rangeAddressList = new CellRangeAddressList(2, 100, entry.getKey(), entry.getKey());int rowLen = entry.getValue().size();// 设置字典sheet页的值 每一列一个字典项Iterator<String> iterator = entry.getValue().iterator();int rowIndex = 0;while (iterator.hasNext()) {Row row = dictSheet.getRow(rowIndex);if (row == null) {row = dictSheet.createRow(rowIndex);}row.createCell(entry.getKey()).setCellValue(iterator.next());rowIndex++;}String excelColumn = getExcelColumn(entry.getKey());// 下拉框数据来源 eg:字典sheet!$B1:$B2String refers = dictSheetName + "!$" + excelColumn + "$1:$" + excelColumn + "$" + rowLen;// 创建可被其他单元格引用的名称Name name = workbook.createName();// 设置名称的名字name.setNameName("dict" + entry.getKey());// 设置公式name.setRefersToFormula(refers);// 设置引用约束DataValidationConstraint constraint = helper.createFormulaListConstraint("dict" + entry.getKey());// 设置约束DataValidation validation = helper.createValidation(constraint, rangeAddressList);if (validation instanceof HSSFDataValidation) {validation.setSuppressDropDownArrow(false);} else {validation.setSuppressDropDownArrow(true);validation.setShowErrorBox(true);}// 阻止输入非下拉框的值validation.setErrorStyle(DataValidation.ErrorStyle.STOP);validation.createErrorBox("提示", "此值与单元格定义格式不一致!");// 添加下拉框约束writeSheetHolder.getSheet().addValidationData(validation);}}/*** 将数字列转化成为字母列* @param num*/private String getExcelColumn(int num) {String column = "";int len = alphabet.length - 1;int first = num / len;int second = num % len;if (num <= len) {column = alphabet[num] + "";} else {column = alphabet[first - 1] + "";if (second == 0) {column = column + alphabet[len] + "";} else {column = column + alphabet[second - 1] + "";}}return column;}
}

http://www.ppmy.cn/news/678845.html

相关文章

excel单元格数字对比及输入条件自动筛选

excel单元格数字对比 在b1单元格中输入以下公式&#xff0c;再下拉填充到b6即可。 iF(oR(mid(a1,1,1)"*",mid(a1,1,1)mid($c$8,1,1)),iF(oR(mid(a1,2,1)"*",mid(a1,2,1)mid($c$8,2,1)),iF(oR(mid(a1,3,1)"*",mid(a1,3,1)mid($c$8,3,1)),iF(oR(…

【华为OD机试】乘坐保密电梯【2023 B卷|100分】

【华为OD机试】-真题 !!点这里!! 【华为OD机试】真题考点分类 !!点这里 !! 题目描述 有一座保密大楼,你从0楼到达指定楼层m,必须这样的规则乘坐电梯: 给定一个数字序列,每次根据序列中的数字n,上升n层或者下降n层, 前后两次的方向必须相反,规定首次的方向向上,自…

UR5机器人示教器使用——可视化控制部分(非编程)

感谢董青云师兄教我使用示教器 1.UR5机器人示教器 问师兄 3楼 UR-robotic 的控制 示教器相关内容&#xff08;UR5机器人的控制&#xff0c;有UR机器人的仿真环境&#xff0c;需要在虚拟器上运行&#xff09; 1.示教器上的控制有正逆控制&#xff1a;逆向运动学通常用于计算机…

计算机语言a什么码,a的ascll码是什么意思

大家好&#xff0c;我是时间财富网智能客服时间君&#xff0c;上述问题将由我为大家进行解答。 a的ASCII码数值是97。表示a在计算机中存储时使用的进制数&#xff0c;在编码是会将其转换成二进制数。因为计算机只认识二进制编码。 ASCII ((American Standard Code for Informat…

python file是什么意思_Python一直提示runfile是什么意思?

展开全部 Python一直提示runfile的意思是Python在服务器端执行&#xff1b; Python作为Microsoft公司开发的e68a84e8a2ad3231313335323631343130323136353331333433653962服务器端脚本环境&#xff0c;可用来创建动态交互式网页并建立强大的web应用程序。当服务器收到对ASP文件…

超平面是什么?——理解超平面(SVM开篇之超平面详解)

研究了半天&#xff0c;终于对“超平面”有了个初步了解。 n 维空间中的超平面由下面的方程确定: 其中&#xff0c;w 和 x 都是 n 维列向量&#xff0c;x 为平面上的点&#xff0c;w 为平面上的法向量&#xff0c;决定了超平面的方向&#xff0c;b 是一个实数&#xff0c;代表超…

Runtime(运行时)是什么意思

什么是 runtime 在计算机领域中&#xff0c;经常会接触到 runtime 这个概念&#xff0c;那么 runtime 究竟是什么东西&#xff1f; runtime 描述了程序运行时候执行的软件/指令&#xff0c; 在每种语言有着不同的实现。可大可小&#xff0c;在 C 中&#xff0c;runtime 是库代…

在三角形中rt是什么意思_【rt三角形什么意思】作文写作问答 - 归教作文网

Rt三角形的Rt是什么意思 Rt三角形的Rt是直角的意思。 Right triangle是英语,翻译成中文是直角三角形,Rt是它的英文缩写。 right triangle英 [rait ˈtraiŋɡl] 美 [raɪt ˈtraɪˌŋɡəl] n.直角三角形,勾股形。 Right triangle的用法示例如下: 1.you have a right tr…