文章目录

  • java导出Excel增加下拉框选项
    • 一、小数据量情况
    • 二、大数据量情况
  • java导出Excel增加下拉框选项(java结合easyExcel)
    • 添加传参模型ConsumablesAddDTO
    • 一、小数据量情况
    • 二、大数据量情况
  • 完整代码
    • Controller层
    • Service层
    • ServiceImpl层

java导出Excel增加下拉框选项

这篇文章主要介绍了Java 导出Excel增加下拉框选项,excel对于下拉框较多选项的,需要使用隐藏工作簿来解决,使用函数取值来做选项,下文具体的操作详情,需要的小伙伴可以参考一下!

excel对于下拉框较多选项的,需要使用隐藏工作簿来解决,使用函数取值来做选项

一、小数据量情况

选项较少(一般少于5个):

private static DataValidation setFewDataValidation(Sheet sheet, String[] textList, int firstRow, int endRow, int firstCol, int endCol) {DataValidationHelper helper = sheet.getDataValidationHelper();//加载下拉列表内容DataValidationConstraint constraint = helper.createExplicitListConstraint(textList);constraint.setExplicitListValues(textList);//设置数据有效性加载在哪个单元格上。四个参数分别是:起始行、终止行、起始列、终止列CellRangeAddressList regions = new CellRangeAddressList((short) firstRow, (short) endRow, (short) firstCol, (short) endCol);//数据有效性对象return helper.createValidation(constraint, regions);
}

二、大数据量情况

选项较多

创建隐藏工作簿:

Sheet sheetHidden = wb.createSheet("Sheet2");
wb.setSheetHidden(1, true);

每一个列表占用一列

当然也可以每个列表使用一张工作簿,只用第一列。 这里是使用一个工作簿使用每个列,先26个字母,一般够用了

String[] arr = {"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"};
for (int j = 0; j < dataList.size(); j++) {if (index == 0) { //第1个下拉选项,直接创建行、列row = sheetHidden.createRow(j); //创建数据行//      sheetHidden.setColumnWidth(j, 4000); //设置每列的列宽row.createCell(0).setCellValue(dataList.get(j)); //设置对应单元格的值} else { //非第1个下拉选项int rowCount = sheetHidden.getLastRowNum();if (j <= rowCount) { //前面创建过的行,直接获取行,创建列//获取行,创建列sheetHidden.getRow(j).createCell(index).setCellValue(dataList.get(j)); //设置对应单元格的值} else { //未创建过的行,直接创建行、创建列//  sheetHidden.setColumnWidth(j, 4000); //设置每列的列宽//创建行、创建列sheetHidden.createRow(j).createCell(index).setCellValue(dataList.get(j)); //设置对应单元格的值}}
}

index 代表第几个下拉框,也就是在隐藏工作簿的第几列,dataList表示下拉框的内容

创建公式:

String strFormula = “Sheet2!$” + arr[index] + “1:1:1:” + arr[index] + “$” + dataList.size();

Sheet2第A1到A5000作为下拉列表来源数据

xls和xlsx生成下拉框的选项不一样

private static DataValidation setMoreDataValidation(Workbook wb, Sheet sheet, String strFormula, int startRow, int endRow, int startColumn, int endColumn) {DataValidation dataValidation;// 设置数据有效性加载在哪个单元格上,四个参数分别是:起始行、终止行、起始列、终止列CellRangeAddressList regions = new CellRangeAddressList(startRow, endRow, startColumn, endColumn);if (wb instanceof XSSFWorkbook) {//获取新sheet页内容XSSFDataValidationConstraint constraint = new XSSFDataValidationConstraint(DataValidationConstraint.ValidationType.LIST, strFormula);// 设置数据有效性加载在哪个单元格上,四个参数分别是:起始行、终止行、起始列、终止列// 数据有效性对象DataValidationHelper help = new XSSFDataValidationHelper((XSSFSheet) sheet);dataValidation = help.createValidation(constraint, regions);dataValidation.setSuppressDropDownArrow(true);dataValidation.setShowErrorBox(true);} else {// 设置数据有效性加载在哪个单元格上。四个参数分别是:起始行、终止行、起始列、终止列DVConstraint constraint = DVConstraint.createFormulaListConstraint(strFormula);dataValidation = new HSSFDataValidation(regions, constraint);dataValidation.setSuppressDropDownArrow(false);}dataValidation.setEmptyCellAllowed(true);dataValidation.setShowPromptBox(true);dataValidation.createErrorBox("Error", "请选择下拉框中的数据");dataValidation.createPromptBox("提示", "只能选择下拉框里面的数据");return dataValidation;}

加入工作簿:

sheet.addValidationData()

完整代码:

private static void setValidationDate(Workbook wb, Sheet sheet, List<DataValidationCell> dataValidationCellList) {if (dataValidationCellList.isEmpty()) {return;}String[] arr = {"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"};int index = 0;Row row;Sheet sheetHidden = wb.createSheet("Sheet2");wb.setSheetHidden(1, true);for (DataValidationCell dataValidationCell : dataValidationCellList) {List<String> dataList = dataValidationCell.getDataList();if (CollectionUtils.isEmpty(dataList)) {continue;}if (dataList.size() <= 5) {sheet.addValidationData(setFewDataValidation(sheet, dataList.toArray(new String[0]),dataValidationCell.getStartRow(), dataValidationCell.getEndRow(),dataValidationCell.getStartColumn(), dataValidationCell.getEndColumn())); //超过255个报错} else {//String strFormula = "Sheet2!$A$1:$A$5000" ; //Sheet2第A1到A5000作为下拉列表来源数据String strFormula = "Sheet2!$" + arr[index] + "$1:$" + arr[index] + "$" + dataList.size(); //Sheet2第A1到A5000作为下拉列表来源数据sheet.addValidationData(setMoreDataValidation(wb, sheet, strFormula,dataValidationCell.getStartRow(), dataValidationCell.getEndRow(),dataValidationCell.getStartColumn(), dataValidationCell.getEndColumn())); //下拉列表元素很多的情况//2、生成sheet2内容for (int j = 0; j < dataList.size(); j++) {if (index == 0) { //第1个下拉选项,直接创建行、列row = sheetHidden.createRow(j); //创建数据行//      sheetHidden.setColumnWidth(j, 4000); //设置每列的列宽row.createCell(0).setCellValue(dataList.get(j)); //设置对应单元格的值} else { //非第1个下拉选项int rowCount = sheetHidden.getLastRowNum();if (j <= rowCount) { //前面创建过的行,直接获取行,创建列//获取行,创建列sheetHidden.getRow(j).createCell(index).setCellValue(dataList.get(j)); //设置对应单元格的值} else { //未创建过的行,直接创建行、创建列//  sheetHidden.setColumnWidth(j, 4000); //设置每列的列宽//创建行、创建列sheetHidden.createRow(j).createCell(index).setCellValue(dataList.get(j)); //设置对应单元格的值}}}index++;}}
}

java导出Excel增加下拉框选项(java结合easyExcel)

excel对于下拉框较多选项的,需要使用隐藏工作簿来解决,使用函数取值来做选项

添加传参模型ConsumablesAddDTO

/*** 描述:添加传参模型ConsumablesAddDTO*/
@Data
@ApiModel(value = "ConsumablesAddDTO", description = "耗材表AddDTO")
public class ConsumablesAddDTO implements Serializable {private static final long serialVersionUID = 1L;@ApiModelProperty(value = "仓库名称", required = true)@Excel(name = "*仓库名称", orderNum = "5", width = 20)@NotBlank(message = "仓库名称必填", groups = {Default.class})private String wareHouseName;@ApiModelProperty(value = "是否启用 0:否 1:是")@Excel(name = "是否启用", orderNum = "13",addressList = true,replace = {"否_0","是_1"})private Integer isEnable;@ApiModelProperty(value = "单位id")private String unitId;@ApiModelProperty(value = "单位名称", required = true)@Excel(name = "*单位", orderNum = "14", addressList = true, replace = {"瓶"}, width = 10)@NotBlank(message = "单位名称不能为空", groups = {Default.class})private String unitName;}

仓库名称(wareHouseName)为大数据量,单位名称(unitName)为小数据量

一、小数据量情况

选项较少(一般少于5个):

    /*** 生成excel下拉框(适用于下拉框选项的数量较少的情况)** @param pojoClass*/public void replaceHandel(Class<?> pojoClass, String[] List) {Field[] fields = pojoClass.getDeclaredFields();try {for (int i = 0; i < fields.length; i++) {Field field = fields[i];String name = field.getName();if (name.equals("unitName")) {// 这里可以加上指定字段做处理,也可以将需要的字段枚举或者是字段存到redisExcel annotation = field.getAnnotation(Excel.class);if (annotation != null && annotation.replace().length > 0) {InvocationHandler invocationHandler = Proxy.getInvocationHandler(annotation);Field memberValues = invocationHandler.getClass().getDeclaredField("memberValues");memberValues.setAccessible(true);Map map = (Map) memberValues.get(invocationHandler);// replace 的值是字符串数组,自定义的时候记得数据格式map.put("replace", List);}}}} catch (Exception e) {e.printStackTrace();}}

二、大数据量情况

选项较多

创建隐藏工作簿:

Sheet sheet = workbook.getSheet(CommonConstant.SHEET1_NAME);
//Sheet sheet = workbook.getSheet("sheet1");
// 创建隐藏sheet
Sheet hideSheet = workbook.createSheet("hiddenSheet");
/*** 使用createFormulaListConstraint生成excel下拉框(适用于下拉框选项的数量较多的情况)** @param workbook* @param formulaString*/public void setDropDownAndHidden( Workbook workbook, String[] formulaString) {Sheet sheet = workbook.getSheet(CommonConstant.SHEET1_NAME);// 创建隐藏sheetSheet hideSheet = workbook.createSheet("hiddenSheet");for (int i = 0; i < formulaString.length; i++) {hideSheet.createRow(i).createCell(0).setCellValue(formulaString[i]);}// 创建名称,可被其他单元格引用Name category1Name = workbook.createName();category1Name.setNameName("hidden");// 设置名称引用的公式// 使用像'A1:B1'这样的相对值会导致在Microsoft Excel中使用工作簿时名称所指向的单元格的意外移动,// 通常使用绝对引用,例如'$A$1:$B$1'可以避免这种情况。category1Name.setRefersToFormula("hiddenSheet!" + "$A$1:$A$" + formulaString.length);// 获取上文名称内数据DataValidationHelper helper = sheet.getDataValidationHelper();DataValidationConstraint constraint = helper.createFormulaListConstraint("hidden");// 设置下拉框位置CellRangeAddressList addressList = new CellRangeAddressList(2, 4000, 4, 4);// 在第3行第5列位置处生成下拉框(下标从0开始)DataValidation dataValidation = helper.createValidation(constraint, addressList);// 处理Excel兼容性问题if (dataValidation instanceof XSSFDataValidation) {// 数据校验dataValidation.setSuppressDropDownArrow(true);dataValidation.setShowErrorBox(true);} else {dataValidation.setSuppressDropDownArrow(false);}// 作用在目标sheet上sheet.addValidationData(dataValidation);// 设置hiddenSheet隐藏workbook.setSheetHidden(1, true);}

完整代码

Controller层

@GetMapping(value = "/template")
@ApiOperation(value = "获取耗材批量导入模板")
@LogAnnotation(operation = "获取耗材批量导入模板")
public void getTemplate(HttpServletResponse response) {try {baseService.template(response);} catch (IOException e) {e.printStackTrace();}}

Service层

/**
* 获取导入模板
*
* @param response
**/
void template(HttpServletResponse response) throws IOException;

ServiceImpl层

@Overridepublic void template(HttpServletResponse response) throws IOException {String companyId = SecurityUtils.getCompanyId();// 导入模板下载List<String> unitList = unitMapper.findAllUnit(companyId).stream().map(t -> t.getString("unitName") + "_" + t.getString("id")).collect(Collectors.toList());Map<String,List<String>> map = new HashMap<>(2);map.put("unitId",unitList);// 单位名称集合LbqWrapper<Unit> unitLbqWrapper = Wraps.<Unit>lbQ();unitLbqWrapper.eq(Unit::getCompanyId, companyId);List<Unit> units = unitMapper.selectList(unitLbqWrapper);List<String> unitNames = units.stream().map(Unit::getUnitName).collect(Collectors.toList());// list转String数组String[] unitNameList = unitNames.toArray(new String[unitNames.size()]);// 仓库名称集合LbqWrapper<WareHouse> wareHouseWrapper = Wraps.lbQ();wareHouseWrapper.eq(WareHouse::getCompanyId, companyId);List<WareHouse> wareHouseList = wareHouseMapper.selectList(wareHouseWrapper);List<String> wareHouseNames = wareHouseList.stream().map(WareHouse::getWareHouseName).collect(Collectors.toList());// list转String数组String[] wareHouseNameList = wareHouseNames.toArray(new String[wareHouseNames.size()]);try {ReplaceValue.replace(ConsumablesAddDTO.class,map);} catch (NoSuchFieldException | IllegalAccessException e) {e.printStackTrace();throw new BizException("获取导入模板失败");}ExportParams params = new ExportParams("注:\n" +"1、物料编码具有唯一性,若重复会导入失败。若导入物料有对应编码则沿用,若无编码则系统随机生成;\n" +"2、物料分类、存放仓库、品牌、供应商请填物料分类编码、仓库名称、品牌编码、供应商编码,不能填写物料分类名称;\n" +"3、若存在多个采购员请使用英文逗号分隔;\n" +"4、安全库存和预留库存请填写正整数;\n" +"5、不允许对表头字段进行增删改。\n", CommonConstant.SHEET1_NAME, ExcelType.XSSF);params.setTitleHeight((short) 30);params.setCreateHeadRows(true);params.setStyle(ExcelExportStyleImpl.class);// 生成excel下拉框(适用于下拉框选项的数量较少的情况)replaceHandel(ConsumablesAddDTO.class, unitNameList);// 生成带模板数据的workbookWorkbook workbook = ExcelExportUtil.exportExcel(params, ConsumablesAddDTO.class, new ArrayList<ConsumablesAddDTO>());// 生成excel下拉框(适用于下拉框选项的数量较多的情况)setDropDownAndHidden(workbook, wareHouseNameList);try {response.setCharacterEncoding("UTF-8");response.setHeader("content-Type", "application/vnd.ms-excel");response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode("耗材导入模板" + ".xlsx", "UTF-8"));response.flushBuffer();workbook.write(response.getOutputStream());workbook.close();} catch (IOException var4) {var4.printStackTrace();throw new BizException(var4.getMessage());}}/*** 使用createFormulaListConstraint生成excel下拉框(适用于下拉框选项的数量较多的情况)** @param workbook* @param formulaString*/public void setDropDownAndHidden( Workbook workbook, String[] formulaString) {Sheet sheet = workbook.getSheet(CommonConstant.SHEET1_NAME);// 创建隐藏sheetSheet hideSheet = workbook.createSheet("hiddenSheet");for (int i = 0; i < formulaString.length; i++) {hideSheet.createRow(i).createCell(0).setCellValue(formulaString[i]);}// 创建名称,可被其他单元格引用Name category1Name = workbook.createName();category1Name.setNameName("hidden");// 设置名称引用的公式// 使用像'A1:B1'这样的相对值会导致在Microsoft Excel中使用工作簿时名称所指向的单元格的意外移动,// 通常使用绝对引用,例如'$A$1:$B$1'可以避免这种情况。category1Name.setRefersToFormula("hiddenSheet!" + "$A$1:$A$" + formulaString.length);// 获取上文名称内数据DataValidationHelper helper = sheet.getDataValidationHelper();DataValidationConstraint constraint = helper.createFormulaListConstraint("hidden");// 设置下拉框位置CellRangeAddressList addressList = new CellRangeAddressList(2, 4000, 4, 4);DataValidation dataValidation = helper.createValidation(constraint, addressList);// 处理Excel兼容性问题if (dataValidation instanceof XSSFDataValidation) {// 数据校验dataValidation.setSuppressDropDownArrow(true);dataValidation.setShowErrorBox(true);} else {dataValidation.setSuppressDropDownArrow(false);}// 作用在目标sheet上sheet.addValidationData(dataValidation);// 设置hiddenSheet隐藏workbook.setSheetHidden(1, true);}/*** 生成excel下拉框(适用于下拉框选项的数量较少的情况)** @param pojoClass*/public void replaceHandel(Class<?> pojoClass, String[] List) {Field[] fields = pojoClass.getDeclaredFields();try {for (int i = 0; i < fields.length; i++) {Field field = fields[i];String name = field.getName();if (name.equals(CommonConstant.UNIT_NAME)) {// 这里可以加上指定字段做处理,也可以将需要的字段枚举或者是字段存到redisExcel annotation = field.getAnnotation(Excel.class);if (annotation != null && annotation.replace().length > 0) {InvocationHandler invocationHandler = Proxy.getInvocationHandler(annotation);Field memberValues = invocationHandler.getClass().getDeclaredField("memberValues");memberValues.setAccessible(true);Map map = (Map) memberValues.get(invocationHandler);// replace 的值是字符串数组,自定义的时候记得数据格式map.put("replace", List);}}}} catch (Exception e) {e.printStackTrace();}}

到此这篇关于Java 导出Excel增加下拉框选项的文章就介绍到这了!

java导出Excel增加下拉框选项,解决小数据量和大数据量下拉框选项的问题相关推荐

  1. Java POI 导出EXCEL经典实现 Java导出Excel弹出下载框

    原文转载:http://blog.csdn.net/evangel_z/article/details/7332535 目录(?)[+] 在web开发中,有一个经典的功能,就是数据的导入导出.特别是数 ...

  2. JAVA导出Excel通用工具类——第一篇:详细介绍POI 导出excel的多种复杂情况,包括动态设置筛选、动态合并横向(纵向)单元格等多种复杂情况——保姆级别,真的不能再详细了,代码拿来即用)

    JAVA导出Excel通用工具--第一篇:详细介绍POI 导出excel的多种复杂情况,包括动态设置筛选.动态合并横向(纵向)单元格等多种复杂情况--保姆级别,真的不能再详细了,封装通用工具类,代码拿 ...

  3. java 浏览器 excel导出excel_使用Java导出Excel表格并由浏览器直接下载——基于POI框架...

    非异步方法 /** * 使用Java导出Excel表格并由浏览器直接下载--基于POI框架 * * @param response * @return * @throws IllegalAccessE ...

  4. java文件无法导出excel文件,【excel表格文件格式无效】java导出excel,excel打不开,报文件格式无效,怎么解决!...

    excel提示 打开的文件.xls的格式与文件扩展名不一致怎么办 如果打开文件的格式与文件的扩展名不一致,只要能够打开就不用去管他. java导出excel,excel打不开,报文件格式无效,怎么解决 ...

  5. java 导出excel到多个sheet

    java 导出excel 多个sheet 废话不多说了,直接上代码,有需要的盆友,可以看看.@TOC @RequestMapping("/exportAllyScoreCount" ...

  6. JAVA导出EXCEL实现

    ##JAVA导出EXCEL实现的多种方式 java导出Excel的方法有多种,最为常用的方式就是使用第三方jar包,目前POI和JXL是最常用的二方包了,也推荐使用这两种. ###POI实现 POI这 ...

  7. java导出excel设置行高列宽_使用POI生成Excel文件,可以自动调整excel列宽

    //autoSizeColumn()方法自动调整excel列宽 importjava.io.FileOutputStream; importorg.apache.poi.hssf.usermodel. ...

  8. Java导出excel文件

    需求 将每个xmpp机房的在线/离线用户信息导出到Excel表格中(定时任务+网页按钮),并在网页上提供下载按钮进行下载. 效果预览 导出文件效果 点击下载弹出框效果 代码总览 /** ". ...

  9. 解决java导出excel因数据量大占内存的问题

    java大量数据导出excel不占内存的方法 解决方法: 使用SXSSFWorkbook好处就是导出excel时不占用运行内存,它会把excel数据存放在磁盘的临时文件中保存,下面的1000指的是只会 ...

最新文章

  1. [moka同学笔记]PHP操作Redis收集
  2. eclipse设置自定义快捷键
  3. ECSHOP其他页面调用首页的FLASH主广告
  4. 【数据库】Windows安装redis全流程
  5. (数据库系统概论|王珊)第一章绪论-第三节:数据库系统的结构
  6. 动态生成圈形+文字的图片
  7. centos php 环境路径,路径(十四):在本地 CentOS 7 上搭建 Web 开发环境 — PHP
  8. 获取wlan0eth0联网状态
  9. 趣味项目—MyQQ机器人(一)
  10. 土木/岩土期刊版面费/审稿费统计列表
  11. Java系统插件开发原理与实例
  12. ffmpeg播放器声音效果2-变速不变调及变调
  13. 24、基于原型的切比雪夫低通滤波器设计理论(插入损耗法)
  14. cs231n-assignment2的笔记
  15. 【Nginx】Nginx配置实例-反向代理
  16. dlib.get_frontal_face_datector()人脸位置检测
  17. Linux-1:微星主板+双系统安装Ubuntu18.04.5
  18. Nodejs安装及npm配置(超详细)
  19. m分集2跳OFDM系统中基于功率分配和子载波配对算法的信道容量matlab仿真
  20. java poker_Java超级高手成长之路!一个Java编写的斗地主游戏

热门文章

  1. 主要开源WebGIS介绍、自由及开源GIS软件、组件产品
  2. 信号的产生——线性调频函数chirp
  3. Python实验舱谢尔宾斯基三角形绘制教程
  4. 【Pytorch】带注释的Transformer (各个部件的实现及应用实例)
  5. 压枪源码,移动鼠标源码,监听鼠标源码,控制鼠标移动源码,控制鼠标移动脚本
  6. 如何提取网页中的blob加密视频
  7. 30岁转行做初级程序员是什么体验
  8. 掷骰子python代码_python_掷骰子游戏
  9. 李峋同款爱心python实现
  10. 在微信浏览器中做分享到朋友圈和分享到好友