如何使用 Docx4java 向 XLSX 中的单元格添加验证规则

How do I add validation rules to cells in XLSX using Docx4java

提问人:Ben Ketteridge 提问时间:8/10/2023 更新时间:8/10/2023 访问量:17

问:

我正在使用 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);

然而

  1. 文件无法在 Excel 中干净地打开,
  2. 输出 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>

我可以看到的主要区别是:

  1. 布尔属性是“true”而不是“1”
  2. sqref 是一个属性,而不是 dataValidation 节中的标记
  3. 我不相信这个公式是正确的......制定(尽管范围参考是正确的)。

有什么建议吗?

docx4j

评论

0赞 JasonPlutext 8/11/2023
您能否在某处发布在 Excel 中创建的示例文件?我尝试创建的简单工作表包含 worksheet/dataValidations/dataValidation,而不是 extLst/ext/x14:dataValidation
0赞 JasonPlutext 8/11/2023
但是,最好的解决方案是添加对 x14 命名空间的支持;支持的 Excel 扩展位于 github.com/plutext/docx4j/tree/VERSION_11_4_8/...
0赞 Ben Ketteridge 8/11/2023
从那以后,我发现使用 docx4j 前进所需的 Jakarta JAXB 依赖项与 hibernate 和 spring-boot 冲突。我已经转向了 Apache POI,我不得不说,它有一个更具可读性的 API。不好意思。
0赞 JasonPlutext 8/13/2023
郑重声明,与 hibernate 和 spring-boot 共存应该不是问题。

答: 暂无答案