如果导出到 Excel 中超过 50 行,则下拉验证不起作用

dropdown Validation not working if it exceeds 50 rows in the Export To Excel

我正在使用 apache poi jar (poi-ooxml-3.9.jar) 生成 Excel 文件 (.xlsx),我在 excel 中为 10 列添加了下拉验证文件,如果我生成包含 50 行的 Excel 文件,则下拉验证有效。如果超过 50 行,下拉验证不会出现在 Excel 文件中,当我打开 excel 文件时,我收到消息“我们发现一些问题fileName.xlsx 中的内容。是否希望我们尝试尽可能多地恢复?如果您信任此工作簿的来源,请单击“是”。单击是时,将删除所有下拉验证。请需要解决方案来解决此问题。

为每个单元格创建DataValidationConstraint,但只为您需要的每个不同列表创建。然后创建 DataValidation 使用那些 DataValidationConstraint 连续 CellRangeAddressList 尽可能大并且 而不是 所有单个单元格。

示例为第 1 到 10000 行中的第 1 到第 10 列创建十个不同的列表验证。

import java.io.*;

import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.*;
import org.apache.poi.hssf.usermodel.*;

import org.apache.poi.ss.util.CellRangeAddressList;

class DataValidationList {

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

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

  Sheet sheet = workbook.createSheet("Data Validation");
  DataValidationHelper dvHelper = sheet.getDataValidationHelper();

  for (int col = 0; col < 10; col++) {
   DataValidationConstraint dvConstraint = dvHelper.createExplicitListConstraint(
    new String[]{"Col "+(col+1)+" one","Col "+(col+1)+" two","Col "+(col+1)+" three"});
   CellRangeAddressList addressList = new CellRangeAddressList(0, 9999, 0, col);            
   DataValidation validation = dvHelper.createValidation(
    dvConstraint, addressList);

   if(validation instanceof XSSFDataValidation) {
    validation.setSuppressDropDownArrow(true);
    validation.setShowErrorBox(true);
   }
   else {
    validation.setSuppressDropDownArrow(false);
   }

   sheet.addValidationData(validation);
  }

  String filename;

  if(workbook instanceof XSSFWorkbook) {
   filename = "DataValidationList.xlsx";
  } else {
   filename = "DataValidationList.xls";
  }

  FileOutputStream out = new FileOutputStream(filename);
  workbook.write(out);
  out.close();
  workbook.close();

 }
}