为什么在 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 XSD
s contain definitions for the XML
which gets used in Office Open XML
. XMLBeans 中发布,提供了 auto-generate Java
类 的方法这 XSD
秒。因此 ooxml-schemas
或 poi-ooxml-lite
或 poi-ooxml-full
的 low-level Office Open XML
-schemas 类 确实将给定的 XSD
定义完全转换为 Java
.
因此,对于您关于此 Office Open XML
-schemas 类 变化原因的问题的一般回答是,已发布的 XSD
s 从 2006 年的第 1 版到2012 年第 4 版。或者使用的 XMLBeans
版本发生了变化并且 XSD
- Java
- 翻译有点不同。
STOnOff
对比 STTrueFalse
XML
类型 ST_OnOff
在 wml.xsd
第一版中定义为“true”、“false”、“on”、“off”、“1”的枚举”,“0”。现在在第 4 版中,它在 shared-commonSimpleTypes.xsd
中定义为 xsd:boolean 和 ST_OnOff1
,其中 ST_OnOff1
是“开”、“关”的枚举。这可能是因为 xsd:boolean
已经包含“true”、“false”、“1”、“0”。所以它可以代替以前使用的枚举。
XML
类型 ST_TrueFalse
在 vml-main.xsd
第 1 版中定义为“t”、“f”、“true”、“false”的枚举。现在在第 4 版中,它在 shared-commonSimpleTypes.xsd
中也被定义为“t”、“f”、“true”、“false”的枚举。但它只在 VML
.
中使用
所以STTrueFalse
和STOnOff
是不一样的。一个不能代替另一个。是否需要使用一个或另一个由上下文决定。它由使用 ST_TrueFalse
或 ST_OnOff
类型的 XML
类型定义。例如文字处理中的类型 CT_OnOff
使用 ST_OnOff
或多个 VML
类型使用 ST_TrueFalse
.
根据 Java
和 CTSectPr
- 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 本身从不在这种情况下使用“开”/“关”。
我在构建 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 XSD
s contain definitions for the XML
which gets used in Office Open XML
. XMLBeans 中发布,提供了 auto-generate Java
类 的方法这 XSD
秒。因此 ooxml-schemas
或 poi-ooxml-lite
或 poi-ooxml-full
的 low-level Office Open XML
-schemas 类 确实将给定的 XSD
定义完全转换为 Java
.
因此,对于您关于此 Office Open XML
-schemas 类 变化原因的问题的一般回答是,已发布的 XSD
s 从 2006 年的第 1 版到2012 年第 4 版。或者使用的 XMLBeans
版本发生了变化并且 XSD
- Java
- 翻译有点不同。
STOnOff
对比 STTrueFalse
XML
类型 ST_OnOff
在 wml.xsd
第一版中定义为“true”、“false”、“on”、“off”、“1”的枚举”,“0”。现在在第 4 版中,它在 shared-commonSimpleTypes.xsd
中定义为 xsd:boolean 和 ST_OnOff1
,其中 ST_OnOff1
是“开”、“关”的枚举。这可能是因为 xsd:boolean
已经包含“true”、“false”、“1”、“0”。所以它可以代替以前使用的枚举。
XML
类型 ST_TrueFalse
在 vml-main.xsd
第 1 版中定义为“t”、“f”、“true”、“false”的枚举。现在在第 4 版中,它在 shared-commonSimpleTypes.xsd
中也被定义为“t”、“f”、“true”、“false”的枚举。但它只在 VML
.
所以STTrueFalse
和STOnOff
是不一样的。一个不能代替另一个。是否需要使用一个或另一个由上下文决定。它由使用 ST_TrueFalse
或 ST_OnOff
类型的 XML
类型定义。例如文字处理中的类型 CT_OnOff
使用 ST_OnOff
或多个 VML
类型使用 ST_TrueFalse
.
根据 Java
和 CTSectPr
- 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 本身从不在这种情况下使用“开”/“关”。