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
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/office/ExtractTextFromDOCXs.aspx
How to: Manipulate Office Open XML Formats Documents:
http://msdn.microsoft.com/en-us/library/aa982683.aspx
Office Open XML C# Library:
http://officeopenxml.sourceforge.net/
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" <earthling-quitae...@poblacion.org>
escribió en el mensaje news:%23un3a3y...@TK2MSFTNGP06.phx.gbl...