2010-04-15 19 views
12

Estoy creando un generador de docx con POI y me gustaría usar formatos predefinidos.¿Cómo puedo usar formatos predefinidos en DOCX con POI?

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

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

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

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

Analicé un archivo docx creado con Word 2007 y descubrí que "Encabezado1" sería correcto. Desafortunadamente, el estilo no está definido en el docx. ¿Tengo que crear este estilo manualmente?

¿Alguien me puede indicar la solución correcta?

Respuesta

16

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

  1. Crear un archivo docx vacío con Word 2007.
  2. Usar este archivo como plantilla para sus 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");.

+1

¡esto funciona genial! Pero hay una advertencia ... Parece que Word descarta los estilos no utilizados del documento de la plantilla. Necesitarás tener texto existente en el documento usando esos Estilos, o usar una plantilla de alguna manera ... –

+0

Gracias, funcionó @guerda – MaheshVarma

+0

@exabrial Tienes razón, a menos que agreguemos estilos en la plantilla, no obteniendo estilos. Gracias. Me ayudó mucho y ahorró un montón de tiempo – MaheshVarma

2

Sí, debe hacerlo manualmente. La especificación Docx dice que styles.xml que contiene información sobre estilos es opcional. Entonces, estoy casi seguro de que el POI no lo crea en absoluto si no lo haces explícitamente. Puede verificarlo: simplemente descomprima el archivo docx y compruebe si este archivo está allí o no (yourfile.docx/word/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 relaciones que conecta document.xml y styles.xml (creo que POI debería hacerlo automáticamente)

3) use ids de estilos dentro de document.xml para conectar partes concretas de texto (Ejecutar en términos docx) con estilo concreto.

+0

Gracias por su respuesta! Su solución sería un gran esfuerzo para reproducir manualmente los estilos. – guerda

7

Puede crear una plantilla de palabra (solo use la funció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 - carpeta \ tema

Si copia los archivos en su PDI originales generados presenta a continuación, puede hacer referencia a estilos que figuran en el archivo styles.xml.

Puede manipular su archivo original como un archivo ZIP, esto no debería ser demasiado 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.

8

Si generalmente está interesado en crear un estilo reconocido como un título de nivel 1 (por ejemplo, para usar en un TOC generado por MS Word) y se puede acceder en la barra de formatos de Word, 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 styles.xml.

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

+0

¿Cómo puedo establecer una fuente en este estilo personalizado? – RobAu

+0

Si bien actualmente no puedo buscar esto en el software, realicé una búsqueda rápida. Los javadocs POI no tienen referencia al estilo CT, por desgracia (https://poi.apache.org/apidocs/org/apache/poi/xwpf/usermodel/XWPFDocument.html), pero el sitio web abierto de la oficina tiene algunos indicadores: https: //wiki.openoffice.org/wiki/Cell_Style_in_Xls_module – RobertG

+0

Parece que puede establecer fuentes en XWPFStyles: https://poi.apache.org/apidocs/org/apache/poi/xwpf/usermodel/XWPFStyles.html#setDefaultFonts (org.openxmlformats.schemas.wordprocessingml.x2006.main.CTfonts) – RobertG

Cuestiones relacionadas