關於Excel2003行數(65535)和列數(255)限制問題解決


      服務器運行一直都是正常的,最近卻爆了一個讓人頭疼的錯誤。

先貼錯誤:

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

 

 

代碼不是最簡的,還可以做一部分的提取處理.........嘻嘻

 


免責聲明!

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



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