2016-02-12 118 views
3

我想使用Apache POI将文件从* .fidus(Fidus Writer)平台转换为* .docx格式,反之亦然。将自定义(扩展)属性添加到docx和段落由Apache POI

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

因此,我想知道如何使用POI类CustomProperties或类似的东西来添加一些属性到docx文件。还有可能通过使用POI向docx文件中的段落添加自定义属性(扩展属性)?

在此先感谢。

回答

3

由于*.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