通过 Apache POI 将自定义(扩展)属性添加到 docx 和段落
Add custom (extended) properties to docx and paragraphs by Apache POI
我想使用 Apache POI 将文件从 *.fidus (Fidus Writer) 平台转换为 *.docx 格式,反之亦然。
在 *.fidus 文件中有一些我需要将它们作为扩展或自定义属性存储在 *.docx 文件中的属性,然后当我想将其转换回 *.fidus 时我可以检索它们。
因此我想知道如何使用 POI 的 class CustomProperties 或类似的东西将一些属性添加到 docx 文件。是否可以使用 POI 将自定义属性(扩展属性)添加到 docx 文件中的段落?
提前致谢。
由于*.docx
文档是基于XML
的,我们必须使用POIXMLProperties.CustomProperties
,参见http://poi.apache.org/apidocs/org/apache/poi/POIXMLProperties.CustomProperties.html。
示例:
import java.io.*;
import org.apache.poi.*;
import org.apache.poi.xwpf.usermodel.*;
import org.openxmlformats.schemas.officeDocument.x2006.customProperties.CTProperty;
import java.util.GregorianCalendar;
public class DocumentProperties {
public static void main(String[] args) throws IOException {
XWPFDocument document = new XWPFDocument(new FileInputStream("This is a Test.docx"));
POIXMLProperties properties = document.getProperties();
//http://poi.apache.org/apidocs/org/apache/poi/POIXMLProperties.html
//prints the core property Creator:
System.out.println(properties.getCoreProperties().getCreator());
//prints the extendend property Application:
System.out.println(properties.getExtendedProperties().getApplication());
//sets a custom property
POIXMLProperties.CustomProperties customproperties = properties.getCustomProperties();
if (!customproperties.contains("Test")) {
customproperties.addProperty("Test", 123);
}
CTProperty ctproperty = customproperties.getProperty("Test");
System.out.println(ctproperty);
System.out.println(ctproperty.getI4());
//the above customproperties.addProperty() can only set boolean, double, integer or string properties
//the CTProperty contains more possibitities
if (!customproperties.contains("Test Date")) {
customproperties.addProperty("Test Date", 0);
ctproperty = customproperties.getProperty("Test Date");
ctproperty.unsetI4();
ctproperty.setFiletime(new GregorianCalendar(2016,1,13));
}
ctproperty = customproperties.getProperty("Test Date");
System.out.println(ctproperty);
System.out.println(ctproperty.getFiletime());
FileOutputStream out = new FileOutputStream(new File("This is a Test.docx"));
document.write(out);
}
}
POIXMLProperties.CustomProperties.addProperty()
只能设置boolean、double、integer或string属性,但底层CTProperty
包含更多可能性。
我想使用 Apache POI 将文件从 *.fidus (Fidus Writer) 平台转换为 *.docx 格式,反之亦然。
在 *.fidus 文件中有一些我需要将它们作为扩展或自定义属性存储在 *.docx 文件中的属性,然后当我想将其转换回 *.fidus 时我可以检索它们。
因此我想知道如何使用 POI 的 class CustomProperties 或类似的东西将一些属性添加到 docx 文件。是否可以使用 POI 将自定义属性(扩展属性)添加到 docx 文件中的段落?
提前致谢。
由于*.docx
文档是基于XML
的,我们必须使用POIXMLProperties.CustomProperties
,参见http://poi.apache.org/apidocs/org/apache/poi/POIXMLProperties.CustomProperties.html。
示例:
import java.io.*;
import org.apache.poi.*;
import org.apache.poi.xwpf.usermodel.*;
import org.openxmlformats.schemas.officeDocument.x2006.customProperties.CTProperty;
import java.util.GregorianCalendar;
public class DocumentProperties {
public static void main(String[] args) throws IOException {
XWPFDocument document = new XWPFDocument(new FileInputStream("This is a Test.docx"));
POIXMLProperties properties = document.getProperties();
//http://poi.apache.org/apidocs/org/apache/poi/POIXMLProperties.html
//prints the core property Creator:
System.out.println(properties.getCoreProperties().getCreator());
//prints the extendend property Application:
System.out.println(properties.getExtendedProperties().getApplication());
//sets a custom property
POIXMLProperties.CustomProperties customproperties = properties.getCustomProperties();
if (!customproperties.contains("Test")) {
customproperties.addProperty("Test", 123);
}
CTProperty ctproperty = customproperties.getProperty("Test");
System.out.println(ctproperty);
System.out.println(ctproperty.getI4());
//the above customproperties.addProperty() can only set boolean, double, integer or string properties
//the CTProperty contains more possibitities
if (!customproperties.contains("Test Date")) {
customproperties.addProperty("Test Date", 0);
ctproperty = customproperties.getProperty("Test Date");
ctproperty.unsetI4();
ctproperty.setFiletime(new GregorianCalendar(2016,1,13));
}
ctproperty = customproperties.getProperty("Test Date");
System.out.println(ctproperty);
System.out.println(ctproperty.getFiletime());
FileOutputStream out = new FileOutputStream(new File("This is a Test.docx"));
document.write(out);
}
}
POIXMLProperties.CustomProperties.addProperty()
只能设置boolean、double、integer或string属性,但底层CTProperty
包含更多可能性。