Question

Je crée un générateur de docx avec POI et que vous souhaitez utiliser des formats prédéfinis.

Word inclut plusieurs formats comme le titre, titre 1..10 etc. Ces formats sont prédéfinis dans tous les DOCX vous créez avec Word.

Je voudrais les utiliser dans mon générateur docx. J'ai essayé ce qui suit, mais le format n'a pas été appliqué:

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

J'ai aussi essayé « rubrique 1 », « heading1 » et « Heading1 » comme style, mais aucun d'entre eux a travaillé.
Le ne montre aucun détail.

J'analysé un fichier .docx créé avec Word 2007 et a découvert « Heading1 » serait correct. Malheureusement, le style est pas défini dans le docx. Dois-je créer ce style manuellement?

point Quelqu'un peut-il me la bonne solution?

Était-ce utile?

La solution

Il est très simple:. Utilisez un fichier .docx "template"

  1. Créer un fichier .docx vide avec Word 2007.
  2. Utilisez ce fichier comme modèle pour votre XWPFDocument
  3. Ajoutez vos paragraphes avec les styles.

Voici le code:

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

Le modèle contient tous les styles et donc ils peuvent référencé via setStyle("Heading1");.

Autres conseils

Vous pouvez créer un modèle de mot (il suffit d'utiliser la fonction Enregistrer sous ... dans Word).

première option

Le modèle contient maintenant un certain nombre de fichiers XML supplémentaires dans \ word dossier :  - styles.xml  - stylesWithEffects.xml  - webSettings.xml  - fontTable.xml et  - \ theme dossier

Si vous copiez les fichiers dans votre fichier généré POI d'origine, alors vous pouvez faire référence à des styles données dans le fichier styles.xml .

Vous pouvez manipuler votre fichier d'origine comme un fichier ZIP, cela ne devrait pas être de beaucoup d'efforts.

seconde option

Les styles de copie dans le code de modèle à votre document:

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;

Sur le côté positif, vous pouvez manipuler séparément à l'aide directement vos styles Word et les enregistrer dans le fichier de modèle.

Si vous êtes généralement intéressé par la création d'un style qui est reconnu comme un titre de niveau 1 (par exemple, pour une utilisation dans une table des matières générée par MS Word) et peut être consulté dans la barre de la Parole, il peut être fait comme ceci:

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

}

Oui, ce style sera affiché dans le styles.xml.

(je sais: Ce n'est pas une réponse directe à votre question, mais je ne trouve pas cette information sur l'Internet sous une forme utilisable, je vais le poster ici)

Oui, vous devez le faire manuellement. spec docx dit que styles.xml qui contient des informations sur les styles est facultatif. Donc, je suis presque sûr que POI ne crée pas du tout si vous ne le faites pas explicitement. Vous pouvez le vérifier: il suffit Décompressez le fichier docx et si ce fichier regard est là ou non (yourfile.docx / mot / styles.xml).

Alors, ce que vous devez faire (en termes de docx, je ne sais pas comment cela est implémenté dans le POI):

1) créer styles.xml et ajouter des styles nécessaires il y a

2) Créer une relation qui relie document.xml et styles.xml (je pense que POI devrait le faire automatiquement)

3) à l'intérieur document.xml pour connecter une partie de texte concret de styles d'utilisation (Exécuter en termes docx) avec un style de béton.

scroll top