如果导出到 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();
}
}
我正在使用 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();
}
}