我正在使用apache poi jar(poi-ooxml-3.9.jar)生成Excel文件(.xlsx),我在excel文件中添加了10列的下拉列表验证,如果我生成包含50行的Excel文件,则下拉验证正在运行。如果它超过50行,则下拉验证不会出现在Excel文件中,当我打开excel文件时,我收到消息“我们发现fileName.xlsx中的某些内容有问题。你想让我们尝试尽可能多地恢复?如果您信任此工作簿的来源,请单击“是”。单击是时,它将删除所有下拉列表验证。请解决此问题的解决方案。
不要为每个单个单元格创建DataValidationConstraint
,而只为每个需要的变化列表创建DataValidation
。然后创建DataValidationConstraint
使用那些CellRangeAddressList
连续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();
}
}
尽可能大,也不是所有的单个细胞。
示例为第1行到第10000行中的第1列到第10列创建了十个不同的列表验证。
qazxswpoi