POI导出Excel时下拉列表值超过255的问题(String literals in formulas can't be bigger than 255 characters ASCII)
//创建Excel工作薄对象
Workbook workbook = new HSSFWorkbook();
//生成一个表格 设置:页签
Sheet sheet = workbook.createSheet("sheet1");
//去数据库中查询我们想要的数据
List<Product> productList = Ebean.getServer(GlobalDBControl.getDB()) .createQuery(Product.class, "find product where 1 = 1 and status = 0 and producttype is not null ") .findList();
//创建一个数组 用来存放 我们取出来的数据
String[] productNameArray = new String[productList.size()];
//遍历每个peoduct对象,来获取productName属性并添加到数组中
for (int i = 0; i < productList.size(); i++)
{ Product product = productList.get(i);
productNameArray[i] = product.getTitle(); }
//将下拉框数据放到新的sheet里,然后excle通过新的sheet数据加载下拉框数据
Sheet hidden = workbook.createSheet("hidden");
//创建单元格对象 Cell cell = null;
//遍历我们上面的数组,将数据取出来放到新sheet的单元格中
for (int i = 0, length = productNameArray.length; i < length; i++)
{ //取出数组中的每个元素
String name = productNameArray[i];
//根据i创建相应的行对象(说明我们将会把每个元素单独放一行)
Row row = hidden.createRow(i);
//创建每一行中的第一个单元格
cell = row.createCell(0);
//然后将数组中的元素赋值给这个单元格
cell.setCellValue(name); }
// 创建名称,可被其他单元格引用
Name namedCell = workbook.createName(); namedCell.setNameName("hidden");
// 设置名称引用的公式
namedCell.setRefersToFormula("hidden!$A$1:$A$" + productNameArray.length);
//加载数据,将名称为hidden的sheet中的数据转换为List形式
DVConstraint constraint = DVConstraint.createFormulaListConstraint("hidden");
// 设置第一列的3-65534行为下拉列表
// (3, 65534, 0, 0) ====> (起始行,结束行,起始列,结束列)
CellRangeAddressList regions = new CellRangeAddressList(3, 65534, 0, 0);
// 将设置下拉选的位置和数据的对应关系 绑定到一起
DataValidation dataValidation = new HSSFDataValidation(regions, constraint);
//将第二个sheet设置为隐藏 workbook.setSheetHidden(1, true);
//将数据赋给下拉列表 sheet.addValidationData(dataValidation);
//最后将文件导出就可以了,后面的代码就不写了,我只写一些这个问题相关的代码
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
如果出现多列情况,可复用下面方法
private void ExcelTo255(Workbook workbook,String sheetName,int sheetNameIndex,String[] sheetData,int firstRow,int lastRow,int firstCol,int lastCol){
//将下拉框数据放到新的sheet里,然后excle通过新的sheet数据加载下拉框数据
Sheet hidden = workbook.createSheet(sheetName);
//创建单元格对象
Cell cell =null;
//遍历我们上面的数组,将数据取出来放到新sheet的单元格中
for (int i = 0, length = sheetData.length; i < length; i++){
//取出数组中的每个元素
String name = sheetData[i];
//根据i创建相应的行对象(说明我们将会把每个元素单独放一行)
Row row = hidden.createRow(i);
//创建每一行中的第一个单元格
cell = row.createCell(0);
//然后将数组中的元素赋值给这个单元格
cell.setCellValue(name);
}
// 创建名称,可被其他单元格引用
Name namedCell = workbook.createName();
namedCell.setNameName(sheetName);
// 设置名称引用的公式
namedCell.setRefersToFormula(sheetName+"!$A$1:$A$" + sheetData.length);
//加载数据,将名称为hidden的sheet中的数据转换为List形式
DVConstraint constraint = DVConstraint.createFormulaListConstraint(sheetName);
// 设置第一列的3-65534行为下拉列表
// (3, 65534, 2, 2) ====> (起始行,结束行,起始列,结束列)
CellRangeAddressList regions = new CellRangeAddressList(firstRow, lastRow, firstCol, lastCol);
// 将设置下拉选的位置和数据的对应关系 绑定到一起
DataValidation dataValidation = new HSSFDataValidation(regions, constraint);
//将第二个sheet设置为隐藏
workbook.setSheetHidden(sheetNameIndex, true);
//将数据赋给下拉列表
workbook.getSheetAt(0).addValidationData(dataValidation);
}