Domanda

Sto creando un generatore docx con POI e vorrei utilizzare formati predefiniti.

Word include diversi formati come Titolo, Intestazione 1..10 ecc Questi formati sono predefinite in ogni DOCX creati con Word.

Vorrei usarli nel mio generatore docx. Ho provato quanto segue ma il formato non è stato applicato:

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

Ho provato anche "rubrica 1", "Titolo1" e "Titolo1" come lo stile, ma nessuno di loro ha funzionato.
Il documentazione API non mostra alcun dettaglio.

Ho analizzato un file docx creati con Word 2007 e ha scoperto "Titolo1" sarebbe corretto. Purtroppo, lo stile non è definito nel docx. Devo creare questo stile manualmente?

Qualcuno mi può puntare alla soluzione corretta?

È stato utile?

Soluzione

E 'molto semplice:. Utilizzare un file docx "modello"

  1. Crea un file docx vuoto con Word 2007.
  2. Utilizzare questo file come un modello per il XWPFDocument
  3. Aggiungi i paragrafi con gli stili.

Ecco il codice:

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

Il modello contiene tutti gli stili e quindi possono fa riferimento tramite setStyle("Heading1");.

Altri suggerimenti

È possibile creare un modello di Word (basta utilizzare il Salva con nome ... in Word).

prima opzione

Il modello ora contiene una serie di file XML aggiuntivi a \ parola cartella:  - styles.xml  - stylesWithEffects.xml  - webSettings.xml  - fontTable.xml e  - \ tema cartella

Se si copiano i file nel file originale PDI generato allora si può fare riferimento a stili contenute nel file styles.xml .

È possibile manipolare il file originale come un file ZIP, questo non dovrebbe essere a molto sforzo.

seconda opzione

stili Copiare in codice dal modello al documento:

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;

Il lato positivo è possibile manipolare gli stili separatamente direttamente utilizzando Word e salvandoli di nuovo al file di modello.

Se si sono generalmente interessati a creare uno stile che è riconosciuta come un titolo di livello 1 (ad esempio, per l'uso in un sommario MS Word generati) e si può accedere nella Parola formati bar, si può fare in questo modo:

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

}

Sì, questo stile verrà visualizzato nella styles.xml.

(lo so: Questa non è una risposta diretta alla tua domanda, ma come non ho trovato queste informazioni su internet in una forma utilizzabile, vi posterò qui)

Sì, si dovrebbe fare manualmente. Docx spec dice che styles.xml che contiene informazioni sugli stili è opzionale. Così, ho quasi sicuro che PDI non crea affatto se non lo fai esplicitamente. È possibile verificare: basta decomprimere file docx e lo sguardo se questo file è lì o no (yourfile.docx / parola / styles.xml).

Quindi, cosa si dovrebbe fare (in termini docx, non so come sia implementato in POI):

1) creare styles.xml e aggiungere stili necessari vi

2) creare relazioni che collega document.xml e styles.xml (credo POI dovrebbe farlo automaticamente)

3) utilizzare gli stili IDS document.xml all'interno per connect parte di testo in calcestruzzo (Run in termini docx), con stile concreto.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top