提问人:Ben Ketteridge 提问时间:8/10/2023 更新时间:8/10/2023 访问量:17
如何使用 Docx4java 向 XLSX 中的单元格添加验证规则
How do I add validation rules to cells in XLSX using Docx4java
问:
我正在使用 Docx4j(v 4.11.9,带有 Jakarta 3.0.1)来获取模板电子表格、添加新行并输出新副本。这很好用。
但是,我有以下代码用于在电子表格中的一系列单元格上创建验证规则。模板中已存在“数据”表,我想验证单元格 E2:Ex 中的值(其中 x 是新数据行数)。
CTDataValidations validationList = new CTDataValidations();
CTDataValidation validation = new CTDataValidation();
validationList.getDataValidation().add(validation);
validationList.setCount(1L);
validation.setAllowBlank(true);
validation.setError("Please indicate whether the transaction was approved or declined");
validation.setErrorTitle("Pick Status");
validation.setShowErrorMessage(true);
validation.setShowInputMessage(true);
validation.setType(STDataValidationType.LIST);
validation.setFormula1("Data!$A$2:$A$3");
validation.getSqref().add("E2:E" + (maxRow + 1));
CTExtensionList extensionlist = new CTExtensionList();
CTExtension extension = new CTExtension();
extensionlist.getExt().add(extension);
extension.setUri( "{CCE6A557-97BC-4b89-ADB6-D9C93CAAB3DF}");
QName CTDataValidations_QNAME = new QName("http://schemas.microsoft.com/office/spreadsheetml/2009/9/main", "dataValidations");
JAXBElement<CTDataValidations> validationListWrapped = new JAXBElement<>(CTDataValidations_QNAME, CTDataValidations.class, CTExtension.class, validationList);
extension.setAny(validationListWrapped);
worksheet.setExtLst(extensionlist);
然而
- 文件无法在 Excel 中干净地打开,
- 输出 XML 与 Excel 生成的 XML 不同,如果我手动附加规则。
Excel 的输出:
<extLst>
<ext uri="{CCE6A557-97BC-4b89-ADB6-D9C93CAAB3DF}" xmlns:x14="http://schemas.microsoft.com/office/spreadsheetml/2009/9/main">
<x14:dataValidations count="1" xmlns:xm="http://schemas.microsoft.com/office/excel/2006/main">
<x14:dataValidation type="list" allowBlank="1" showInputMessage="1" showErrorMessage="1" errorTitle="Pick Status" error="Please indicate whether the transaction was approved or declined" xr:uid="{A2522356-22CD-4601-A03C-CF3226D99E9C}">
<x14:formula1>
<xm:f>Data!$A$2:$A$3</xm:f>
</x14:formula1>
<xm:sqref>E2:E3</xm:sqref>
</x14:dataValidation>
</x14:dataValidations>
</ext>
</extLst>
由 Docx4j 编组时的 Java 输出:
<extLst>
<ext uri="{CCE6A557-97BC-4b89-ADB6-D9C93CAAB3DF}">
<x14:dataValidations xmlns:x14="http://schemas.microsoft.com/office/spreadsheetml/2009/9/main" count="1">
<dataValidation type="list" allowBlank="true" showInputMessage="true" showErrorMessage="true" errorTitle="Pick Status" error="Please indicate whether the transaction was approved or declined" sqref="E2:E2">
<formula1>Data!$A$2:$A$3</formula1>
</dataValidation>
</x14:dataValidations>
</ext>
</extLst>
我可以看到的主要区别是:
- 布尔属性是“true”而不是“1”
- sqref 是一个属性,而不是 dataValidation 节中的标记
- 我不相信这个公式是正确的......制定(尽管范围参考是正确的)。
有什么建议吗?
答: 暂无答案
评论