2017-04-11 12 views
0

I doc.createTOC(); verwenden, um Inhaltsverzeichnis in Poi-Wort (XWPF) zu generieren, und addCustomHeadingStyle(doc, ChapterLvl.LVL_1.style, 1); zu verwenden, um Überschriften Inhalt, gepunktete Linie und Seitenzahl zu generieren. Aber ich möchte die Überschriften der verschiedenen Überschriftenebenen einstellen. Inhalt habe unterschiedliche Schriftgröße, Schriftfarbe, Fettschrift, und punktierte Linie und Seitenzahl haben den gleichen Stil mit dem entsprechenden Überschrifteninhalt, wie der Bildanhang, kann mir jemand einen Rat geben, wie man das macht ?Wie setze ich den Schriftstil des Inhaltsverzeichnisses, einschließlich Schriftfarbe, Schriftgröße und Fettdruck in poi word?

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

Antwort

0

Viele Ihrer Fragen scheinen über XWPF zu sein. Dies ist eine unvollständige API. Sie können die Spezifikation lesen, um zu ermitteln, wie Dinge durchgeführt werden, die nicht in der API enthalten sind, und diese dann möglicherweise an die Community zurückgeben. Die technischen Daten sind here. Das Apache POI-Projekt verwendet das erste Editionsschema. Ich finde, dass die Teile 1, 3 und 4 am nützlichsten sind.

Zu dieser spezifischen Frage, bekommen Sie, was Sie wollen mit doc.createTOC()? Was bekommst du? Befindet es sich an der entsprechenden Stelle im Dokument? Es gibt andere Fragen bezüglich TOC hier auf SO. Insbesondere This one kann helfen. Wenn Sie zusätzliche Verhaltensweisen benötigen, enthalten die oben genannten Spezifikationen mehr Optionen für das Inhaltsverzeichnisfeld, z. B. benutzerdefinierte Headerstile. Der Stil der TOC-Ebenen kann durch Ändern des entsprechenden TOCx-Stils festgelegt werden, wobei x die TOC-Ebene ist.

1

Ich kann sogar keine wertvollen Ergebnisse mit XWPFDocument.createTOC() (Felder für Seitenzahlen sind falsch zum Beispiel). Also habe ich das nie benutzt. Was ich sagen kann ist, dass XWPFDocument.createTOC() derzeit kein "Table of Contents" wie Word selbst erstellt. Nach dem Öffnen in Word wird es nicht als TOC von Word GUI erkannt.

Aber wenn die Frage nur über die Stile ist, dann kann das beantwortet werden. Es müssen Styles namens "toc 1", "toc 2", "toc 3", ..., "toc n" für jede Überschriftsebene vorhanden sein. Dies kann mit XML wie erreicht werden:

<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> 

Die Formatierung erfolgt im rPr (Run Properties) Element und es ist Kinder.

Beispiel:

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); 
    } 
} 
} 

Hinweis: Ich benutze keine XWPFDocument.createTOC() für genannte Gründe. Stattdessen füge ich ein Feld ein, das beim Öffnen des Dokuments in Word aktualisiert werden muss. Dies führt beim Öffnen zu einem Bestätigungsdialog, der mit Yes beantwortet werden muss.

+0

'document.createTOC(); XWPFparagraph Absatz = document.createParagraph(); CTSimpleField toc = paragraph.getCTP(). AddNewFldSimple(); toc.setInstr ("TOC \\ * MERGEFORMAT"); toc.setDirty (STOnOff.TRUE); createParagraphs (Dokument, numID, "... Inhalt ..."); ' Vielen Dank! Deine Antwort ist was ich will. Mit XWPFDocument.createTOC() können Sie keine wertvollen Ergebnisse erzielen, da Sie TOC nach Ihrem Inhalt erstellen. Dies kann dazu führen, dass die Seitenzahl der tatsächlichen Seite größer wird, sodass das Lesezeichen keine Links generiert. Wenn Sie toc vor Inhalt erstellen, der in Ordnung ist. Als Code oben gezeigt. – Sucy

Verwandte Themen