1. 因平台在EXCEL模版中只对单选下拉字段支持下拉项,多选下拉不支持,因此需要自行写代码支持。效果图如下:
2. 实现逻辑:在【引出数据(按引入模版)】操作时处理导出的EXCEL文件,对多选下拉字段进行下拉项处理。
3. 代码逻辑:
3.1先读出多选下拉项的内容,因EXCEL的下拉只能单选,如多选下拉的项有 A,B,C三个项,则下拉项有【A】【B】【C】【A,B】【A,C】【B,C】【A,B,C】这七种情况。
3.2 将上述这7个值输出到EXCEL的指定位置(不影响模版的情况选可输出到比较靠后的列种)。如输出到AY3-AY9七个单元格中。
3.3 找到多选下拉字段的位置,使用公式将该列转换为多选下拉项。
//--读取下拉项的值,(下拉项的值写在Sheet1的AY3-AY9位置)
createFormulaListConstraint("INDIRECT("\"Sheet1!$AY$3:$AY$9\"")");
//--多选下拉字段在第3列,需要对第5-100行做下拉项,则代码如下:
CellRangeAddressList(5, 100,3,3);
4,完整代码如下:
public void afterExportFile(ExportFileEvent e) {
File file = e.getFile();
if(file != null) {
try(FileInputStream fis = new FileInputStream(file)) {
XSSFWorkbook workBook = new XSSFWorkbook(fis);
XSSFSheet sheet = workBook.getSheetAt(0);
XSSFRow rowx1 = sheet.getRow(2);
XSSFCell cell2 = rowx1.getCell(50);
if(cell2==null) {
cell2=rowx1.createCell(50);
}
//--把下拉项的内容写到第50列的3-5行中
String res0 ="A";
String res1 ="B";
String res2 ="A,B";
cell2.setCellValue(res0);
rowx1 = sheet.getRow(3);
cell2 = rowx1.getCell(50);
if(cell2==null) {
cell2=rowx1.createCell(50);
}
cell2.setCellValue(res1);
rowx1 = sheet.getRow(4);
cell2 = rowx1.getCell(50);
if(cell2==null) {
cell2=rowx1.createCell(50);
}
cell2.setCellValue(res2);
//找到多选下拉字段的位置(多选下拉字段标识为scope)
int cellindex = 0;
int rowindex = 0;
for (int i = 1; i < 20; i++) {
for (int j = 1; j < 4; j++) {
XSSFRow row = sheet.getRow(j);
XSSFCell cell = row.getCell(i);
if (cell != null) {
String val = cell.getStringCellValue();
if (val != null && "scope".equalsIgnoreCase(val.trim())) {
cellindex = i;
rowindex=j;
break;
}
}
}
if(cellindex>0) {
break;
}
}
if(cellindex>0) {
XSSFDataValidationHelper helper=new XSSFDataValidationHelper(sheet);
String str="\""+sheet.getSheetName()+"!$AY$3:$AY$5\"";
XSSFDataValidationConstraint constitem=(XSSFDataValidationConstraint)helper.createFormulaListConstraint("INDIRECT("+str+")");
CellRangeAddressList cellRangeAddressList=new CellRangeAddressList(rowindex+2, 1000, cellindex,cellindex);
DataValidation dValidation=helper.createValidation(constitem, cellRangeAddressList);
sheet.addValidationData(dValidation);
FileOutputStream out = new FileOutputStream(file);
workBook.write(out);
workBook.close();
out.close();
}
} catch (Exception exception) {
logger.error("格式化引出的发生异常", exception);
}
}
}