簡體   English   中英

由於使用 apache-poi 庫創建下拉列表而導致 Excel 錯誤

[英]Excel corrput due to creation of dropdown list with apache-poi library

需要說明

我需要使用Apache POI在 Excel 中創建一個下拉列表。 此列表應包含字符串。

代碼

XSSFSheet sheet = workbook.getSheet(fieldName.getTabName());
XSSFDataValidationHelper helper = new XSSFDataValidationHelper(sheet);
XSSFDataValidationConstraint dvConstraint = (XSSFDataValidationConstraint) helper.createExplicitListConstraint(myarray);
CellRangeAddressList addressList = new CellRangeAddressList(3, 10, 5, 5);
XSSFDataValidation validation = (XSSFDataValidation) helper.createValidation(dvConstraint, addressList);
validation.setEmptyCellAllowed(false);
validation.setShowErrorBox(true);
sheet.addValidationData(validation);

錯誤

對於某些內容,它運行良好。 但是,如果數組myarray包含一些值,如STUDENTHOUSE, DEF ,當我想打開 Excel 時出現錯誤:

我們發現“file.xlsx”中的某些內容存在問題。 你想讓我們盡量恢復嗎? 如果您信任工作簿的來源,請單擊“是”。

附加信息

my arrayList<WebElement> 我得到了這個列表:

Select select = new Select(By.xpath("myxpath"));
List<WebElement> opt = select.getOptions();
myarray = new String[opt.size()];
for(int i = 0; i < opt.size(); i++) 
    myarray[i] = opt.get(i).getText();

但我認為這段代碼不是問題,因為我能夠獲得所有帶有關聯文本的選項。 正是當我將此內容放入createExplicitListConstraint時,才會發生一些奇怪的事情。

當我打印myarray的內容時,所有值都在控制台中正確顯示。

顯式數據驗證列表的公式長度有限制。 最大長度為 255。如果顯式數據驗證列表的公式超過 255 的長度,則Excel在打開時失敗並出現錯誤We found a problem with some content in ... 如果單擊YesExcel告訴您它已修復/xl/worksheet/sheet*.xml部分。 之后數據驗證列表不起作用。

重現示例:

import java.io.FileOutputStream;

import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.util.CellRangeAddressList;

class CreateExcelDataValidationExplicitList {

 public static void main(String[] args) throws Exception {

  int arrSize = 50;
  String[] myarray = new String[arrSize+1];

  for (int i = 0; i < arrSize; i++) {
   myarray[i] = "abcd";
  }

  myarray[arrSize] = "abcde"; // this works
  //myarray[arrSize] = "abcdef"; // this fails

  String arrayFormula = String.join(",", myarray);
System.out.println(arrayFormula.length()); // up to 255 works, bigger lengths fail

  //Workbook workbook = new HSSFWorkbook();
  Workbook workbook = new XSSFWorkbook();

  Sheet sheet = workbook.createSheet();

  DataValidationHelper dvHelper = sheet.getDataValidationHelper();
  CellRangeAddressList addressList = new CellRangeAddressList(3, 10, 5, 5);
  DataValidationConstraint dvConstraint = dvHelper.createExplicitListConstraint(myarray);

  DataValidation validation = dvHelper.createValidation(dvConstraint, addressList);
  validation.setEmptyCellAllowed(false);
  if (workbook instanceof XSSFWorkbook) validation.setShowErrorBox(true);

  sheet.addValidationData(validation);

  FileOutputStream out = null;
  if (workbook instanceof HSSFWorkbook) {
   out = new FileOutputStream("CreateExcelDataValidationExplicitList.xls");
  } else if (workbook instanceof XSSFWorkbook) {
   out = new FileOutputStream("CreateExcelDataValidationExplicitList.xlsx");
  }
  workbook.write(out);
  workbook.close();
  out.close();

 }
}

唯一的解決方案是將列表項放在單獨工作表的單元格中,然后使用createFormulaListConstraint而不是createExplicitListConstraint 我在這里展示了這一點: ComboBox 中的 Apache POI 雙值

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM