Pregunta

Estoy creando un generador docx con PDI y me gustaría utilizar formatos predefinidos.

Word incluye varios formatos como Título, Encabezado 1..10 etc. Estos formatos están predefinidos en cada DOCX se crea con Word.

Me gustaría usarlos en mi generador docx. He intentado lo siguiente pero el formato no se aplicó:

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

También intentó "título 1", "encabezado1" y "Heading1" como el estilo, pero ninguno de ellos funcionó.
El documentación de la API no muestra ningún detalle.

analizó un archivo docx creados con Word 2007 y descubrió "Heading1" sería correcta. Por desgracia, el estilo no está definido en el docx. ¿Tengo que crear manualmente este estilo?

me puede punto cualquiera a la solución correcta?

¿Fue útil?

Solución

Es muy simple:. Usar un archivo docx "plantilla"

  1. Crear un archivo docx vacío con Word 2007.
  2. Usar este archivo como una plantilla para su XWPFDocument
  3. Añadir sus párrafos con los estilos.

Aquí está el código:

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

La plantilla contiene todos los estilos y por lo tanto puede que se hace referencia mediante setStyle("Heading1");.

Otros consejos

Puede crear una plantilla de Word (sólo tiene que utilizar la opción Guardar como ... en Word).

primera opción

La plantilla contiene ahora una serie de archivos XML adicionales en \ palabra carpeta:  - styles.xml  - stylesWithEffects.xml  - webSettings.xml  - fontTable.xml y una  - \ tema de carpeta

Si copia los archivos en el archivo generado PDI original, entonces se puede hacer referencia a estilos dadas en el archivo styles.xml .

Puede manipular el archivo original como un archivo ZIP, esto no debería ser a mucho esfuerzo.

segunda opción

Copiar estilos en el código de la plantilla a su 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;

En el lado positivo se puede manipular sus estilos separado directamente a través de la Palabra y el ahorro de nuevo al archivo de plantilla.

Si está interesado en general, en la creación de un estilo que se reconoce como un encabezado de nivel 1 (por ejemplo, para su uso en una tabla de contenido generado por MS Word) y se puede acceder en la barra de la Palabra formatos, se puede hacer así:

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í, este estilo se mostrará en el styles.xml.

(sé: Esta no es una respuesta directa a su pregunta, pero como no he encontrado esta información en Internet en una forma utilizable, voy a publicar aquí)

Sí, usted debe hacerlo de forma manual. Docx especificación dice que styles.xml que contiene información acerca de los estilos es opcional. Por lo tanto, casi seguro que la PDI no crea en absoluto si no lo hace explícitamente. Se puede comprobar que: simplemente docx descomprimir y mirar si este archivo existe o no (yourfile.docx / palabra / styles.xml).

Por lo tanto, lo que debe hacer (en términos docx, no sé cómo se implementa en POI):

1) crear y añadir styles.xml estilos necesarias allí

2) crear la relación que une document.xml y styles.xml (creo POI debe hacerlo de forma automática)

3) estilos utilizan números de identificación document.xml el interior de la parte de texto concreto de conexión (Run en términos docx) con un estilo concreto.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top