2008-12-30 37 views

Respuesta

2

Nunca lo he visto hecho, y trabajo mucho en Word. Si realmente desea programar algo en un documento de Word, entonces le aconsejo utilizar el lenguaje de programación de VBA de Microsoft, que está específicamente diseñado para este propósito. De hecho, estoy trabajando en eso ahora mismo.

Si está trabajando en Open Office, entonces tienen un conjunto muy similar de herramientas macro para hacer lo mismo.

5

Tenga una mirada en Apache POI

El proyecto POI es el proyecto principal para el desarrollo de los puertos de Java puro de archivo formatos basados ​​en OLE 2 de Microsoft Formato de Documento Compuesto. OLE 2 Formato de documento compuesto es utilizado por documentos de Microsoft Office, así como por programas que usan conjuntos de propiedades MFC a serializar sus objetos de documento.

0

Office Writer sería una mejor herramienta para usar que POI para su necesidad.

Si todo lo que quiere es una tabla simple sin demasiado formato, utilizaría este sencillo truco. Use Java para generar la tabla como HTML utilizando una tabla antigua simple, tr, etiquetas td y copie la tabla HTML procesada en el documento de Word;)

1

Office 2003 tiene un formato xml y el formato de documento predeterminado para office 2007 es xml (comprimido). Entonces podrías generar xml desde Java. Si abre un documento existente, no es demasiado difícil, vea el xml requerido.

Como alternativa, puede usar la API de OpenOffice para generar un documento y guardarlo como un documento de ms-word.

0

Nuestro conjunto de características es presionar un botón en nuestra aplicación web y obtener la página que está mirando hacia atrás como un documento de Word. Usamos el esquema docx para la descripción de los documentos y tenemos un montón de código Java en el lado del servidor que hace que la creación del documento y la respuesta a nuestro cliente web. El formato mismo se hace con algunas xsl-t compiladas desde Java para traducir desde nuestro propio nivel de persistencia XML.

El esquema de docx es bastante difícil de entender. La forma en que hicimos más progreso fue crear plantillas docx en Word con exactamente el formato que necesitábamos pero con contenido falso. Luego los engañamos con ellos hasta que entendimos exactamente qué estaba pasando. Hay una gran cantidad en el docx de la que realmente no necesita preocuparse. Al leer/traducir docx Word es bastante tolerante a un esquema de formato parcialmente completo. De hecho, optamos por eliminar casi todo el formato porque también significa que el formato predeterminado del usuario tiene prioridad, lo que parece preferir. También hace que el proceso xsl sea más rápido y el documento resultante más pequeño.

0

que gestionar el proyecto docx4j

docx4j contiene una clase TblFactory, que crea tablas normales (es decir, ninguna fila o columna abarca), con la configuración predeterminada que Word 2007 que crearía, y con las dimensiones especificadas por el usuario.

Si desea una tabla más compleja, el método más fácil es crearla en Word, luego copie el XML resultante en una cadena en su IDE, donde puede usar docx4j's XmlUtils.unmarshalString para crear un objeto Tbl a partir de él.

1

Este fragmento se puede usar para crear una tabla dinámicamente en un documento de MS Word.

WPFDocument document = new XWPFDocument(); 
XWPFTable tableTwo = document.createTable(); 
XWPFTableRow tableTwoRowOne = tableTwo.getRow(0); 
tableTwoRowOne.getCell(0).setText(Knode1); 
tableTwoRowOne.createCell().setText(tags.get("node1").toString()); 
for (int i = 1; i < nodeList.length; i++) { 
    String node = "node"; 
    String nodeVal = ""; 
    XWPFTableRow tr = null; 
    node = node + (i + 1); 
    nodeVal = tags.get(node).toString(); 
    if (tr == null) { 
     tr = tableTwo.createRow(); 
     tr.getCell(0).setText(nodeList[i]); 
     tr.getCell(1).setText(tags.get(node).toString()); 
    } 
} 
0

Usando mi pequeña utilidad de compresión, puede crear docx con facilidad, si sabe lo que está haciendo. El formato de archivo DOCX de Word es simplemente zip (carpetas con archivos xml). Al usar las utilidades de java zip, puede modificar el docx existente, solo la parte de contenido.

Para que la siguiente muestra funcione, simplemente abra Word, ingrese algunas líneas, guarde el documento. Luego, con el programa zip, elimine el archivo word/document.xml (este es el archivo donde reside el contenido principal del documento de Word) desde el archivo zip. Ahora tienes la plantilla preparada. Guardar zip modificado.

Esto es lo que la creación del nuevo archivo de Word Apariencia:

/* docx file head */ 
    final String DOCUMENT_XML_HEAD = 
      "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\" ?>" + 
      "<w:document xmlns:wpc=\"http://schemas.microsoft.com/office/word/2010/wordprocessingCanvas\" xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\" xmlns:o=\"urn:schemas-microsoft-com:office:office\" xmlns:r=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships\" xmlns:m=\"http://schemas.openxmlformats.org/officeDocument/2006/math\" xmlns:v=\"urn:schemas-microsoft-com:vml\" xmlns:wp14=\"http://schemas.microsoft.com/office/word/2010/wordprocessingDrawing\" xmlns:wp=\"http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawing\" xmlns:w10=\"urn:schemas-microsoft-com:office:word\" xmlns:w=\"http://schemas.openxmlformats.org/wordprocessingml/2006/main\" xmlns:w14=\"http://schemas.microsoft.com/office/word/2010/wordml\" xmlns:w15=\"http://schemas.microsoft.com/office/word/2012/wordml\" xmlns:wpg=\"http://schemas.microsoft.com/office/word/2010/wordprocessingGroup\" xmlns:wpi=\"http://schemas.microsoft.com/office/word/2010/wordprocessingInk\" xmlns:wne=\"http://schemas.microsoft.com/office/word/2006/wordml\" xmlns:wps=\"http://schemas.microsoft.com/office/word/2010/wordprocessingShape\" mc:Ignorable=\"w14 w15 wp14\">" + 
      "<w:body>"; 

    /* docx file foot */ 
    final String DOCUMENT_XML_FOOT = 
      "</w:body>" + 
      "</w:document>"; 


    final ZipOutputStream zos = new ZipOutputStream(new FileOutputStream("c:\\TEMP\\test.docx")); 

    final String fullDocumentXmlContent = DOCUMENT_XML_HEAD + "<w:p><w:r><w:t>Hey MS Word, hello from java.</w:t></w:r></w:p>" + DOCUMENT_XML_FOOT; 

    final si.gustinmi.DocxZipCreator creator = new si.gustinmi.DocxZipCreator(); 

    // create new docx file 
    creator.createDocxFromExistingDocx(zos, "c:\\TEMP\\existingDocx.docx", fullDocumentXmlContent); 

Estos son los servicios públicos postales:

package si.gustinmi; 

import java.io.*; 
import java.nio.charset.StandardCharsets; 
import java.util.logging.Logger; 
import java.util.zip.CRC32; 
import java.util.zip.ZipEntry; 
import java.util.zip.ZipInputStream; 
import java.util.zip.ZipOutputStream; 

/** 
* Creates new docx from existing one. 
* @author gustinmi [at] gmail [dot] com 
*/ 
public class DocxZipCreator { 

    public static final Logger log = Logger.getLogger(DocxZipCreator.class.getCanonicalName()); 

    private static final int BUFFER_SIZE = 4096; 


    /** OnTheFly zip creator. Traverses through existing docx zip and creates new one simultaneousl. 
    * On the end, custom document.xml is inserted inside 
    * @param zipFilePath location of existing docx template (without word/document.xml) 
    * @param documentXmlContent content of the word/document.xml 
    * @throws IOException 
    */ 
    public void createDocxFromExistingDocx(ZipOutputStream zos, String zipFilePath, String documentXmlContent) throws IOException { 

     final FileInputStream fis = new FileInputStream(zipFilePath); 
     final ZipInputStream zipIn = new ZipInputStream(fis); 

     try{ 
      log.info("Starting to create new docx zip"); 
      ZipEntry entry = zipIn.getNextEntry(); 
      while (entry != null) { // iterates over entries in the zip file 
       copyEntryfromZipToZip(zipIn, zos, entry.getName()); 
       zipIn.closeEntry(); 
       entry = zipIn.getNextEntry(); 
      } 

      // add document.xml to existing zip 
      addZipEntry(documentXmlContent, zos, "word/document.xml"); 

     }finally{ 
      zipIn.close(); 
      zos.close(); 
      log.info("End of docx creation"); 
     } 

    } 

    /** Copies sin gle entry from zip to zip */ 
    public void copyEntryfromZipToZip(ZipInputStream is, ZipOutputStream zos, String entryName) 
    { 
     final byte [] data = new byte[BUFFER_SIZE]; 
     int len; 
     int lenTotal = 0; 
     try { 

      final ZipEntry entry = new ZipEntry(entryName); 
      zos.putNextEntry(entry); 

      final CRC32 crc32 = new CRC32(); 
      while ((len = is.read(data)) > -1){ 
       zos.write(data, 0, len); 
       crc32.update(data, 0, len); 
       lenTotal += len; 
      } 

      entry.setSize(lenTotal); 
      entry.setTime(System.currentTimeMillis()); 
      entry.setCrc(crc32.getValue()); 

     } 
     catch (IOException ioe){ 
      ioe.printStackTrace(); 
     } 
     finally{ 
      try { zos.closeEntry();} catch (IOException e) {} 
     } 
    } 

    /** Create new zip entry with content 
    * @param content content of a new zip entry 
    * @param zos 
    * @param entryName name (npr: word/document.xml) 
    */ 
    public void addZipEntry(String content, ZipOutputStream zos, String entryName) 
    { 
     final byte [] data = new byte[BUFFER_SIZE]; 
     int len; 
     int lenTotal = 0; 
     try { 

      final InputStream is = new ByteArrayInputStream(content.getBytes(StandardCharsets.UTF_8)); 

      final ZipEntry entry = new ZipEntry(entryName); 
      zos.putNextEntry(entry); 

      final CRC32 crc32 = new CRC32(); 
      while ((len = is.read(data)) > -1){ 
       zos.write(data, 0, len); 
       crc32.update(data, 0, len); 
       lenTotal += len; 
      } 

      entry.setSize(lenTotal); 
      entry.setTime(System.currentTimeMillis()); 
      entry.setCrc(crc32.getValue()); 

     } 
     catch (IOException ioe){ 
      ioe.printStackTrace(); 
     } 
     finally{ 
      try { zos.closeEntry();} catch (IOException e) {} 
     } 
    } 

} 
+0

No funciona. El primer archivo que no se abre indica que está dañado y el segundo archivo está vacío. –

+0

Cómo se creó el archivo zip. Tiene que estar sin ninguna carpeta raíz, etc. La mejor manera en Windows es usar soporte de compresión TotalCMD. Orden propuesto: 1. Crear docx en MSWord. Abra zip en TotalCMD con CTRL + PgDown. Eliminar document.xml. Presiona la tecla de retroceso y confirma los cambios de zip. –

+0

Creo que estaba haciendo una tarea separada que se hizo usando esta respuesta http://stackoverflow.com/a/17835814/1459174 –

Cuestiones relacionadas