服務器運行一直都是正常的,最近卻爆了一個讓人頭疼的錯誤。
先貼錯誤:
java.lang.IllegalArgumentException: Invalid column index (256). Allowable column range for BIFF8 is (0..255) or ('A'..'IV')
at org.apache.poi.hssf.usermodel.HSSFCell.checkBounds(HSSFCell.java:921)
at org.apache.poi.hssf.usermodel.HSSFCell.<init>(HSSFCell.java:161)
at org.apache.poi.hssf.usermodel.HSSFRow.createCell(HSSFRow.java:141)
at org.apache.poi.hssf.usermodel.HSSFRow.createCell(HSSFRow.java:119)
at org.apache.poi.hssf.usermodel.HSSFRow.createCell(HSSFRow.java:97
看錯誤猜到七七八八了:由於03對行數(65535)和列數(255)有限制,所以當數據超出范圍后就報錯了。
解決辦法:把HSSF改用XSSF模塊生成Excel07的文檔
其實也可以進行驗證檢測,根據先貼excel版本跟導出數據是否超過限制,來選擇HSSF還是XSSF
貼部分代碼(其他自行補充):
is2003=false;
if(is2003){
// 加載下拉列表內容
DVConstraint constraint = DVConstraint.createFormulaListConstraint(formulaString);
// 設置數據有效性加載在哪個單元格上。
// 四個參數分別是:起始行、終止行、起始列、終止列
int firstRow = naturalRowIndex - 1;
int lastRow = naturalRowIndex - 1;
int firstCol = naturalColumnIndex - 1;
int lastCol = naturalColumnIndex - 1;
CellRangeAddressList regions = new CellRangeAddressList(firstRow, lastRow, firstCol, lastCol);
// 數據有效性對象
DataValidation data_validation_list = new HSSFDataValidation(regions, constraint);//new HSSFDataValidation(regions, constraint);
// 設置輸入信息提示信息
data_validation_list.createPromptBox("下拉選擇提示", "請使用下拉方式選擇合適的值!");
// 設置輸入錯誤提示信息
data_validation_list.createErrorBox("選擇錯誤提示", "你輸入的值未在備選列表中,請下拉選擇合適的值!");
//sheet.addValidationData(data_validation_list);
return data_validation_list;
}else{
XSSFDataValidationHelper dvHelper = new XSSFDataValidationHelper((XSSFSheet) sheet);
// 加載下拉列表內容
XSSFDataValidationConstraint constraint = (XSSFDataValidationConstraint) dvHelper
.createFormulaListConstraint(formulaString);
// 設置數據有效性加載在哪個單元格上。
// 四個參數分別是:起始行、終止行、起始列、終止列
int firstRow = naturalRowIndex - 1;
int lastRow = naturalRowIndex - 1;
int firstCol = naturalColumnIndex - 1;
int lastCol = naturalColumnIndex - 1;
CellRangeAddressList regions = new CellRangeAddressList(firstRow, lastRow, firstCol, lastCol);
DataValidation data_validation_list = (XSSFDataValidation) dvHelper.createValidation(
constraint, regions);
// 設置輸入信息提示信息
data_validation_list.createPromptBox("下拉選擇提示", "請使用下拉方式選擇合適的值!");
// 設置輸入錯誤提示信息
data_validation_list.createErrorBox("選擇錯誤提示", "你輸入的值未在備選列表中,請下拉選擇合適的值!");
sheet.addValidationData(data_validation_list);
return data_validation_list;
}
代碼不是最簡的,還可以做一部分的提取處理.........嘻嘻