Frage

Ich bin ein docx-Generator mit POI erstellen und möchten vordefinierte Formate verwenden.

Word enthält mehrere Formate wie Titel, Überschrift 1..10 usw. Diese Formate in jedem DOCX vordefiniert sind Sie mit Word erstellen.

Ich möchte sie in meinem docx-Generator. Ich habe versucht, die folgenden aber das Format wurde nicht angewandt:

paragraph = document.createParagraph();
lastParagraph.setStyle("Heading1");

Ich habe auch versucht, „Überschrift 1“, „heading1“ und „Heading1“ als Stil, aber keiner von ihnen arbeitete.
Die API-Dokumentation zeigt keine Details.

Ich analysierte eine docx-Datei mit Word 2007 erstellt und fand heraus, „Heading1“ wäre richtig. Leider ist der Stil nicht in der docx definiert. Muss ich diese Art manuell erstellen?

Kann jemand Punkt mich auf die richtige Lösung?

War es hilfreich?

Lösung

Es ist sehr einfach. Verwenden Sie eine „Vorlage“ docx-Datei

  1. Erstellen Sie eine leere docx-Datei mit Word 2007.
  2. Verwenden Sie diese Datei als Vorlage für Ihre XWPFDocument
  3. Fügen Sie Ihre Absätze mit den Stilen.

Hier ist der Code:

XWPFDocument document = new XWPFDocument(new FileInputStream("template.docx");
paragraph = document.createParagraph();
paragraph.setStyle("Heading1");

Die Vorlage alle Arten enthält und daher können sie über setStyle("Heading1"); verwiesen wird.

Andere Tipps

Sie können ein Wort Vorlage erstellen (verwenden Sie nur das Speichern unter ... Funktion in Word).

erste Option

Die Vorlage enthält jetzt eine Reihe von zusätzlichen XML-Dateien in \ Wort Ordner:  - styles.xml  - stylesWithEffects.xml  - webSettings.xml  - fontTable.xml und ein  - \ Themenordner

Wenn Sie diese Dateien in Ihre ursprüngliche POI generierte Datei kopieren, dann können Sie Stile in der gegebenen Referenz styles.xml Datei.

Sie können Ihre ursprüngliche Datei wie eine ZIP-Datei manipulieren, dies nicht zu viel Aufwand sein sollte.

zweite Option

Kopieren Stile in Code von Vorlage zu Ihrem Dokument:

XWPFDocument template = new XWPFDocument(new FileInputStream(new File("Template.dotx")));       

XWPFDocument doc = new XWPFDocument();      
// let's copy styles from template to new doc
XWPFStyles newStyles = doc.createStyles();
newStyles.setStyles(template.getStyle());


XWPFParagraph para = doc.createParagraph();
para.setStyle("Heading1");

XWPFRun run = para.createRun();
run.setText("Heading 1");

return doc;

Auf der positiven Seite können Sie Ihre Stile manipulieren separat mit Word direkt und sie zurück in die Template-Datei zu speichern.

Wenn Sie in der Regel daran interessiert sind, einen Stil zu schaffen, die als Überschrift der Ebene 1 erkannt wird (zB für die Verwendung in einer MS Word-generated TOC) und kann in der Word-Format Leiste zugegriffen werden kann, kann es wie folgt geschehen:

private static File writeSimpleDocxFile(String content) throws IOException {
    XWPFDocument docxDocument = new XWPFDocument();

    String strStyleId = "ownstyle1";

    addCustomHeadingStyle(docxDocument, strStyleId, 1);

    XWPFParagraph paragraph = docxDocument.createParagraph();
    XWPFRun run = paragraph.createRun();
    run.setText(content);

    paragraph.setStyle(strStyleId);
}

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

    // lower number > style is more prominent in the formats bar
    ctStyle.setUiPriority(indentNumber);

    CTOnOff onoffnull = CTOnOff.Factory.newInstance();
    ctStyle.setUnhideWhenUsed(onoffnull);

    // style shows up in the formats bar
    ctStyle.setQFormat(onoffnull);

    // style defines a heading of the given level
    CTPPr ppr = CTPPr.Factory.newInstance();
    ppr.setOutlineLvl(indentNumber);
    ctStyle.setPPr(ppr);

    XWPFStyle style = new XWPFStyle(ctStyle);

    // is a null op if already defined
    XWPFStyles styles = docxDocument.createStyles();

    style.setType(STStyleType.PARAGRAPH);
    styles.addStyle(style);

}

Ja, dieser Stil in der styles.xml zeigen.

(Ich weiß: Das ist keine direkte Antwort auf Ihre Frage, aber da ich nicht diese Informationen über das Internet in einer brauchbaren Form gefunden habe, werde ich es hier posten)

Ja, Sie sollten es manuell tun. Docx Spezifikation sagt, dass styles.xml, die Informationen über Stile enthält optional. Also, ich fast sicher, dass POI nicht schaffen es überhaupt, wenn Sie es nicht explizit tun. Sie können es: Entpacken Sie einfach docx-Datei und sehen, ob diese Datei ist oder nicht (yourfile.docx / Wort / styles.xml).

Also, was Sie tun sollten (in docx Begriffe, ich weiß nicht, wie das in POI implementiert wird):

1) erstellen styles.xml und fügt notwendig Arten dort

2) schaffen Beziehung, die document.xml und styles.xml verbindet (ich glaube, POI es automatisch tun sollte)

3) Verwendung Arten ids innerhalb document.xml zu verbinden konkreten Textteil (Run in docx Begriffen) mit konkretem Stil.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top