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);
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM