java - Web开发 - POI导出带有下拉框和下拉数据过多的问题
本文介绍了java - Web开发 - POI导出带有下拉框和下拉数据过多的问题的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
问 题
1、如果下拉数据较少(大约0~20),可用如下方式导出:
/**
* Excel API
*/
@SuppressWarnings("resource")
HSSFWorkbook book = new HSSFWorkbook();
HSSFSheet sheet = book.createSheet("xxxx");
/**
* 初始化参数
*/
Map<String, String> map = new HashMap<String, String>(); // 查询用的map
List<Object> list = null;
String[] strs = null; // 用于下拉的数组
int startRow = 1; // 下拉的开始行
int endRow = 100; // 下拉的结束行
CellRangeAddressList regions = null;
DVConstraint constraint = null;
CellRangeAddressList addressList = null;
HSSFDataValidation validation = null; // 数据验证
map.put("namespace", "xxxxxxxxxx.xxxxxxxxxx");
list = commonQueryService.queryList(map);
strs = StringUtil.mapListToStrs(list); // list转换为字符串数组
cellNum = SpuEnu.CATEGORY_1.getNumber(); // 下拉的列
regions = new CellRangeAddressList(startRow, endRow, cellNum, cellNum); // 开始行、结束行、开始列、结束列的区域被下拉替代
constraint = DVConstraint.createExplicitListConstraint(strs);
validation = new HSSFDataValidation(regions, constraint); // 绑定下拉框和作用区域
sheet.addValidationData(validation);
2、问题是如果下拉数据过多,POI会显示如下异常:
String literals in formulas can't be bigger than 255 characters ASCII
这个问题不好解决,所以我将解决办法贴在下面
解决方案
下面是解决办法:
/**
* Excel API
*/
@SuppressWarnings("resource")
HSSFWorkbook book = new HSSFWorkbook();
HSSFSheet sheet = book.createSheet("spu导入模板");
/**
* 初始化参数
*/
Map<String, String> map = new HashMap<String, String>(); // 查询用的map
List<Object> list = null;
String[] strs = null; // 用于下拉的数组
String hiddenSheet = null;
int cellNum = 0;
int startRow = 1; // 开始行
int endRow = 100; // 结束行
DVConstraint constraint = null;
CellRangeAddressList addressList = null;
HSSFDataValidation validation = null; // 数据验证
map.put("namespace", "xxxxxxx.xxxxx"); // 查询
list = commonQueryService.queryList(map);
strs = StringUtil.mapListToStrs(list);
hiddenSheet = "category1Hidden";
cellNum = SpuEnu.CATEGORY_1.getNumber();
HSSFSheet category1Hidden = book.createSheet(hiddenSheet); // 创建隐藏域
for (int i = 0, length = strs.length; i < length; i++) { // 循环赋值(为了防止下拉框的行数与隐藏域的行数相对应来获取>=选中行数的数组,将隐藏域加到结束行之后)
category1Hidden.createRow(endRow + i).createCell(cellNum).setCellValue(strs[i]);
}
Name category1Name = book.createName();
category1Name.setNameName(hiddenSheet);
category1Name.setRefersToFormula(hiddenSheet + "!A1:A" + (strs.length + endRow)); // A1:A代表隐藏域创建第?列createCell(?)时。以A1列开始A行数据获取下拉数组
constraint = DVConstraint.createFormulaListConstraint(hiddenSheet);
addressList = new CellRangeAddressList(startRow, endRow, cellNum, cellNum);
validation = new HSSFDataValidation(addressList, constraint);
book.setSheetHidden(1, true); // 1隐藏、0显示
sheet.addValidationData(validation);
请注意下面的俩个地方:
这篇关于java - Web开发 - POI导出带有下拉框和下拉数据过多的问题的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文