当前位置: 首页 > article >正文

POI生成Excel文件增加数据验证(下拉序列)

POI版本为5.2.2

正常的如果不超过255字符的数据验证可以参照如下代码:

/**
 * <p>设置某列的数据验证</p>
 * @param Sheet 作用于哪一个sheet
 * @param colIndex 需要增加数据验证的列的索引
 * @String[] names 数据验证的序列,就是excel下拉列表的内容
 */
public static void setDataValidation(Sheet sheet, int colIndex, String[] names) {
    //直接用给定的数据创建显式序列
	DataValidationConstraint constraint = sheet.getDataValidationHelper().createExplicitListConstraint(names);
	constraint.setOperator(DataValidationConstraint.OperatorType.BETWEEN);
    //创建一个区域,某列的第2行到第65535行,一般第一行是标题列
	CellRangeAddressList addressList = new CellRangeAddressList(1,65535,colIndex,colIndex);
	DataValidation validation = sheet.getDataValidationHelper().createValidation(constraint, addressList);
	validation.setErrorStyle(DataValidation.ErrorStyle.STOP);
    //不允许单元格为空
	validation.setEmptyCellAllowed(false);
	validation.setShowErrorBox(true);
    //添加数据验证到sheet中
	sheet.addValidationData(validation);
}

@Test
public void test(){
    Workbook workbook = WorkbookFactory.create(true);//xlsx
    Sheet sheet = workbook.createSheet("测试");
    //先创建65535行
    for (int i = 0; i < 65535; i++) {
        Row row = sheet.getRow(i);
        if (Objects.isNull(row))
            row=sheet.createRow(i);
        Cell cell = row.getCell(0);
        if (Objects.isNull(cell))
            cell = row.createCell(0);
    }
    //下拉列表的数据
    String[] strs = {"借","贷"};
    setDataValidation(sheet,0,strs);
    workbook.write(new FileOutputStream("D:\\poitest\\测试.xlsx"));
}

 

由于excel数据验证 序列的长度最多255字符, 如果代码中数据的长度超过这个,则生成的excel会提示先修复才能打开,修复完成打开之后发现需要设置数据验证的列没有设置成功。如果想要输入更多数据,则先可以先把数据保存到一个隐藏的sheet中,然后通过公式引用存储的数据再设置数据验证。

/**
 * <p>设置某列的数据验证</p>
 * @param Sheet 作用于哪一个sheet
 * @param colIndex 需要增加数据验证的列的索引
 * @String formula 公式,引用隐藏sheet的数据
 */
public static void setDataValidationByFormula(Sheet sheet, int colIndex, String formula) {
    //直接用给定的公式创建
	DataValidationConstraint constraint = sheet.getDataValidationHelper().createFormulaListConstraint(formula);
	constraint.setOperator(DataValidationConstraint.OperatorType.BETWEEN);
    //创建一个区域,某列的第2行到第65535行,一般第一列是标题列
	CellRangeAddressList addressList = new CellRangeAddressList(1,65535,colIndex,colIndex);
	DataValidation validation = sheet.getDataValidationHelper().createValidation(constraint, addressList);
	validation.setErrorStyle(DataValidation.ErrorStyle.STOP);
    //不允许单元格为空
	validation.setEmptyCellAllowed(false);
	validation.setShowErrorBox(true);
    //添加数据验证到sheet中
	sheet.addValidationData(validation);
}

@Test
public void test(){
    Workbook workbook = WorkbookFactory.create(true);//xlsx
    Sheet sheet = workbook.createSheet("测试");
    //先创建65535行
    for (int i = 0; i < 65535; i++) {
        Row row = sheet.getRow(i);
        if (Objects.isNull(row))
            row=sheet.createRow(i);
        Cell cell = row.getCell(0);
        if (Objects.isNull(cell))
            cell = row.createCell(0);
    }
    //下拉列表的数据,一般从数据库取出
    List<String> acctitleList = getAcctitleList();
    Sheet hiddenSheet = workbook.createSheet("hidden");
    for (int i = 0; i < acctitleList.size(); i++) {
        Row row = hiddenSheet.createRow(i);
        Cell cell = row.createCell(0);
        cell.setCellValue(acctitleList.get(i));
    }
    //hidden 的索引为1,隐藏sheet
    workbook.setSheetHidden(1,true);
    //格式为  sheet名字!$起始列名$起始行号:$结束列名$结束行号
    String formula = "hidden!$A$1:$A$"+acctitleList.size();
    setDataValidation(sheet,0,formula);
    workbook.write(new FileOutputStream("D:\\poitest\\测试.xlsx"));
}
/**
 * 模拟从数据库中取数据
 */
private List<String> getAcctitleList(){
    List<String> list = new ArrayList<>();
    list.add("6405020000 | 税金及附加-土地增值税");
    list.add("6405090000 | 税金及附加-城市维护建设税");
    list.add("6405100000 | 税金及附加-教育费附加");
    list.add("6405030000 | 税金及附加-房产税");
    list.add("6405040000 | 税金及附加-土地使用税");
    list.add("6405110000 | 税金及附加-地方教育附加");
    list.add("6405080000 | 税金及附加-印花税");
    list.add("6405120000 | 税金及附加-水利建设基金");
    list.add("2221210000 | 应交税费-应交城市维护建设税");
    list.add("2221140000 | 应交税费-应交土地增值税");
    list.add("2221220000 | 应交税费-应交教育费附加");
    list.add("2221150000 | 应交税费-应交房产税");
    list.add("2221160000 | 应交税费-应交土地使用税");
    list.add("2221230000 | 应交税费-应交地方教育费附加");
    list.add("2221200000 | 应交税费-应交印花税");
    list.add("2221240000 | 应交税费-水利建设基金");
    list.add("5005040400 | 服务成本-劳务费-保绿费");
    list.add("2241050000 | 其他应付款-暂估/预提费");
    return list;
}


http://www.kler.cn/news/311481.html

相关文章:

  • 获取多媒体相册的内容
  • WEB攻防-JavaWweb项目JWT身份攻击组件安全访问控制
  • Qt 菜单栏、工具栏、状态栏、标签、铆接部件(浮动窗口) 设置窗口核心部件(文本编辑控件)的基本使用
  • 代理模式-动态代理
  • Vue3:defineProps接收父组件传递的数据
  • java八股文之Redis
  • Git 分支规范
  • 【Redis】个人笔记
  • java项目之在线考试与学习交流网页平台源码(springboot)
  • Ruby-SAML CVE-2024-45409 漏洞解决方案
  • 【快速笔记】freeRTOS
  • Loki 分布式日志中心服务
  • Hive基本原理与数据开发
  • 唯徳知识产权管理系统 UploadFileWordTemplate 任意文件读取
  • 开源项目 GAN 漫画风格化 UGATIT
  • 如何借助项目管理系统实现审批流程的自动化与标准化?
  • 无人机 PX4 飞控 | EKF 使用传感器汇总与添加传感器方法
  • Photoshop使用方法大全
  • Zookeeper工作机制和特点
  • 软件验收测试报告模版分享?专业软件验收测试公司推荐
  • 如何安装和注册 GitLab Runner
  • 【STM32系统】基于STM32设计的SD卡数据读取与上位机显示系统(SDIO接口驱动、雷龙SD卡)——文末资料下载
  • 单片机,传感器等低功耗管理
  • 模块化编程:构建灵活与高效的系统
  • python简介
  • L67 【哈工大_操作系统】操作系统历史 学习任务
  • spring MVC基础注解汇总
  • js取出一个对象中指定的字段(封装公共方法)
  • Redis 哨兵模式配置教程
  • docker在基础镜像上,比如rockylinux,如何配置yum仓库