Gerar um documento Word (docx) usando dados de um ficheiro XML / Converter XML para um documento Word baseado num modelo

Tenho um ficheiro XML com os dados que preciso de preencher num documento Word.

Preciso de encontrar uma forma de definir um modelo que possa ser usado como uma linha de base para preencher dados de um ficheiro XML e criar um documento de saída.

Acho que há duas maneiras de fazer isto.

  1. crie um ficheiro XSLT que será o "modelo" e use isto para gerar documentos Word usando-o em conjunto com o ficheiro XML.
  2. Use os controlos de conteúdo no Word para criar um modelo de documento e de alguma forma mapear para um arquivo XML.
Só não sei os detalhes de como implementar de qualquer maneira. Ou não sei se há outra maneira mais fácil de realizar esta tarefa.

Alguém poderia mostrar um exemplo de como isso pode ser implementado. Basta um simples exemplo.

Prefiro C# para qualquer código. Eu estou usando o Word 2016, mas quero que seja compatível a partir do Word 2007 ao Word 2016 e tudo no meio, se possível, uma vez que os usuários estarão usando versao. Obrigada!

Author: slayernoah, 2018-05-01

2 answers

Descobriu como usar os controlos de conteúdo para gerar documentos e como preencher dados de um XML para os controlos de conteúdo. Dividi isto em duas partes:

  • Parte 1: Crie o seu documento modelo para a geração de documentos
  • Parte 2: Usar o código em C# para gerar documentos com base no modelo

Parte 1: Crie o seu documento modelo para a geração de documentos

  1. crie uma amostra XML com base na qual você pode criar a palavra modelo para a geração de documentos. De preferência, comece com uma versão menos complicada para pegar o jeito.

Usei o seguinte XML para testar. Para testes eu não tinha seções repetitivas, fotos etc.

<?xml version="1.0" encoding="utf-8"?>
<mydata xmlns="http://CustomDemoXML.htm">
    <field1>This is the value in field1 from the XML file</field1>
    <field2>This is the value in field2 from the XML file</field2>
    <field3>This is the value in field3 from the XML file</field3>
</mydata>

Nota 1 : isto será apenas um exemplo XML para criar o seu modelo de palavra. Os ficheiros XML com dados reais neste mesmo formato podem ser aplicados mais tarde ao gerar documentos Word a partir do modelo.

Nota 2 : xmlns atributo pode conter literalmente qualquer coisa que você quiser e não tem que ser um URL começando com http.

Salve o seu ficheiro XML de exemplo para qualquer local, para que possa ser importado para o modelo que está prestes a criar.

  1. Certifique-se que a Página Developer está activa na sua cópia do Word [File -> Options -> Customize Ribbon -> em Customize the Ribbon, Certifique-se que Developer está seleccionado - > OK]. Detalhes: como: mostrar a Página de desenvolvimento na fita

  2. Criar um novo Documento Word (ou usar um documento Word existente) que será o seu modelo para a geração de documentos.

  3. Na página Developer, Carregue em XML Mapping Pane. Isto irá abrir o XML Mapping Pane no lado direito do documento.

  4. Na área de mapeamento de XML, seleccione a lista Custom XML Part - > seleccione (Add new part).

  5. Seleccione o ficheiro XML que gravou no Passo 1 - > Open.

  6. Na área de mapeamento de XML, seleccione a lista Custom XML Part - > Seleccione o item com o texto que estava no atributo xmlns do ficheiro XML personalizado. Se você usar o arquivo de exemplo acima, seria http://CustomDemoXML.htm.

  7. Adicione um texto estático a um documento Word e adicione um Plain Text Content Control ao lado dele (na secção Developer - > Controls. Repita para todos os campos que você precisa adicionar.

Para a amostra XML acima, eu tinha o seguinte documento Word:

sample word document template

  1. carregue no primeiro Plain Text Content Control - > na área de mapeamento XML, carregue com o botão direito no campo que deseja mapear para esse controlo de conteúdo - > Carregue em Map to Selected Content Control. Repita para todos os campos que deseja mapear.

Nota: em alternativa, em vez de adicionar os itens Plain Text Content Control da página de desenvolvimento no Passo #8, poderá carregar com o botão direito no campo que deseja mapear na área de mapeamento de XML -> Carregue em Insert Content Control -> Carregue em Plain Text.

Da mesma forma, você também pode adicionar outros tipos de controlos, tais como caixas de cheques, picadores de datas e até mesmo secções de repetição (suporta a repetição aninhada secções também! - desde o Word 2013) e mapear dados de XML para aqueles que usam apenas funcionalidade de palavra nativa e sem quaisquer ferramentas de terceiros!

  1. Salve o seu documento modelo.

Parte 2: Usar o código em C# para gerar documentos com base no modelo

Isto usa o recomendado pela Microsoft OpenXML SDK para gerar documentos usando um ficheiro XML que contém dados reais.

  1. Compilar o seu ficheiro XML/abrir um ficheiro XML existente com o qual gerar um documento a partir do modelo criado acima. Isto precisa estar no mesmo formato que o arquivo XML exemplo usado para criar o modelo.

  2. Use o SDK do OpenXML para remover quaisquer elementos CustomXMLPart do documento. Isto assume que não são usadas outras partes personalizadas de XML no documento que é o caso neste exemplo. Para cenários complexos, você pode excluir partes XML específicas, se necessário.

  3. Use o SDK do OpenXML para adicionar um novo CustomXMLPart baseado no ficheiro XML no Passo#1 acima.

Aqui está o código da amostra que tenho de "actualizar" / "recarregar" os dados da amostra no modelo com dados de um ficheiro XML que contém dados reais (assumindo que o ficheiro XML usado para gerar o documento já está criado e gravado):

using System.IO;
using DocumentFormat.OpenXml.Packaging;

namespace SampleNamespace
{
    public static class SampleClass
    {
        public static void GenerateDocument()
        {
            string rootPath = @"C:\Temp";
            string xmlDataFile = rootPath + @"\MyNewData.xml";
            string templateDocument = rootPath + @"\MyTemplate.docx";
            string outputDocument = rootPath + @"\MyGeneratedDocument.docx";

            using (WordprocessingDocument wordDoc = WordprocessingDocument.Open(templateDocument, true))
            {
                //get the main part of the document which contains CustomXMLParts
                MainDocumentPart mainPart = wordDoc.MainDocumentPart;

                //delete all CustomXMLParts in the document. If needed only specific CustomXMLParts can be deleted using the CustomXmlParts IEnumerable
                mainPart.DeleteParts<CustomXmlPart>(mainPart.CustomXmlParts);

                //add new CustomXMLPart with data from new XML file
                CustomXmlPart myXmlPart = mainPart.AddCustomXmlPart(CustomXmlPartType.CustomXml);
                using (FileStream stream = new FileStream(xmlDataFile, FileMode.Open))
                {
                    myXmlPart.FeedData(stream);
                }
            }

        }
    }
}
É isso!
 1
Author: slayernoah, 2018-05-21 17:53:53

Ok, encontrei um guia detalhado sobre a utilização do XSLT como um modelo para gerar o documento Word aqui: Usando o XSLT e abrir o XML para criar um documento do Word 2007 .

Parece que mesmo que este artigo seja para o Word 2007, funciona perfeitamente no Word 2016.

O único problema com este método é se as alterações são necessárias para o modelo mais tarde, é preciso muito esforço para atualizar o arquivo xslt e não é fácil de usar para fazê-lo, uma vez que ele não pode ser atualizado na própria palavra e o real O XML do documento precisa ser manipulado.

Do lado positivo, a geração de documentos é muito flexível com toda a energia disponível através de XSL(foreach, variáveis, se condições etc.)

 0
Author: slayernoah, 2018-05-01 15:24:16