该方法通用于单码值多码值下的数据导出操作
/**
* excel导出,有码值的数据使用下拉框展示。解决下拉框最多255个字符的问题。
* 原理为新建一个隐藏状态的sheet页,用来存储下拉框的值。
*
* @param wb 工作簿 HSSFWorkbook
* @param col 当前列名
* @param boxMap 码值集合
* @param startRows 起始行
* @param endRows 终止行
* @param i 多个码值需要添加下拉,隐藏状态的sheet页名称不能重复,添加i值区分。
* @param startColIndex 起始列
* @param endColToIndex 终止列
* @return dataValidation
*/
public static HSSFDataValidation createBox(HSSFWorkbook wb, String col, Map<String, String> boxMap,int startRows, int endRows, int i, int startColIndex, int endColToIndex) {
HSSFDataValidation dataValidation = null;
String cols = "";
//查询码值集合,获取当前列的码值。
if (null != boxMap.get(col)) {
cols = boxMap.get(col);
}
//新建隐藏状态的sheet,用来存储码值。
if (cols.length() > 0) {
String str[] = cols.split(",");
//创建sheet页
HSSFSheet sheet = wb.createSheet(HIDDEN_FIX + i);
//向创建的sheet页添加码值数据。
for (int i1 = 0; i1 < str.length; i1++) {
HSSFRow row = sheet.createRow(i1);
HSSFCell cell = row.createCell((int) 0);
cell.setCellValue(str[i1]);
}
//将码值sheet页做成excel公式
Name namedCell = wb.createName();
namedCell.setNameName(HIDDEN_FIX + i);
namedCell.setRefersToFormula(HIDDEN_FIX + i + "!$A$1:$A$" + str.length);
//确定要在哪些单元格生成下拉框
DVConstraint dvConstraint = DVConstraint.createFormulaListConstraint(HIDDEN_FIX + i);
CellRangeAddressList regions = new CellRangeAddressList(startRows, endRows, startColIndex, endColToIndex);
dataValidation = new HSSFDataValidation(regions, dvConstraint);
sheet.addValidationData(dataValidation);
//隐藏码值sheet页
int sheetNum = wb.getNumberOfSheets();
for (int n = 1; n < sheetNum; n++) {
wb.setSheetHidden(n, true);
}
}
return dataValidation;
}
测试
main{
//创建Excel Sheet
HSSFWorkbook hssfWorkbook = new HSSFWorkbook();
HSSFSheet sheet = hssfWorkbook.createSheet("newsheet");
FileOutputStream out = new FileOutputStream("d:\\success.xls");
//获取数据字典码值例:
Map<String,String> boxMap = new HashMap<String,String>();
boxMap.put("性别","男,女");
//指定列名
String cellStr = "性别";
this.createBox(hssfWorkbook,cellStr,boxMap,1,1,0,0);
//写出
workbook.write(out);
//流关闭
out.close();
}