Java 如何正确地从ApachePOI数据验证器强制转换显式ListValue以进行测试?
我已将数据约束添加到Apache POI工作簿的工作表中。现在我想添加一个单元测试 我的约束是两个值的简单列表,“是”和“否” 我目前的尝试:Java 如何正确地从ApachePOI数据验证器强制转换显式ListValue以进行测试?,java,junit,casting,apache-poi,Java,Junit,Casting,Apache Poi,我已将数据约束添加到Apache POI工作簿的工作表中。现在我想添加一个单元测试 我的约束是两个值的简单列表,“是”和“否” 我目前的尝试: Assert.assertEquals( Arrays.toString("yes,no".split(",")), Arrays.toString(dv.get(0).getValidationConstraint().getExplicitListValues())); } 失败于 expected:<[[yes, no]]>
Assert.assertEquals(
Arrays.toString("yes,no".split(",")),
Arrays.toString(dv.get(0).getValidationConstraint().getExplicitListValues()));
}
失败于
expected:<[[yes, no]]> but was:<[["yes, no"]]
及
没关系,array.toString(…getExplicitListValues())
的输出总是会显示额外的引号
--编辑2:
为了解决这个问题,我按照@axel ichter建议的方式创建了这个列表:
XSSFDataValidationConstraint c =
(XSSFDataValidationConstraint) dvHelper.createExplicitListConstraint(
"\"yes,no".split(","));
然后我得到了一些别的东西:
expected:<[[yes, no]]> but was:<[[""yes, no"]]>
无法复制您的问题。使用apache poi 4.0.1以下代码:
import java.io.FileOutputStream;
import java.io.FileInputStream;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.apache.poi.ss.util.CellRangeAddressList;
import java.util.List;
import java.util.Arrays;
class CreateExcelDataValidationLists {
public static void main(String[] args) throws Exception {
Workbook workbook = new XSSFWorkbook();
Sheet sheet = workbook.createSheet("Sheet1");
DataValidationHelper dvHelper = sheet.getDataValidationHelper();
String constraint = "yes,no";
DataValidationConstraint dvConstraint = dvHelper.createExplicitListConstraint(constraint.split(",")) ;
CellRangeAddressList addressList = new CellRangeAddressList(0,0,0,0);
DataValidation validation = dvHelper.createValidation(dvConstraint, addressList);
sheet.addValidationData(validation);
FileOutputStream out = new FileOutputStream("CreateExcelDataValidationLists.xlsx");
workbook.write(out);
out.close();
workbook.close();
Thread.sleep(1000);
workbook = WorkbookFactory.create(new FileInputStream("CreateExcelDataValidationLists.xlsx"));
sheet = workbook.getSheetAt(0);
@SuppressWarnings("unchecked")
List<DataValidation> validations = (List<DataValidation>)sheet.getDataValidations();
System.out.println(Arrays.toString(validations.get(0).getValidationConstraint().getExplicitListValues()));
}
}
刚刚测试过。同样的代码使用ApachePOI3.14确实会产生
["yes, no"]
列表约束是如何设置的?必须是
…createExplicitListConstraint(新字符串[]{“是”、“否”})
。似乎是…createExplicitListConstraint(新字符串[]{“\”yes,no\\”}
。我使用(此处简化):createExplicitListConstraint(“yes,no”.split(“,”)
),因为列表值来自一个资源/db,该资源/db为每个集合保存一个本地化字符串。Hm,但是dv.get(0).getValidationConstraint()的结果.getExplicitListValues())
看起来更像createExplicitListConstraint(“\”是,否“).split(“,”)
。我用创建它的所有方法编辑它。。。无法解释。也许这是POI代码中的错误?请看我的新的第二次编辑。额外的引号总是在那里,即使我按照你的建议包括引号。。。然后我得到两个额外的报价!我从未建议添加额外的引号。我所说的是,看起来你的字符串中已经有了额外的引号。谢谢分享!我在3点14分。可能是一只老虫子。。。将尝试更新。已确认!更新到4.0.1,我所有的问题都消失了!!!非常感谢!
ArrayUtils.contains( ....getExplicitListValues(), "yes") // returns null;
...getExplicitListValues().getClass().getTypeName() // java.lang.String[]
import java.io.FileOutputStream;
import java.io.FileInputStream;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.apache.poi.ss.util.CellRangeAddressList;
import java.util.List;
import java.util.Arrays;
class CreateExcelDataValidationLists {
public static void main(String[] args) throws Exception {
Workbook workbook = new XSSFWorkbook();
Sheet sheet = workbook.createSheet("Sheet1");
DataValidationHelper dvHelper = sheet.getDataValidationHelper();
String constraint = "yes,no";
DataValidationConstraint dvConstraint = dvHelper.createExplicitListConstraint(constraint.split(",")) ;
CellRangeAddressList addressList = new CellRangeAddressList(0,0,0,0);
DataValidation validation = dvHelper.createValidation(dvConstraint, addressList);
sheet.addValidationData(validation);
FileOutputStream out = new FileOutputStream("CreateExcelDataValidationLists.xlsx");
workbook.write(out);
out.close();
workbook.close();
Thread.sleep(1000);
workbook = WorkbookFactory.create(new FileInputStream("CreateExcelDataValidationLists.xlsx"));
sheet = workbook.getSheetAt(0);
@SuppressWarnings("unchecked")
List<DataValidation> validations = (List<DataValidation>)sheet.getDataValidations();
System.out.println(Arrays.toString(validations.get(0).getValidationConstraint().getExplicitListValues()));
}
}
[yes, no]
["yes, no"]