Substituir a parte do tema em um documento de processamento de texto
Este tópico mostra como utilizar as classes no SDK Open XML para o Office para substituir programaticamente uma parte do documento num documento de processamento de palavras.
Pacotes e partes do documento
Um documento Open XML é armazenado como um pacote, cujo formato é definido por 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, começa por abrir o ficheiro de processamento de palavras ao instanciar a WordprocessingDocument classe, conforme mostrado na seguinte using
instrução. Na mesma instrução, abre o documento de ficheiro de processamento de palavras com o Open método , com o parâmetro Booleano definido como para true
ativar a edição do documento.
using (WordprocessingDocument wordDoc = WordprocessingDocument.Open(document, true))
Com a v3.0.0+ o Close() método foi removido a favor de depender da instrução using.
Garante que o Dispose() método é chamado automaticamente quando a chaveta de fecho é atingida. O bloco que segue a instrução using estabelece um âmbito para o objeto que é criado ou nomeado na instrução using. Uma vez que a WordprocessingDocument classe no SDK Open XML guarda e fecha automaticamente o objeto como parte da respetiva IDisposable implementação e porque Dispose() é automaticamente chamada quando sai do bloco, não tem de chamar Save() explicitamente ou Dispose() desde que utilize uma using
instrução.
Como Alterar Tema num Pacote de Word
Se quiser alterar o tema num Word documento, clique na Estrutura do friso e, em seguida, clique em Temas. O menu pendente Temas é aberto. Para escolher um dos temas incorporados e aplicá-lo ao Word documento, clique no ícone do tema. Também pode utilizar a opção Procurar Temas... para localizar e aplicar um ficheiro de tema no seu computador.
A Estrutura do Elemento Tema
O elemento de tema é constituído por esquemas de cor, tipo de letra e formatação. Neste procedimento, vai aprender a alterar o tema programaticamente. Por conseguinte, é ú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.
Este elemento define o tipo complexo de nível de raiz associado a uma folha de estilos partilhada (ou tema). Este elemento contém todas as diferentes opções de formatação disponíveis para um documento através de um tema e define o aspeto e funcionalidade gerais do documento quando os objetos temáticos são utilizados no documento.
[Exemplo: considere a imagem seguinte como um exemplo de temas diferentes em utilização aplicados a uma apresentação. Neste exemplo, pode ver como um tema pode afetar o tipo de letra, as cores, os fundos, os preenchimentos e os efeitos de diferentes objetos numa apresentação. exemplo final]
Neste exemplo, vemos como um tema pode afetar o tipo de letra, as cores, os fundos, os preenchimentos e os efeitos de diferentes objetos numa apresentação. exemplo final]
© ISO/IEC 29500: 2016
A tabela seguinte lista os possíveis tipos subordinados da classe Tema.
Elemento PresentationML | Abrir Classe SDK XML | Descrição |
---|---|---|
<custClrLst/> |
CustomColorList | Lista de Cores Personalizada |
<extLst/> |
ExtensionList | Lista de Extensões |
<extraClrSchemeLst/> |
ExtraColorSchemeList | Lista de Esquemas de Cores Adicionais |
<objectDefaults/> |
ObjectDefaults | Predefinições de Objeto |
<themeElements/> |
ThemeElements | Elementos do Tema |
O fragmento de Esquema XML seguinte define as quatro partes do elemento de tema. O themeElements
elemento é a peça que contém a formatação main definida no tema. As outras partes fornecem substituições, predefinições e adições às informações contidas no themeElements
. O tipo complexo que define um tema, CT_OfficeStyleSheet
, é definido da seguinte forma:
<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>
Este tipo complexo também contém um CT_OfficeArtExtensionList
, que é utilizado para extensibilidade futura deste tipo complexo.
Como funciona o código de exemplo
Depois de abrir o ficheiro, pode instanciar o MainDocumentPart
wordDoc
no objeto e eliminar a parte do tema antigo.
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, pode criar adicionar um novo ThemePart objeto e adicioná-lo ao MainDocumentPart
objeto. Em seguida, pode adicionar conteúdo com um StreamReader
objeto e StreamWriter 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 seguinte mostra como substituir a parte do documento de tema num documento de processamento de palavras pela parte do tema de outro pacote.
O ficheiro de tema transmitido como segundo argumento tem de ser uma parte do tema válida no formato XML (por exemplo, Theme1.xml). Pode extrair esta parte de um documento ou ficheiro de tema existente (. THMX) cujo nome foi mudado para ser um ficheiro de .Zip. Para chamar o método ReplaceTheme
, pode utilizar o seguinte exemplo de chamada para copiar o tema do ficheiro de arg[1]
e para o ficheiro localizado em arg[0]
string document = args[0];
string themeFile = args[1];
ReplaceTheme(document, themeFile);
Depois de executar o programa, abra o ficheiro Word e repare que o novo tema muda.
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());
}
}
}