Combinar varios documentos .docx con Open XML

15/01/2009 - 16:29 por Pedro Hueso | Informe spam
Hola,

Tengo varios ficheros de Microsoft Word 2007 .docx creados.

Necesito hacer un programa en C# y OpenXML que combine o añada todos estos
documentos en un único fichero .DOCX.

Yo tengo por ejemplo. Doc1.docx, Doc2.docx, Doc3.docx, Doc4.docx, Doc5.docx,
etc y lo que quiero es combinarlos todos en un solo documento .docx,
MAIN.DOCX,
es decir: Main.docx = Doc1.docx + Doc2.docx + Doc3.docx + ...

Gracias

Un Saludo

Pedro

Preguntas similare

Leer las respuestas

#1 Alberto Poblacion
15/01/2009 - 17:25 | Informe spam
"Pedro Hueso" wrote in message
news:u%
Tengo varios ficheros de Microsoft Word 2007 .docx creados.

Necesito hacer un programa en C# y OpenXML que combine o añada todos estos
documentos en un único fichero .DOCX.

Yo tengo por ejemplo. Doc1.docx, Doc2.docx, Doc3.docx, Doc4.docx,
Doc5.docx, etc y lo que quiero es combinarlos todos en un solo documento
.docx, MAIN.DOCX,
es decir: Main.docx = Doc1.docx + Doc2.docx + Doc3.docx + ...



El docx es en realidad un .zip que contiene dentro varios archivos xml.
De hecho, puedes renombrarlo a .zip y extraer el contenido para comprobarlo.
Para combinar tus archivos docx, tendrás que saber cuáles de estos
archivos xml tienen las partes relevantes e irlos juntando, creando un nuevo
xml con toda la información. Para ello, necesitarás conocer la
especificación del docx, que Microsoft ha hecho pública.

Tienes aquí información sobre el Open XML Format SDK, que te permite usar
System.IO.Package:
http://msdn.microsoft.com/en-us/library/bb456487(office.14).aspx

Otros enlaces:

Artículo de CodeProject:
http://www.codeproject.com/KB/offic...DOCXs.aspx

How to: Manipulate Office Open XML Formats Documents:
http://msdn.microsoft.com/en-us/lib...82683.aspx

Office Open XML C# Library:
http://officeopenxml.sourceforge.net/
Respuesta Responder a este mensaje
#2 Pedro Hueso
16/01/2009 - 10:28 | Informe spam
Hola,

El documento en sí está en el fichero "\word\document.xml" del .docx que
como muy bien dice Alberto es un zip.

La historia es que ese document.xml está formado por párrafos (objetos
paragraph) y la única forma que he visto de añadir otro documento docx es
con el objeto AltChunk al final de todos los párrafos.

El resultado de esto es que:
- El fichero "\word\document.xml" tiene los X párrafos y al final
una línea más de tipo AltChunk con id (<w:altChunk r:id="")
- Se crea un fichero llamado afChunk2.docx en "\word\" que es una
copia del fichero añadido. Y el Id anterior es un link a este fichero.
Si se añaden más ficheros se llamarán afChunk3.docx,
afChunk4.docx, afChunk5.docx, ...

De esta forma se mantienen los estilos y los objetos incrustados (JPG, XLS,
) en el documento de Word añadido.

¿Pero hay alguna otra forma de hacer esto de forma más elegante?

Adjunto el código que añade al final de un documento a otro documento:

public static void UnirFicheros(string ficheroOrigen, string ficheroDestino)
{
using (WordprocessingDocument doc =
WordprocessingDocument.Open(ficheroDestino, true))
{
//Se coge el último párrafo o el último AltChunk del
documento
Paragraph paragraph = new Paragraph(); ;
AltChunk alternativeChunk = new AltChunk();
int numeroAltChunk =
doc.MainDocumentPart.Document.Descendants<AltChunk>().Count();
//Se comprueba si el documento a añadir se tiene que colocar
al final del último párrafo o del último AltChunk
if (numeroAltChunk == 0)
paragraph =
doc.MainDocumentPart.Document.Descendants<Paragraph>().Last();
else
alternativeChunk =
doc.MainDocumentPart.Document.Descendants<AltChunk>().Last();

//Añade un AlternativeFormatImportPart al MainDocumentPart
AlternativeFormatImportPart inDocPart =
doc.MainDocumentPart.AddAlternativeFormatImportPart(AlternativeFormatImportPartType.WordprocessingML);

//Abre el fichero en el que se va a insertar y se añade el
stream con el contenido en la parte
using (FileStream stream = new FileStream(ficheroOrigen,
FileMode.Open))
{
inDocPart.FeedData(stream);
}
//Crear un AltChunk - <w:altChunk>
AltChunk altChunk = new AltChunk();
altChunk.Id = doc.MainDocumentPart.GetIdOfPart(inDocPart);

//Insertar el tag altChunk después del párrafo o después del
último AltChunk
if (numeroAltChunk == 0)
paragraph.InsertAfterSelf(altChunk);
else
alternativeChunk.InsertAfterSelf(altChunk);

//Guardar el documento
doc.MainDocumentPart.Document.Save();
}
}

Un Saludo

Pedro



"Alberto Poblacion"
escribió en el mensaje news:%
"Pedro Hueso" wrote in message
news:u%
Tengo varios ficheros de Microsoft Word 2007 .docx creados.

Necesito hacer un programa en C# y OpenXML que combine o añada todos
estos documentos en un único fichero .DOCX.

Yo tengo por ejemplo. Doc1.docx, Doc2.docx, Doc3.docx, Doc4.docx,
Doc5.docx, etc y lo que quiero es combinarlos todos en un solo documento
.docx, MAIN.DOCX,
es decir: Main.docx = Doc1.docx + Doc2.docx + Doc3.docx + ...



El docx es en realidad un .zip que contiene dentro varios archivos xml.
De hecho, puedes renombrarlo a .zip y extraer el contenido para
comprobarlo.
Para combinar tus archivos docx, tendrás que saber cuáles de estos
archivos xml tienen las partes relevantes e irlos juntando, creando un
nuevo xml con toda la información. Para ello, necesitarás conocer la
especificación del docx, que Microsoft ha hecho pública.

Tienes aquí información sobre el Open XML Format SDK, que te permite
usar System.IO.Package:
http://msdn.microsoft.com/en-us/library/bb456487(office.14).aspx

Otros enlaces:

Artículo de CodeProject:
http://www.codeproject.com/KB/offic...DOCXs.aspx

How to: Manipulate Office Open XML Formats Documents:
http://msdn.microsoft.com/en-us/lib...82683.aspx

Office Open XML C# Library:
http://officeopenxml.sourceforge.net/


email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida