Java 导出Excel增加下拉框选项
作者:小小小LIN子 发布时间:2021-10-13 07:58:50
标签:Java,导出,Excel,J,增加,下拉框,选项
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:$" + 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++;
}
}
}
public static class DataValidationCell{
private int startRow;
private int endRow;
private int startColumn;
private int endColumn;
private List<String> dataList;
}
来源:https://juejin.cn/post/6999544378951729160


猜你喜欢
- 本文实例为大家分享了convinientbanner顶部广告轮播控件的具体代码,供大家参考,具体内容如下gradle中添加compile &
- 1、使用Adobe PDF Reader控件。从COM组件库中找到Adobe PDF Reader控件,添加到工具箱中。从工具箱中拖入PDF
- 前言Spring的一个核心功能是IOC,就是将Bean初始化加载到容器中,Bean是如何加载到容器的,可以使用Spring注解方式或者Spr
- 阿里、华为、腾讯Java技术面试题精选,具体内容如下JVM的类加载机制是什么?有哪些实现方式?类加载机制:类的加载指的是将类的.class文
- 游标查询(scroll)简介scroll 查询 可以用来对 Elasticsearch 有效地执行大批量的文档查询,而又不用付出深度分页那种
- checkpoint 机制的具体实现我们都知道为了优化分布式存储系统中 NameNode 的重启性能,我们引进了 checkpoint 机制
- 本文为大家分享了Android实现水波纹效果展示的具体代码,供大家参考,具体内容如下一、效果二、实现原理自定义view,使用Path和贝塞尔
- 委托定义类型,类型指定特定方法签名。可将满足此签名的方法(静态或实例)分配给该类型的变量,然后(使用适当参数)直接调用该方法,或将其作为参数
- 我贴c#的代码: namespace IWebs.Webs{ using System; using System.Web.Services
- 本文实例讲解了java遍历读取xml文件内容的详细代码,分享给大家供大家参考,具体内容如下package test;import java.
- 本文为大家分享了maven环境变量配置的具体方法,供大家参考,具体内容如下一、maven环境配置1.解压apache-maven
- “深入浅出,人人都是程序员”开发过android手机的同学都知道在eclipse中可以直接查找到SHA1值,但是使用intellij ide
- 写下来自己以后看:先是item的布局文件:里边放了一个图片和一个文本框<?xml version="1.0" en
- 第一次下载好Android源代码工程后,我们通常是在Android源代码工程目
- 本文实例为大家分享了SpringMVC使用MultipartFile实现文件上传的具体代码,供大家参考,具体内容如下一、配置文件Spring
- 定义定义了算法家族,分别封装起来,让他们之间可以相互替换,此模式让算法的变化,不会影响到使用算法的客户。解决的问题在有多种算法相似的情况下,
- 在上一篇文章:Flutter进阶—实现动画效果(二)的最后,我们实现了一个控件,其中包含各种布局和状态处理控件。以及使用自定义的动画感知绘图
- 分页application.ymlspring: datasource: url: jdbc:mysql://127.0.0.1/jpa?u
- 本文实例讲述了C#获取指定PDF文件页数的方法。分享给大家供大家参考。具体如下:using System;using System.IO;u
- 本文实例讲述了Java设计模式之工厂模式。分享给大家供大家参考,具体如下:一、 简单工厂先来思考一个问题。我们平时写程序时,会有这种情况,A