Substituir a parte do tema em um documento de processamento de texto

Este tópico mostra como usar as classes no Open XML SDK for Office para substituir programaticamente uma parte do documento em um documento de processamento de texto.

Pacotes e partes do documento

Um documento Open XML é armazenado como um pacote, cujo formato é definido pela ISO/IEC 29500. O pacote pode ter várias partes com relações entre elas. A relação entre as partes controla a categoria do documento. Um documento pode ser definido como um documento de processamento de texto caso seu item de relação do pacote contiver uma relação com uma parte do documento principal. Caso seu item de relação do pacote contenha uma relação com uma parte da apresentação, ela poderá ser definida como um documento de apresentação. Caso seu item de relação do pacote contenha uma relação com uma parte da pasta de trabalho, ela é definida como um documento de planilha. Neste tópico de tutorial, você usará um pacote de documentos de processamento de texto.

Como obter um objeto WordprocessingDocument

No código de exemplo, você começa abrindo o arquivo de processamento de texto instanciando a WordprocessingDocument classe, conforme mostrado na instrução a seguir using . Na mesma instrução, você abre o documento de arquivo de processamento de texto usando o Open método, com o parâmetro booleano definido como true para habilitar a edição do documento.

using (WordprocessingDocument wordDoc = WordprocessingDocument.Open(document, true))

Com v3.0.0+, o Close() método foi removido em favor de confiar na instrução using. Ele garante que o Dispose() método seja chamado automaticamente quando a chave de fechamento for atingida. O bloco que segue a instrução using estabelece um escopo para o objeto que é criado ou nomeado na instrução using. Como a WordprocessingDocument classe no Open XML SDK salva e fecha automaticamente o objeto como parte de sua IDisposable implementação e porque Dispose() é chamada automaticamente quando você sai do bloco, você não precisa chamar Save() explicitamente ou Dispose() desde que use uma using instrução.

Como alterar o tema em um pacote do Word

Se você quiser alterar o tema em um documento do Word, clique no Design da faixa de opções e em Temas. O menu suspenso Temas é aberto. Para escolher um dos temas internos e aplicá-lo ao documento do Word, clique no ícone do tema. Você também pode usar a opção Procurar temas... para localizar e aplicar um arquivo de tema em seu computador.

A estrutura do elemento de tema

O elemento de tema é constituído por esquemas de cores, fontes e formatos. Neste tutorial, você aprenderá como alterar o tema programaticamente. Portanto, é útil familiarizar-se com o elemento tema. As seguintes informações da especificação ISO/IEC 29500 podem ser úteis ao trabalhar com este elemento.

Esse elemento define o tipo complexo de nível raiz associado a uma folha de estilo compartilhada (ou tema). Esse elemento contém todas as diferentes opções de formatação disponíveis para um documento por meio de um tema e define a aparência geral do documento quando objetos temáticos são usados dentro do documento.

[Exemplo: considere a imagem a seguir como um exemplo de diferentes temas em uso aplicados a uma apresentação. Neste exemplo, você pode ver como um tema pode afetar a fonte, as cores, os planos de fundo, os preenchimentos e os efeitos de diferentes objetos em uma apresentação. exemplo de término]

Theme sample

Neste exemplo, vemos como um tema pode afetar a fonte, as cores, os planos de fundo, os preenchimentos e os efeitos de diferentes objetos em uma apresentação. exemplo de término]

© ISO/IEC 29500: 2016

A tabela a seguir lista os possíveis tipos filho da classe Theme.

Elemento PresentationML Classe Open XML SDK Descrição
<custClrLst/> CustomColorList Lista de Cores Personalizadas
<extLst/> ExtensionList Lista de extensões
<extraClrSchemeLst/> ExtraColorSchemeList Lista de esquemas de cores extras
<objectDefaults/> ObjectDefaults Padrões do objeto
<themeElements/> ThemeElements Elementos do tema

O fragmento do esquema XML a seguir define as quatro partes do elemento de tema. O themeElements elemento é a peça que contém a formatação principal definida dentro do tema. As outras partes fornecem substituições, padrões e adições às informações contidas no themeElements. O tipo complexo que define um tema, CT_OfficeStyleSheet, é definido da seguinte maneira:

    <complexType name="CT_OfficeStyleSheet">
       <sequence>
           <element name="themeElements" type="CT_BaseStyles" minOccurs="1" maxOccurs="1"/>
           <element name="objectDefaults" type="CT_ObjectStyleDefaults" minOccurs="0" maxOccurs="1"/>
           <element name="extraClrSchemeLst" type="CT_ColorSchemeList" minOccurs="0" maxOccurs="1"/>
           <element name="custClrLst" type="CT_CustomColorList" minOccurs="0" maxOccurs="1"/>
           <element name="extLst" type="CT_OfficeArtExtensionList" minOccurs="0" maxOccurs="1"/>
       </sequence>
       <attribute name="name" type="xsd:string" use="optional" default=""/>
    </complexType>

Esse tipo complexo também contém um CT_OfficeArtExtensionList, que é usado para extensibilidade futura desse tipo complexo.

Como funciona o código de exemplo

Depois de abrir o arquivo, você pode instanciar o MainDocumentPartwordDoc no objeto e excluir a parte antiga do tema.

using (WordprocessingDocument wordDoc = WordprocessingDocument.Open(document, true))
{
    if (wordDoc?.MainDocumentPart?.ThemePart is null)
    {
        throw new ArgumentNullException("MainDocumentPart and/or Body and/or ThemePart is null.");
    }

    MainDocumentPart mainPart = wordDoc.MainDocumentPart;

    // Delete the old document part.
    mainPart.DeletePart(mainPart.ThemePart);

Em seguida, você pode criar, adicionar um novo ThemePart objeto e adicioná-lo ao MainDocumentPart objeto. Em seguida, adicione conteúdo usando objetos e StreamReaderStreamWriter para copiar o tema do themeFile para o ThemePart objeto.

// Add a new document part and then add content.
ThemePart themePart = mainPart.AddNewPart<ThemePart>();

using (StreamReader streamReader = new StreamReader(themeFile))
using (StreamWriter streamWriter = new StreamWriter(themePart.GetStream(FileMode.Create)))
{
    streamWriter.Write(streamReader.ReadToEnd());
}

Código de exemplo

O exemplo de código a seguir mostra como substituir a parte do documento de tema em um documento de processamento de texto pela parte de tema de outro pacote. O arquivo de tema passado como segundo argumento deve ser uma parte de tema válida no formato XML (por exemplo, Theme1.xml). Você pode extrair essa parte de um documento ou arquivo de tema existente (. THMX) que foi renomeado para ser um arquivo .Zip. Para chamar o método ReplaceTheme , você pode usar o exemplo de chamada a seguir para copiar o tema do arquivo de arg[1] e para o arquivo localizado em arg[0]

string document = args[0];
string themeFile = args[1];

ReplaceTheme(document, themeFile);

Depois de executar o programa, abra o arquivo do Word e observe as novas mudanças de tema.

A seguir está o código de exemplo completo em C# e em Visual Basic.

// This method can be used to replace the theme part in a package.
static void ReplaceTheme(string document, string themeFile)
{
    using (WordprocessingDocument wordDoc = WordprocessingDocument.Open(document, true))
    {
        if (wordDoc?.MainDocumentPart?.ThemePart is null)
        {
            throw new ArgumentNullException("MainDocumentPart and/or Body and/or ThemePart is null.");
        }

        MainDocumentPart mainPart = wordDoc.MainDocumentPart;

        // Delete the old document part.
        mainPart.DeletePart(mainPart.ThemePart);
        // Add a new document part and then add content.
        ThemePart themePart = mainPart.AddNewPart<ThemePart>();

        using (StreamReader streamReader = new StreamReader(themeFile))
        using (StreamWriter streamWriter = new StreamWriter(themePart.GetStream(FileMode.Create)))
        {
            streamWriter.Write(streamReader.ReadToEnd());
        }
    }
}

Confira também