Quiero crear una tabla en un archivo de Microsoft Office Word utilizando Java. ¿Alguien puede decirme cómo hacerlo con un ejemplo?Crear tablas en un archivo de MS Word usando Java
Respuesta
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.
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.
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;)
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.
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.
Haga clic aquí para obtener un Working example with source code. Este ejemplo genera documentos de MS-Word de Java, basados en un concepto de plantilla.
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.
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());
}
}
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) {}
}
}
}
No funciona. El primer archivo que no se abre indica que está dañado y el segundo archivo está vacío. –
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. –
Creo que estaba haciendo una tarea separada que se hizo usando esta respuesta http://stackoverflow.com/a/17835814/1459174 –
- 1. Lectura/escritura de un archivo de MS Word en PHP
- 2. Identificar encabezado en un documento de ms word usando C#
- 3. Retire MS Word "HTML" usando PHP
- 4. Convierta Word Document a PDF usando Java
- 5. Resaltado de sintaxis en MS Word
- 6. Crear auto numeración en imágenes/figuras en MS Word
- 7. apoyo MS Word en IOS
- 8. Desarrollo de complemento MS Word
- 9. extracción de datos de MS Word
- 10. Crear archivo PDF/Word (doc) dentro de la aplicación
- 11. Pegar desde MS Word en Textarea
- 12. Con Java: reemplace la cadena en el archivo de MS Word
- 13. Recuperar lista de tablas en el archivo MS Access
- 14. MS Word document file generate index
- 15. ¿Abrir un archivo de Word protegido con contraseña en Java?
- 16. Ejecutar código vba externo en MS Word
- 17. Intercambio de tablas ms-sql
- 18. Imprimir un documento OOXML sin MS Word instalado
- 19. ¿Cómo asegurar que un archivo cargado es un documento de MS Word?
- 20. Lectura/escritura de archivos de MS Word en Python
- 21. Imprimir todos los caracteres de una fuente en MS Word
- 22. Cómo crear un archivo de bordado .dst usando Java
- 23. Obtener PID de MS-Word ApplicationClass?
- 24. tinyMCE Eliminación de etiquetas MS Word
- 25. Macro para exportar tablas de MS Word a hojas de Excel
- 26. Desencadenar MS Word macro después del evento de guardar
- 27. Resaltado de sintaxis en el documento de MS Word
- 28. ¿Admite MS-SQL las tablas en memoria?
- 29. Lograr la calidad de impresión de MS Word en C#
- 30. Extrayendo tablas de un documento DOCX Word en python
¿Por qué es esta comunidad wiki? Esto parece más una pregunta "regular". – eljenso