【问题标题】:Add custom (extended) properties to docx and paragraphs by Apache POI通过 Apache POI 将自定义(扩展)属性添加到 docx 和段落
【发布时间】:2016-02-13 16:54:11
【问题描述】:

我想使用 Apache POI 将文件从 *.fidus (Fidus Writer) 平台转换为 *.docx 格式,反之亦然。

在 *.fidus 文件中,我需要将一些属性作为扩展或自定义属性存储在 *.docx 文件中,然后在我想将其转换回 *.fidus 时检索它们。

因此,我想知道如何使用 POI 的 CustomProperties 类或类似的东西将一些属性添加到 docx 文件。也可以使用 POI 在 docx 文件的段落中添加自定义属性(扩展属性)吗?

提前致谢。

【问题讨论】:

    标签: java apache-poi xwpf


    【解决方案1】:

    由于*.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() 只能设置布尔、双精度、整数或字符串属性,但底层的CTProperty 包含更多可能性。

    对于CTProperty,请参阅http://grepcode.com/file/repo1.maven.org/maven2/org.apache.poi/ooxml-schemas/1.1/org/openxmlformats/schemas/officeDocument/x2006/customProperties/CTProperty.java#CTProperty

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-10-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多