2017-04-11 775 views
0

我使用doc.createTOC();生成poi字(XWPF)中的內容表,並使用addCustomHeadingStyle(doc, ChapterLvl.LVL_1.style, 1);生成標題內容,點線和頁碼。但我想設置不同的標題級別的標題內容具有不同的字體大小,字體顏色,粗體,虛線和頁碼與其相應的標題內容具有相同的樣式,如圖片附件,有人可以給我一些建議如何做到這一點?如何設置內容的字體樣式表,包括字體顏色,字體大小和粗體字?

private static void addCustomHeadingStyle(XWPFDocument docxDocument, String strStyleId, int headingLevel) { 
     CTStyle ctStyle = CTStyle.Factory.newInstance(); 
     ctStyle.setStyleId(strStyleId); 
     CTString styleName = CTString.Factory.newInstance(); 
     styleName.setVal(strStyleId); 
     ctStyle.setName(styleName); 
     CTDecimalNumber indentNumber = CTDecimalNumber.Factory.newInstance(); 
     indentNumber.setVal(BigInteger.valueOf(headingLevel)); 
     ctStyle.setUiPriority(indentNumber); 
     CTOnOff onoffnull = CTOnOff.Factory.newInstance(); 
     ctStyle.setUnhideWhenUsed(onoffnull); 
     ctStyle.setQFormat(onoffnull); 
     CTPPr ppr = CTPPr.Factory.newInstance(); 
     ppr.setOutlineLvl(indentNumber); 
     ctStyle.setPPr(ppr); 
     XWPFStyle style = new XWPFStyle(ctStyle); 
     XWPFStyles styles = docxDocument.createStyles(); 
     style.setType(STStyleType.PARAGRAPH); 
     styles.addStyle(style); 
    } 

enter image description here

回答

0

很多您的問題似乎是約XWPF。這是一個不完整的API。您可以閱讀規範以確定如何處理不在API中顯示的內容,然後可能將其捐贈回社區。規格爲here。 Apache POI項目使用第一版模式。我發現第1部分,第3部分和第4部分是最有用的。

至於這個具體的問題,你得到你想要什麼doc.createTOC()?你有什麼?它位於文檔中的適當位置嗎?在這裏有關於TOC的其他問題。 This one尤其可能有所幫助。如果您需要額外的行爲,上面提到的規格包含更多的TOC字段開關,例如自定義標題樣式。 TOC級別的樣式可以通過修改適當的TOCx樣式來設置,其中x是TOC級別。

1

我甚至無法使用XWPFDocument.createTOC()(例如頁碼字段錯誤)獲得有價值的結果。所以我從來沒有使用過。我可以說的是,XWPFDocument.createTOC()目前不會像Word本身那樣創建「目錄」。因此,在Word中打開後,它將不會被識別爲Word GUI中的TOC。

但如果問題只是關於樣式,那麼可以回答。對於每個標題級別,必須存在名稱爲「toc 1」,「toc 2」,「toc 3」,...,「toc n」的樣式。這可以使用XML等來實現:

<w:style w:styleId="TOC1" w:type="paragraph"> 
<w:name w:val="toc 1"/> 
<w:basedOn w:val="Normal"/> 
<w:next w:val="Normal"/> 
<w:autoRedefine/><w:unhideWhenUsed/> 
<w:rPr> 
    <w:b/><w:bCs/><w:caps/><w:sz w:val="32"/><w:szCs w:val="32"/> 
</w:rPr> 
</w:style> 

最格式化的rPr (Run Properties)元素內完成的,它的孩子。

例子:

import java.io.File; 
import java.io.FileOutputStream; 

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

import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTNumbering; 
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTAbstractNum; 
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTStyles; 
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTStyle; 

import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTSimpleField; 
import org.openxmlformats.schemas.wordprocessingml.x2006.main.STOnOff; 

import java.math.BigInteger; 

public class CreateWordNumberedHeadings { 

static String cTAbstractNumDecimalXML = 
    "<w:abstractNum xmlns:w=\"http://schemas.openxmlformats.org/wordprocessingml/2006/main\" w:abstractNumId=\"0\">" 
+ "<w:multiLevelType w:val=\"hybridMultilevel\"/>" 
+ "<w:lvl w:ilvl=\"0\"><w:start w:val=\"1\"/><w:numFmt w:val=\"decimal\"/><w:lvlText w:val=\"%1\"/><w:lvlJc w:val=\"left\"/><w:pPr><w:ind w:left=\"360\" w:hanging=\"360\"/></w:pPr></w:lvl>" 
+ "<w:lvl w:ilvl=\"1\" w:tentative=\"1\"><w:start w:val=\"1\"/><w:numFmt w:val=\"decimal\"/><w:lvlText w:val=\"%1.%2\"/><w:lvlJc w:val=\"left\"/><w:pPr><w:ind w:left=\"720\" w:hanging=\"360\"/></w:pPr></w:lvl>" 
+ "<w:lvl w:ilvl=\"2\" w:tentative=\"1\"><w:start w:val=\"1\"/><w:numFmt w:val=\"decimal\"/><w:lvlText w:val=\"%1.%2.%3\"/><w:lvlJc w:val=\"left\"/><w:pPr><w:ind w:left=\"1440\" w:hanging=\"360\"/></w:pPr></w:lvl>" 
+ "</w:abstractNum>"; 

static String cTStyleNormal = 
    "<w:style xmlns:w=\"http://schemas.openxmlformats.org/wordprocessingml/2006/main\" w:type=\"paragraph\" w:default=\"1\" w:styleId=\"Normal\">" 
+ "<w:name w:val=\"Normal\"/>" 
+ "<w:qFormat/>" 
+ "</w:style>"; 
static String cTStyleH1XML = 
    "<w:style xmlns:w=\"http://schemas.openxmlformats.org/wordprocessingml/2006/main\" w:type=\"paragraph\" w:styleId=\"Heading1\">" 
+ "<w:name w:val=\"heading 1\"/>" 
+ "<w:basedOn w:val=\"Normal\"/>" 
+ "<w:next w:val=\"Normal\"/>" 
+ "<w:unhideWhenUsed/>" 
+ "<w:qFormat/>" 
+ "<w:rPr><w:b/><w:sz w:val=\"36\"/></w:rPr>" 
+ "</w:style>"; 
static String cTStyleH2XML = 
    "<w:style xmlns:w=\"http://schemas.openxmlformats.org/wordprocessingml/2006/main\" w:type=\"paragraph\" w:styleId=\"Heading2\">" 
+ "<w:name w:val=\"heading 2\"/>" 
+ "<w:basedOn w:val=\"Normal\"/>" 
+ "<w:next w:val=\"Normal\"/>" 
+ "<w:unhideWhenUsed/>" 
+ "<w:qFormat/>" 
+ "<w:rPr><w:sz w:val=\"32\"/></w:rPr>" 
+ "</w:style>"; 
static String cTStyleH3XML = 
    "<w:style xmlns:w=\"http://schemas.openxmlformats.org/wordprocessingml/2006/main\" w:type=\"paragraph\" w:styleId=\"Heading3\">" 
+ "<w:name w:val=\"heading 3\"/>" 
+ "<w:basedOn w:val=\"Normal\"/>" 
+ "<w:next w:val=\"Normal\"/>" 
+ "<w:unhideWhenUsed/>" 
+ "<w:qFormat/>" 
+ "<w:rPr><w:i/><w:sz w:val=\"28\"/></w:rPr>" 
+ "</w:style>"; 

static String cTStyleTOC1 = 
    "<w:style xmlns:w=\"http://schemas.openxmlformats.org/wordprocessingml/2006/main\" w:type=\"paragraph\" w:styleId=\"TOC1\">" 
+ "<w:name w:val=\"toc 1\"/>" 
+ "<w:basedOn w:val=\"Normal\"/>" 
+ "<w:next w:val=\"Normal\"/>" 
+ "<w:autoRedefine/><w:unhideWhenUsed/>" 
+ "<w:rPr><w:b/><w:bCs/><w:caps/><w:sz w:val=\"32\"/><w:szCs w:val=\"32\"/></w:rPr>" 
+ "</w:style>"; 

static String cTStyleTOC2 = 
    "<w:style xmlns:w=\"http://schemas.openxmlformats.org/wordprocessingml/2006/main\" w:type=\"paragraph\" w:styleId=\"TOC2\">" 
+ "<w:name w:val=\"toc 2\"/>" 
+ "<w:basedOn w:val=\"Normal\"/>" 
+ "<w:next w:val=\"Normal\"/>" 
+ "<w:autoRedefine/><w:unhideWhenUsed/>" 
+ "<w:rPr><w:i/><w:iCs/><w:sz w:val=\"28\"/><w:szCs w:val=\"28\"/></w:rPr>" 
+ "</w:style>"; 

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

    XWPFDocument document = new XWPFDocument();  

    XWPFNumbering numbering = document.createNumbering(); 
    CTNumbering cTNumbering = CTNumbering.Factory.parse(cTAbstractNumDecimalXML); 
    CTAbstractNum cTAbstractNum = cTNumbering.getAbstractNumArray(0); 
    XWPFAbstractNum abstractNum = new XWPFAbstractNum(cTAbstractNum); 

    BigInteger abstractNumID = numbering.addAbstractNum(abstractNum); 
    BigInteger numID = numbering.addNum(abstractNumID); 

    XWPFStyles styles = document.createStyles(); 
    CTStyles cTStyles = CTStyles.Factory.parse(cTStyleNormal); 
    CTStyle cTStyle = cTStyles.getStyleArray(0); 
    styles.addStyle(new XWPFStyle(cTStyle)); 
    cTStyles = CTStyles.Factory.parse(cTStyleH1XML); 
    cTStyle = cTStyles.getStyleArray(0); 
    styles.addStyle(new XWPFStyle(cTStyle)); 
    cTStyles = CTStyles.Factory.parse(cTStyleH2XML); 
    cTStyle = cTStyles.getStyleArray(0); 
    styles.addStyle(new XWPFStyle(cTStyle)); 
    cTStyles = CTStyles.Factory.parse(cTStyleH3XML); 
    cTStyle = cTStyles.getStyleArray(0); 
    styles.addStyle(new XWPFStyle(cTStyle)); 

    cTStyles = CTStyles.Factory.parse(cTStyleTOC1); 
    cTStyle = cTStyles.getStyleArray(0); 
    styles.addStyle(new XWPFStyle(cTStyle)); 
    cTStyles = CTStyles.Factory.parse(cTStyleTOC2); 
    cTStyle = cTStyles.getStyleArray(0); 
    styles.addStyle(new XWPFStyle(cTStyle)); 

    createParagraphs(document, numID, "First [email protected]@Second [email protected]@First [email protected]@Second [email protected]@Third [email protected]@Second [email protected]@Third [email protected]@Second [email protected]@First Level"); 

    XWPFParagraph paragraph = document.createParagraph(); 
    XWPFRun run=paragraph.createRun(); 
    run.setText("Table of contents:"); 

    paragraph = document.createParagraph(); 

    //document.createTOC(); 

    CTSimpleField toc = paragraph.getCTP().addNewFldSimple(); 
    toc.setInstr("TOC \\* MERGEFORMAT"); 
    toc.setDirty(STOnOff.TRUE); 

    FileOutputStream out = new FileOutputStream("CreateWordNumberedHeadings.docx"); 
    document.write(out); 

} 

public static void createParagraphs(XWPFDocument doc, BigInteger numID, String content) { 
    for (String value : content.split("@@")) { 
    XWPFParagraph para = doc.createParagraph(); 
    para.setVerticalAlignment(TextAlignment.CENTER); 
    para.setNumID(numID); 
    para.setStyle("Heading1"); 
    if (value.contains("Second")) { 
    para.getCTP().getPPr().getNumPr().addNewIlvl().setVal(BigInteger.valueOf(1)); 
    para.setStyle("Heading2"); 
    } 
    if(value.contains("Third")) { 
    para.getCTP().getPPr().getNumPr().addNewIlvl().setVal(BigInteger.valueOf(2)); 
    para.setStyle("Heading3"); 
    } 
    XWPFRun run = para.createRun(); 
    run.setText(value); 
    para = doc.createParagraph(); 
    run = para.createRun(); 
    run.setText("Lorem ipsum semit dolor ..."); 
    run.addBreak(BreakType.PAGE); 
    } 
} 
} 

注:我不使用XWPFDocument.createTOC()對於提到的原因。相反,我插入的字段必須在Word中打開文檔時進行刷新。這導致在打開時確認對話框,必須用Yes來回答。

+0

'document.createTOC(); XWPFParagraph paragraph = document.createParagraph(); CTSimpleField toc = paragraph.getCTP()。addNewFldSimple(); toc.setInstr(「TOC \\ * MERGEFORMAT」); toc.setDirty(STOnOff.TRUE); createParagraphs(document,numID,「... content ...」);' 非常感謝!你的答案是我想要的。您無法使用XWPFDocument.createTOC()獲得有價值的結果,因爲您在內容創建之後創建TOC,這會導致toc頁面號碼變得更大,因此書籤不會生成鏈接。如果您在內容之前創建了toc,那就沒問題了。如上所示的代碼。 – Sucy