最近做到导出功能经常用到,在此记录实现方式,首先导入maven poi 依赖,使用已存在的模板测试
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>5.0.0</version>
</dependency>
实现方式一:
手动添加下拉选项,但是这种单元格不能超过255个字符,如果只是简单的下拉数据,可以使用这种方便。
/**
* 设置下拉框
*
* @param sheet 指定sheet页
* @param values 下拉框的值
* @param firstRow 起始行号
* @param lastRow 起始行号
* @param firstCol 起始列号
* @param lastCol 终止列号
*
* @author zengwei
* @email 1014483974@qq.com
* @date 2021-05-30
*
* 能日赚30的APP试玩平台推荐,亲测有效、
* (https://mp.weixin.qq.com/s/V5j45WYoyIvFsZbua56RSQ)
*/
public static void setDropDownBox(XSSFSheet sheet, String[] values, Integer firstRow, Integer lastRow, Integer
firstCol, Integer lastCol) {
XSSFDataValidationHelper dvHelper = new XSSFDataValidationHelper(sheet);
XSSFDataValidationConstraint dvConstraint = (XSSFDataValidationConstraint) dvHelper.createExplicitListConstraint(values);
CellRangeAddressList addressList = new CellRangeAddressList(firstRow, lastRow, firstCol, lastCol);
DataValidation validation = dvHelper.createValidation(dvConstraint, addressList);
//这两行设置单元格只能是列表中的内容,否则报错
validation.setSuppressDropDownArrow(true);
validation.setShowErrorBox(true);
sheet.addValidationData(validation);
}
调用方法
/**
* 生成excel下拉框
*
* @author zengwei
* @email 1014483974@qq.com
* @date 2021-05-30
*/
public static void main(String[] args) {
FileOutputStream out = null;
File file = new File("F://test.xlsx");
try (XSSFWorkbook wb = new XSSFWorkbook(file)) {
// 选中指定sheet
XSSFSheet sheet = wb.getSheetAt(wb.getSheetIndex("sheet1"));
String[] values = {"blue", "red", "black"};
setDropDownBox(sheet, values, 1, 100, 0, 0);
// 写入文件
String outFile = "F://" + RandomUtil.randomString(10) + ".xlsx";
out = new FileOutputStream(outFile);
wb.write(out);
} catch (InvalidFormatException | IOException e) {
e.printStackTrace();
} finally {
if (out != null) {
try {
out.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
生成的模板效果
实现方式二:
从单元格选择下拉选项,手动添加下拉选项单元格不能超过255个字符,否则会报A valid formula or a list of values must be less than or equal to 255 characters (including separators).
。
我们需要创建一个隐藏的sheet,从隐藏的sheet页获取单元格内容作为下拉选项。
/**
* 设置下拉框数据
*
* @param wb 表格对象
* @param typeName 要渲染的sheet名称
* @param values 下拉框的值
* @param firstCol 起始列号
* @param lastCol 终止列号
*
* @author zengwei
* @email 1014483974@qq.com
* @date 2021-05-30
*
* 能日赚30的APP试玩平台推荐,亲测有效
* (https://mp.weixin.qq.com/s/V5j45WYoyIvFsZbua56RSQ)
*/
public void setDropDownBox(XSSFWorkbook wb, String typeName, String[] values, Integer firstCol, Integer lastCol) {
//获取所有sheet页个数
int sheetTotal = wb.getNumberOfSheets();
//处理下拉数据
if (values != null && values.length != 0) {
//新建一个sheet页
String hiddenSheetName = "hiddenSheet";
XSSFSheet hiddenSheet = wb.getSheet(hiddenSheetName);
if (hiddenSheet == null) {
hiddenSheet = wb.createSheet(hiddenSheetName);
//写入下拉数据到新的sheet页中
for (int i = 0; i < values.length; i++) {
XSSFRow row = hiddenSheet.createRow(i);
XSSFCell cell = row.createCell(0);
cell.setCellValue(values[i]);
}
//将新建的sheet页隐藏掉
wb.setSheetHidden(sheetTotal, true);
}
//获取新sheet页内容
String strFormula = hiddenSheetName + "!$A$1:$A$65535";
XSSFDataValidationConstraint constraint = new XSSFDataValidationConstraint(DataValidationConstraint.ValidationType.LIST, strFormula);
// 设置数据有效性加载在哪个单元格上,四个参数分别是:起始行、终止行、起始列、终止列
CellRangeAddressList regions = new CellRangeAddressList(0, 65535, firstCol, lastCol);
// 数据有效性对象
DataValidationHelper help = new XSSFDataValidationHelper(hiddenSheet);
DataValidation validation = help.createValidation(constraint, regions);
XSSFSheet sheet1 = wb.getSheet(typeName);
sheet1.addValidationData(validation);
}
}
调用方法
/**
* 生成excel下拉框
*
* @author zengwei
* @email 1014483974@qq.com
* @date 2021-05-30
*/
@Test
public void test() {
List<FreightTemplate> list = freightTemplateService.list();
List<String> nameList = list.stream().map(FreightTemplate::getName).collect(Collectors.toList());
String[] values = Convert.toStrArray(nameList);
// 导出excel到指定位置
FileOutputStream out = null;
File file = new File("F://test.xlsx");
try (XSSFWorkbook wb = new XSSFWorkbook(file)) {
// 选中指定sheet
setDropDownBox(wb, "sheet1", values, 0, 0);
// 写入文件
String outFile = "F://" + RandomUtil.randomString(10) + ".xlsx";
out = new FileOutputStream(outFile);
wb.write(out);
} catch (InvalidFormatException | IOException e) {
e.printStackTrace();
} finally {
if (out != null) {
try {
out.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
生成的模板效果
右键点击sheet,可以看见后面是有隐藏的sheet的,这个隐藏sheet的单元格数据,就是我们下拉显示的数据。
以上是对excel导出生成下拉框的两种方式的总结,希望能帮助到更多的开发者。
原文:https://www.cnblogs.com/shiqiboy3974/p/14829478.html