/**
* @param @param handers Excel列标题(数组)
* @param @param downData 下拉框数据(数组)
* @param @param downRows 下拉列的序号(数组,序号从0开始)
* @return void
* @throws
* @Title: createExcelTemplate
* @Description: 生成Excel导入模板
*/
public AjaxResult createExcelTemplate(String[] handers, List<String[]> downData, String[] downRows, String fileName) {
HSSFWorkbook wb = new HSSFWorkbook();//创建工作薄
//表头样式
HSSFCellStyle style = wb.createCellStyle();
// style.setAlignment(HSSFCellStyle.); // 创建一个居中格式
//字体样式
HSSFFont fontStyle = wb.createFont();
fontStyle.setFontName("微软雅黑");
fontStyle.setFontHeightInPoints((short) 12);
// fontStyle.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
style.setFont(fontStyle);
//新建sheet
HSSFSheet sheet1 = wb.createSheet("Sheet1");
HSSFSheet sheet2 = wb.createSheet("Sheet2");
//生成sheet1内容
HSSFRow rowFirst = sheet1.createRow(0);//第一个sheet的第一行为标题
//写标题
for (int i = 0; i < handers.length; i++) {
HSSFCell cell = rowFirst.createCell(i); //获取第一行的每个单元格
if (i == 3) {
sheet1.setColumnWidth(i, 8000); //设置每列的列宽
} else {
sheet1.setColumnWidth(i, 4000); //设置每列的列宽
}
cell.setCellStyle(style); //加样式
cell.setCellValue(handers[i]); //往单元格里写数据
}
//设置下拉框数据
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;
HSSFRow row = null;
for (int r = 0; r < downRows.length; r++) {
String[] dlData = downData.get(r);//获取下拉对象
int rownum = Integer.parseInt(downRows[r]);
StringBuilder longth= new StringBuilder();
for (String dlDatum : dlData) {
if (StringUtils.isNotEmpty(dlDatum)){
longth.append(dlDatum);
}
}
if (longth.toString().length() < 255) { //255以内的下拉
//255以内的下拉,参数分别是:作用的sheet、下拉内容数组、起始行、终止行、起始列、终止列
sheet1.addValidationData(setDataValidation(sheet1, dlData, 1, 500, rownum, rownum)); //超过255个报错
} else { //255以上的下拉,即下拉列表元素很多的情况
//1、设置有效性
//String strFormula = "Sheet2!$A$1:$A$5000" ; //Sheet2第A1到A5000作为下拉列表来源数据
String strFormula = "Sheet2!$" + arr[index] + "$1:$" + arr[index] + "$5000"; //Sheet2第A1到A5000作为下拉列表来源数据
sheet2.setColumnWidth(r, 4000); //设置每列的列宽
//设置数据有效性加载在哪个单元格上,参数分别是:从sheet2获取A1到A5000作为一个下拉的数据、起始行、终止行、起始列、终止列
sheet1.addValidationData(SetDataValidation(strFormula, 1, 500, rownum, rownum)); //下拉列表元素很多的情况
//2、生成sheet2内容
for (int j = 0; j < dlData.length; j++) {
if (index == 0) { //第1个下拉选项,直接创建行、列
row = sheet2.createRow(j); //创建数据行
sheet2.setColumnWidth(j, 4000); //设置每列的列宽
row.createCell(0).setCellValue(dlData[j]); //设置对应单元格的值
} else { //非第1个下拉选项
int rowCount = sheet2.getLastRowNum();
//System.out.println("========== LastRowNum =========" + rowCount);
if (j <= rowCount) { //前面创建过的行,直接获取行,创建列
//获取行,创建列
sheet2.getRow(j).createCell(index).setCellValue(dlData[j]); //设置对应单元格的值
} else { //未创建过的行,直接创建行、创建列
sheet2.setColumnWidth(j, 4000); //设置每列的列宽
//创建行、创建列
sheet2.createRow(j).createCell(index).setCellValue(dlData[j]); //设置对应单元格的值
}
}
}
index++;
}
}
//隐藏码值sheet页
int sheetNum = wb.getNumberOfSheets();
for (int n = 1; n < sheetNum; n++) {
wb.setSheetHidden(n, true);
}
try {
String filename = fileName + ".xlsx";
FileOutputStream out = new FileOutputStream(getAbsoluteFile(filename));
out.flush();
wb.write(out);
out.close();
return AjaxResult.success(filename);
} catch (IOException e) {
e.printStackTrace();
return AjaxResult.error("生成Excel文件出错!请联系管理员");
}
}
/**
* @param @param strFormula
* @param @param firstRow 起始行
* @param @param endRow 终止行
* @param @param firstCol 起始列
* @param @param endCol 终止列
* @param @return
* @return HSSFDataValidation
* @throws
* @Title: SetDataValidation
* @Description: 下拉列表元素很多的情况 (255以上的下拉)
*/
private HSSFDataValidation SetDataValidation(String strFormula,
int firstRow, int endRow, int firstCol, int endCol) {
// 设置数据有效性加载在哪个单元格上。四个参数分别是:起始行、终止行、起始列、终止列
CellRangeAddressList regions = new CellRangeAddressList(firstRow, endRow, firstCol, endCol);
DVConstraint constraint = DVConstraint.createFormulaListConstraint(strFormula);
HSSFDataValidation dataValidation = new HSSFDataValidation(regions, constraint);
dataValidation.createErrorBox("Error", "Error");
dataValidation.createPromptBox("", null);
return dataValidation;
}
/**
* @param @param sheet
* @param @param textList
* @param @param firstRow
* @param @param endRow
* @param @param firstCol
* @param @param endCol
* @param @return
* @return DataValidation
* @throws
* @Title: setDataValidation
* @Description: 下拉列表元素不多的情况(255以内的下拉)
*/
private DataValidation setDataValidation(Sheet sheet, String[] textList, int firstRow, int endRow, int firstCol, int endCol) {
DataValidationHelper helper = sheet.getDataValidationHelper();
//加载下拉列表内容
DataValidationConstraint constraint = helper.createExplicitListConstraint(textList);
//DVConstraint constraint = new DVConstraint();
constraint.setExplicitListValues(textList);
//设置数据有效性加载在哪个单元格上。四个参数分别是:起始行、终止行、起始列、终止列
CellRangeAddressList regions = new CellRangeAddressList((short) firstRow, (short) endRow, (short) firstCol, (short) endCol);
//数据有效性对象
DataValidation data_validation = helper.createValidation(constraint, regions);
//DataValidation data_validation = new DataValidation(regions, constraint);
return data_validation;
}
原博文:
https://www.cnblogs.com/mingyue1818/p/6054188.html
这里还是会有点问题,,当有多个下拉框的数据超过255时,,在生成之后。。下拉框的长度会以最大下拉框的数据长度为基准,目前为止我还没有发现怎么去修改。如果有哪位大佬知道咋操作,可以留言告诉我,谢谢!!!