一、导出 Excel 单元格设置下拉框

日常开发中,导出基础数据为模版,填充信息后导入时,有时候会要求某些导入项应该为下拉框选择,一个是为了规范数据,也可以简化填充。

1.1 单元格下拉框选项总字符较少的情况

单元格设置的下拉框字符总数小于 250,可以在当前 sheet 页直接设置单元格下拉框,可以单个或批量设置。

  public static void setDropDown(Sheet sheet,int startRow,int maxRow,int startColumn, int maxColumn){
for (int j=startColumn; j<maxColumn; j++){
String attr = sheet.getRow(0).getCell(j).getStringCellValue().trim();
if (IBALegalMap.containsKey(attr) && !("Classification").equals(attr)){
//存在下拉值,取出存在的下拉值,转化为 String 数组
List<String> list = IBALegalMap.get(attr);
String[] str = list.toArray(new String[list.size()]);
XSSFDataValidationHelper dvHelper = new XSSFDataValidationHelper((XSSFSheet) sheet);
XSSFDataValidationConstraint dvConstraint =
(XSSFDataValidationConstraint) dvHelper.createExplicitListConstraint(str);
//设置起始行结束后,起始列结束列
CellRangeAddressList addressList = new CellRangeAddressList(startRow,maxRow,j,j);
XSSFDataValidation validation = (XSSFDataValidation) dvHelper.createValidation(dvConstraint, addressList);
sheet.addValidationData(validation);
}
}
}

1.2 单元格下拉框选项总字符较多的情况

单元格设置的下拉框字符总数大于 250,这种情况直接设置后,表格会报错,可以通过隐藏 Sheet 页的方式进行设置。

每列下拉框都需要设置一个隐藏 Sheet 页,名称不可重复。

 public static void setDropDown(Sheet sheet,int startRow,int maxRow,int startColumn, int maxColumn,Workbook workbook,String hideName){
//Row row = sheet.getRow(startRow);
for (int j=startColumn;j<maxColumn;j++){
String attr = sheet.getRow(0).getCell(j).getStringCellValue().trim();
if (IBALegalMap.containsKey(attr) && (!"Classification".equals(attr))){
String s = Integer.toString(j);
hideName = hideName + s;
List<String> list = IBALegalMap.get(attr);
String[] str = list.toArray(new String[list.size()]);
logger.debug(str+"str");
//隐藏 sheet 页名称不可重复
Sheet hidden = workbook.createSheet(hideName);
Cell cell = null;
for (int i=0; i<str.length;i++){
String name = str[i];
Row strRow = hidden.createRow(i);
cell = strRow.createCell(0);
cell.setCellValue(name);
}
Name nameCell = workbook.createName();
nameCell.setNameName(hideName);
nameCell.setRefersToFormula(hideName+"!$A$1:$A$"+str.length);
//设置隐藏页
workbook.setSheetHidden(workbook.getSheetIndex(hidden),true);
DataValidationConstraint constraint = null;
//设置起始行结束后,起始列结束列
CellRangeAddressList addressList = new CellRangeAddressList(startRow,maxRow,j,j);
DataValidation validation = null;
DataValidationHelper dvHelper = sheet.getDataValidationHelper();
constraint = dvHelper.createFormulaListConstraint(hideName);
//将数据添加进去
validation =dvHelper.createValidation(constraint,addressList);
sheet.addValidationData(validation);
logger.debug("设置下拉完成");
}
}


图 1.3 数据导出

 

POI设置单元格下拉框的更多相关文章

  1. POI 生成带联动下拉框的excel表格

    参考:https://www.cnblogs.com/cjbbk/p/7527276.html 解决POI3.17 与其它版本的不同的坑:https://blog.csdn.net/Weirdo_zh ...

  2. java操作Excel的poi 设置单元格的对其方式

    设置单元格的对其方式 package com.java.poi; import org.apache.poi.hssf.usermodel.HSSFCell; import org.apache.po ...

  3. 20191012——POI设置单元格自动行高(思路)

    在经过Jxls或者POI导出数据至excel中后,发现有的单元格内容太多,既没有自动换行,也没有自动增大行高.那如何通过Java代码来实现呢?请看下面步骤: (一)首先,将excel设置为最合适的行高 ...

  4. Excel设置数据有效性实现单元格下拉菜单的3种方法(转)

    http://blog.csdn.net/cdefu/article/details/4129136 一.直接输入: 1.选择要设置的单元格,譬如A1单元格: 2.选择菜单栏的“数据”→“有效性”→出 ...

  5. JAVA poi设置单元格背景颜色

    import java.io.FileOutputStream; import java.io.IOException;   import org.apache.poi.ss.usermodel.Ce ...

  6. poi 设置单元格公式

    Cell cell= rowF2.createCell(18);cell.setCellFormula("=Q20*R20");

  7. angular 设置年份选择下拉框,并默认今年

    <select ng-model="selectedYear" ng-change="yearChange(selectedYear)"> < ...

  8. checkbox勾选事件,JQ设置css,下拉框JQ选中

    <input id="CheckMainCompany" type="checkbox"/> $(function() { $("#Che ...

  9. EXCEL设置三级下拉框

    EXCEL设置三级下拉框 1.添加下拉框数据源 公式--->指定 公式--->名称管理器 2.设置第一级下拉框的值 3.第一级下拉框选出一个值 4.设置第二级下拉框(INDIRECT($A ...

  10. c# dataGridView cell添加下拉框

    应用场景: dataGridView需要某一个cell变成下拉框样式. 思路详解: dataGridVie添加固定格式的row. 代码: DataGridViewRow row = new DataG ...

随机推荐

  1. Java方法之递归详解【重点】

    递归详解 A方法调用B方法,我们很容易理解! 递归就是:A方法调用A方法!就是自己调用自己. 利用递归可以用简单的程序来解决一些复杂的问题.它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较 ...

  2. 杭电oj 求数列的和

    Problem Description 数列的定义如下:数列的第一项为n,以后各项为前一项的平方根,求数列的前m项的和.   Input 输入数据有多组,每组占一行,由两个整数n(n<10000 ...

  3. Docker 查看某一时间段日志

    语法: docker logs [OPTIONS] CONTAINER Options: --details 显示更多的信息 -f, --follow 跟踪实时日志 --since string 显示 ...

  4. 使用kubeadm快速部署k8s高可用集群

    二进制安装方法请移步到:二进制部署高可用kubernetes-1.22.7集群 一:环境初始化 系统规划 k8s-master01 192.168.113.100   k8s-master02 192 ...

  5. 20191317Exp3-免杀原理与实践

    20191317Exp3-免杀原理与实践 基础问题回答 1.1 杀软是如何检测出恶意代码的? 基于特征码进行检测:杀毒软件的病毒库记录了一些恶意软件的特征码,一段特征码就是一段或多段数据.如果一个可执 ...

  6. vue的易错点合集

    关于vue的操作,可以借鉴到一些Ajax的方法和思路,但是因为语法的不一样,所以易错点多在语法. 第一步要引用相对的方法 div的id名称应该与下文的el名称一致 挂载方法created,相当于aja ...

  7. shell语法1-概论、注释、变量、字符串

    如果感觉有点忘了或者有点懵,敲出来测试测试就好了 一:概论 Linux系统中一般默认使用bash,文件开头需要写#! /bin/bash,指明bash为脚本解释器chmod +x filename:使 ...

  8. Linux 第二节(基本命令)

    www.linuxcool.com 一.ifconfig 1.Ip 地址 2.MAC地址 3.收到的数据包(RX) 4.发送的数据包(Tx) 二.uname uname -a    //查看系统内核及 ...

  9. Django启动时提示ModuleNotFoundError: No module named 'xxx'的原因

    ①创建项目:django-admin startproject DL ②创建app:python manage.py startapp myapp ③启动服务:python manage.py run ...

  10. springboot修改默认端口

    方案一: src/main/resuorces 文件夹下新建application.properties 文件 并添加内容server.port=8011即可 方案二: 使用EmbeddedServl ...