Java 由于使用ApachePOI库创建下拉列表而导致Excel corrput
需要说明 我需要使用Java 由于使用ApachePOI库创建下拉列表而导致Excel corrput,java,excel,apache-poi,Java,Excel,Apache Poi,需要说明 我需要使用apachepoi在Excel中创建一个下拉列表。此列表应包含字符串 代码 XSSFSheet sheet = workbook.getSheet(fieldName.getTabName()); XSSFDataValidationHelper helper = new XSSFDataValidationHelper(sheet); XSSFDataValidationConstraint dvConstraint = (XSSFDataValidationConstra
apachepoi
在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
包含一些值,如STUDENT
或HOUSE,DEF
,则我在打开Excel时出错:
我们发现“file.xlsx”中的某些内容存在问题。你想让我们尽力恢复吗?如果您信任工作簿的来源,请单击“是”
其他信息
我的数组
是列表
。我得到这份名单是因为:
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();
Select=newselect(By.xpath(“myxpath”);
List opt=select.getOptions();
myarray=新字符串[opt.size()];
对于(int i=0;i
但我认为这段代码不是问题所在,因为我能够获得所有与文本相关的选项。当我将此内容放入createExplicitListConstraint
时,奇怪的事情发生了
当我打印
myarray
的内容时,所有值都会在控制台中正确显示。显式数据验证列表的公式长度有限制。最大长度为255。如果显式数据验证列表的公式长度超过255,则Excel
在打开时失败,出现错误我们在…
中发现一些内容有问题。如果单击Yes
,Excel
会告诉您它已修复了/xl/sheet/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();
}
}
import java.io.FileOutputStream;
导入org.apache.poi.ss.usermodel.*;
导入org.apache.poi.xssf.usermodel.xssf工作簿;
导入org.apache.poi.hssf.usermodel.HSSFWorkbook;
导入org.apache.poi.ss.util.CellRangeAddressList;
类CreateExcelDataValidationExplicitList{
公共静态void main(字符串[]args)引发异常{
int arrSize=50;
String[]myarray=新字符串[arrSize+1];
对于(int i=0;i
唯一的解决方案是将列表项放在单独工作表的单元格中,然后使用
createFormulaListConstraint
而不是createExplicitListConstraint
。我已经在这里展示了:。显式数据验证列表的公式长度有一个限制。最大长度为255。如果显式数据验证列表的公式长度超过255,则Excel
在打开时失败,出现错误我们在…
中发现一些内容有问题。如果单击Yes
,Excel
会告诉您它已修复了/xl/sheet/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();
}
}
import java.io.FileOutputStream;
导入org.apache.poi.ss.usermodel.*;
导入org.apache.poi.xssf.usermodel.xssf工作簿;
导入org.apache.poi.hssf.usermodel.HSSFWorkbook;
导入org.apache.poi.ss.util.CellRangeAddressList;
类CreateExcelDataValidationExplicitList{
公共静态void main(字符串[]args)引发异常{
int arrSize=50;
String[]myarray=新字符串[arrSize+1];
对于(int i=0;i
唯一的解决方案是将列表项放在单独工作表的单元格中,然后使用createFormulaListConstraint
而不是createExplicitListConstraint
。我已经在这里展示了:。它将是ve