您的位置:首页 > 游戏 > 游戏 > POI生成Excel文件增加数据验证(下拉序列)

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

2024/12/23 16:19:56 来源:https://blog.csdn.net/qq_32076957/article/details/142183035  浏览:    关键词: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);//xlsxSheet 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);//xlsxSheet 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,隐藏sheetworkbook.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;
}

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com