前言
使用POI生成某一列带有下拉框的Excel表格,下面例子我是用来生成导入模板的下载的
一、引入依赖
代码如下(示例):
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>${poi.version}</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>${poi.version}</version>
</dependency>
二、代码
1XSSFWorkbook生成下拉框
代码如下(示例):
@Test
public void testXlsxDropDown()throws Exception{
File file= new File("D:\\c\\模板下拉.xlsx");
OutputStream fileOutputStream = new FileOutputStream(file);
Field[] declaredFields = EcsUserImportExcel.class.getDeclaredFields();
List<EcsOrg> ecsOrgs = ecsOrgService.getBaseMapper().selectList(new LambdaQueryWrapper<EcsOrg>().eq(EcsOrg::getDelFlag, DEL_FLAG_NORMAL));
//获取下拉框需要的数据数组
List<String> orgNames = ecsOrgs.stream().map(e -> e.getOrgName()).collect(Collectors.toList());
String[] datas=new String[orgNames.size()];
orgNames.toArray(datas);
XSSFWorkbook xssfWorkbook = new XSSFWorkbook();
SXSSFWorkbook workbook = new SXSSFWorkbook(xssfWorkbook,100,false,false);
SXSSFSheet sheet = workbook.createSheet("export");
//首行 ,标题行
SXSSFRow row = sheet.createRow(0);
List<String> titleString=new ArrayList<>();
//反射获取标题数据。
for (Field declaredField : declaredFields) {
ExcelHeader annotation = declaredField.getAnnotation(ExcelHeader.class);
if (null!=annotation){
titleString.add(annotation.value());
}
}
//设置标题
for (int i = 0; i < titleString.size(); i++) {
SXSSFCell cell = row.createCell(i);
cell.setCellValue(titleString.get(i));
}
//调用创建下拉框方法
setLongHSSFValidation(workbook,datas,sheet,1,rowNum==null?10000:rowNum+1,16);
workbook.write(fileOutputStream);
}
2.创建下拉框方法
代码如下(示例):
/**
* excel设置下拉cell。下拉数据放在隐藏的sheet中。
* 解决下拉框过长不显示问题
* @param workbook HSSFWorkbook 和XSSFWorkbook 都支持
* @param dataList 下拉数据的数组
* @param sheet
* @param firstRow 开始行
* @param endRow 结束行
* @param cellNum 下拉框所在的列
*/
// public static void setLongHSSFValidation(SXSSFWorkbook workbook,String[] deptList ,SXSSFSheet sheet ,int firstRow, int endRow, int cellNum,int sheetIndex) {
public static void setLongHSSFValidation(Workbook workbook, String[] dataList , Sheet sheet , int firstRow, int endRow, int cellNum) {
String hiddenName = "hidden" + cellNum;
//1.创建隐藏的sheet页。
Sheet hidden = workbook.createSheet(hiddenName);
//2.将下拉框需要的数组值存入隐藏的sheet中
for (int i = 0, length = dataList.length; i < length; i++) {
hidden.createRow(i).createCell(cellNum).setCellValue(dataList[i]);
}
//创建"名称"标签,用于链接
Name category1Name = workbook.createName();
category1Name.setNameName(hiddenName);
//3 A1:A代表隐藏域创建第N列createCell(N)时。以A1列开始A行数据获取下拉数组
category1Name.setRefersToFormula(hiddenName + "!A$1:A$" + dataList.length);
//数据有效性对象
DataValidationHelper helper = sheet.getDataValidationHelper();
DataValidationConstraint constraint = helper.createFormulaListConstraint(hiddenName);
//四个参数:要添加下拉框的首行、末行、首列、末列
CellRangeAddressList addressList = new CellRangeAddressList(1, endRow, cellNum, cellNum);
DataValidation dataValidation = helper.createValidation(constraint, addressList);
if (dataValidation instanceof XSSFDataValidation) {
// 数据校验
dataValidation.setSuppressDropDownArrow(true);
dataValidation.setShowErrorBox(true);
} else {
dataValidation.setSuppressDropDownArrow(false);
}
// 作用在目标sheet上
sheet.addValidationData(dataValidation);
// 设置hiddenSheet隐藏
workbook.setSheetHidden(workbook.getSheetIndex(hidden),true);
}
总结
上方的列子是使用SXSSFWorkbook创建xlsx格式的Excel表格,生成下拉框的方法可以传入HSSFWorkbook和HSSFSheet对象创建xls格式的Excel表格。 上面只给出了主要的POI依赖,其他依赖请自行添加。本文借鉴了:
1java操作poi生成excel.xlsx设置下拉框https://blog.csdn.net/weixin_39709686/article/details/82828007
以及:
2下拉框数据过多不显示问题https://blog.csdn.net/u012427355/article/details/111995378