Apache POI的XWPF是否支持段落的授权功能?

问题描述:

我知道,HWPF有这个功能,但是我在XWPF中找不到任何相似的东西。Apache POI的XWPF是否支持段落的授权功能?

也许有解决此问题的解决方法。如果你知道一些,请与我分享。

在此先感谢!

在Word Office OpenXML中,自动连字设置是为整个文档设置的,并且可以针对单个段落进行抑制。整个文档的设置位于软件包的/word/settings.xml部分。这是XWPFSettings,但直到现在才能使用apache poi的高级对象获取此信息。所以我们需要使用低级对象和反射来获得这个,并有权访问CTSettings.addNewAutoHyphenation

单个段落自动连字符的可能抑制在CTPPrBase.addNewSuppressAutoHyphens中完成,也不能使用高级别apache poi获得。

例子:

import java.io.FileOutputStream; 

import org.apache.poi.xwpf.usermodel.*; 

import org.apache.poi.POIXMLDocumentPart; 

import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTSettings; 
import org.openxmlformats.schemas.wordprocessingml.x2006.main.STSectionMark; 

import java.lang.reflect.Field; 

import java.math.BigInteger; 

public class CreateWordAutoHyphenation { 

public static void main(String[] args) throws Exception { 

    XWPFDocument document = new XWPFDocument(); 

    POIXMLDocumentPart part = null; 
    for (int i = 0; i < document.getRelations().size(); i++) { 
    part = document.getRelations().get(i); 
    if (part instanceof XWPFSettings) break; 
    } 
    if (part instanceof XWPFSettings) { 
    XWPFSettings settings = (XWPFSettings)part; 
    Field _ctSettings = XWPFSettings.class.getDeclaredField("ctSettings"); 
    _ctSettings.setAccessible(true); 
    CTSettings ctSettings = (CTSettings)_ctSettings.get(settings); 
    ctSettings.addNewAutoHyphenation(); 
    } 

    String testtext = "This text tests whether automatic hyphenation opportunities are set on for this document and not are suppressed for this paragraph. Since in Word Office OpenXML the automatic hyphenation settings are set for the whole document and may be suppressed for single paragraphs."; 

    XWPFParagraph paragraph = document.createParagraph(); 
    paragraph.setAlignment(ParagraphAlignment.BOTH); 
    XWPFRun run = paragraph.createRun(); 
    run.setFontSize(18); 
    run.getCTR().getRPr().addNewLang().setVal("en-US"); 
    run.setText(testtext); 

    paragraph = document.createParagraph(); 
    run=paragraph.createRun(); 
    run.addBreak(BreakType.COLUMN); 

    paragraph.setAlignment(ParagraphAlignment.BOTH); 
    paragraph.getCTP().addNewPPr().addNewSuppressAutoHyphens(); 
    run = paragraph.createRun(); 
    run.setFontSize(18); 
    run.getCTR().getRPr().addNewLang().setVal("en-US"); 
    run.setText(testtext); 

    document.getDocument().getBody().addNewSectPr().addNewType().setVal(STSectionMark.CONTINUOUS); 
    document.getDocument().getBody().getSectPr().addNewCols().setNum(BigInteger.valueOf(2)); 

    document.write(new FileOutputStream("CreateWordAutoHyphenation.docx")); 
    document.close(); 

} 
} 
+0

它完美!谢谢你,你救了我几个小时!顺便说一句CTSettings包含很多其他可用的东西,会深入研究它。 – amseager