为什么在 Apache 5.2.2 中删除了 STOnOff 枚举?如何设置 X_0 & X_1 值?

Why STOnOff Enums are removed in Apache 5.2.2 ? How to set X_0 & X_1 values?

我在构建 docx 文件时使用 STOnOff。X_0 枚举将 Apache POI 3.14 中的某些元素的值设置为 0(即 false)。但是现在在最新版本 5.2.2 中,我可以更改此 class 并且还引入了名为 STOnOff1 的新 class 和 On & Off 枚举。基于下面的 Whosebug 线程,我可以看到建议使用 true 或 false。

为什么删除了 STOnOff class 并且引入了另一个 class 类似 STOnOff1 而没有 STOnOff1.X_0 和 STOnOff1.X_1 枚举但只有 STOnOff1.OFF & STOnOff1.ON ?我可以使用 STTrueFalse.True/STTrueFalse.False 代替 boolean true/false 吗?任何详细的 clarification/solution 注册这些更改将非常有帮助。

具体例子:

1)对于Section的Layout列的setEqualWidth(STOnOff value),我们可以看到之前在POI 3.14中我们需要将STOnOff值设置为STOnOff.X_1,等等。但是在Apache POI 5.2中。 2 它现在接受任何对象值,所以我们现在可以在 setEqualWidth() API 中设置 STTrueFalse.True/boolean true(或)false 而不是 STOnOff.X_1 吗?

还可以看到之前接受 STOnOff.Enum 值的任何 CT API 之类的 setEqualWidth(STOnOff 值) 现在已更改为接受我们可以为其传递的对象参数STTrueFalse.True/STTrueFalse.False 而不是普通布尔值 true(or) false ?

import java.math.BigDecimal;
import java.math.BigInteger;
import java.util.List;

import org.apache.poi.xwpf.usermodel.XWPFDocument;
import org.openxmlformats.schemas.officeDocument.x2006.sharedTypes.STOnOff;
import org.openxmlformats.schemas.officeDocument.x2006.sharedTypes.STTrueFalse;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTPageMar;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTSectPr;

public class STOnOffValuesTesting {

    public static void main(String[] args) {
        
        try {
        byte[] docbytes = FileUtil.read("anysimpleDocxFile.docx"); //No i18n
        InputStream documentStream = GeneralUtils.getStreamFromArray( docbytes );
        XWPFDocument document = new XWPFDocument( documentStream );
        List<CTSectPr> documentSections = document.docSections;
        int length = documentSections.size();

        for(int i=0; i <length; i++){
            CTSectPr sectPr = documentSections.get(i);

            //In Apache POI 3.14
            sectPr.getCols().setEqualWidth(STOnOff.X_1);
            

            //But in Apache POI 5.2.2
            sectPr.getCols().setEqualWidth(true);
            sectPr.getCols().setEqualWidth(STTrueFalse.TRUE); //Is this correct ?
            }
        }catch(Exception e) {
            System.out.println(e)
        }
    }
}```

当使用低级 Office Open XML-schemas 类 时,程序员需要详细了解那些 类 在做什么。这就是 apache poi 的目的:提供一个高级层来使用那些低级 类。

Office Open XML-schemas 类 来自哪里?

那些 类 是从 XSD 文件生成的,这些文件在 Apache ECMA-376. They are contained in download part 4. The XSDs contain definitions for the XML which gets used in Office Open XML. XMLBeans 中发布,提供了 auto-generate Java 类 的方法这 XSD 秒。因此 ooxml-schemaspoi-ooxml-litepoi-ooxml-full 的 low-level Office Open XML-schemas 类 确实将给定的 XSD 定义完全转换为 Java.

因此,对于您关于此 Office Open XML-schemas 类 变化原因的问题的一般回答是,已发布的 XSDs 从 2006 年的第 1 版到2012 年第 4 版。或者使用的 XMLBeans 版本发生了变化并且 XSD - Java - 翻译有点不同。

STOnOff 对比 STTrueFalse

XML 类型 ST_OnOffwml.xsd 第一版中定义为“true”、“false”、“on”、“off”、“1”的枚举”,“0”。现在在第 4 版中,它在 shared-commonSimpleTypes.xsd 中定义为 xsd:booleanST_OnOff1,其中 ST_OnOff1 是“开”、“关”的枚举。这可能是因为 xsd:boolean 已经包含“true”、“false”、“1”、“0”。所以它可以代替以前使用的枚举。

XML 类型 ST_TrueFalsevml-main.xsd 第 1 版中定义为“t”、“f”、“true”、“false”的枚举。现在在第 4 版中,它在 shared-commonSimpleTypes.xsd 中也被定义为“t”、“f”、“true”、“false”的枚举。但它只在 VML.

中使用

所以STTrueFalseSTOnOff是不一样的。一个不能代替另一个。是否需要使用一个或另一个由上下文决定。它由使用 ST_TrueFalseST_OnOff 类型的 XML 类型定义。例如文字处理中的类型 CT_OnOff 使用 ST_OnOff 或多个 VML 类型使用 ST_TrueFalse.

根据 JavaCTSectPr - CTColumns.setEqualWidth 可以简单地使用以下代码使用 apache poi 5.2.2:

进行测试
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTSectPr;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTColumns;
import org.openxmlformats.schemas.officeDocument.x2006.sharedTypes.STTrueFalse;
import org.openxmlformats.schemas.officeDocument.x2006.sharedTypes.STOnOff1;

class STOnOffValuesTesting {

 public static void main(String[] args) throws Exception {
  CTSectPr sectPr = CTSectPr.Factory.newInstance();
  CTColumns cols = sectPr.addNewCols();
  cols.setEqualWidth(true); //cols.setEqualWidth(false); // works and gets used by Apache POI by default
  System.out.println(sectPr);
  cols.setEqualWidth("1"); //cols.setEqualWidth("0"); // works and gets used by Microsoft by default
  System.out.println(sectPr);
  cols.setEqualWidth(STOnOff1.ON); //cols.setEqualWidth(STOnOff1.OFF); // works but never gets used by Microsoft instead of boolean 
  System.out.println(sectPr);
  //cols.setEqualWidth(STTrueFalse.TRUE); //cols.setEqualWidth(STTrueFalse.FALSE); // will not work as STTrueFalse only gets used in VML
 }
}

cols.setEqualWidth(STTrueFalse.TRUE) 抛出异常。 cols.setEqualWidth(STOnOff1.ON) 按照定义工作。但我不会使用它,因为 Microsoft Word 本身从不在这种情况下使用“开”/“关”。