Извлечение стилей из документа обработки текста
В этом разделе показано, как использовать классы в пакете SDK Open XML для Office для программного извлечения элементов styles или stylesWithEffects из текстового документа в XDocument экземпляр. Он содержит пример ExtractStylesPart
метода для иллюстрации этой задачи.
Метод ExtractStylesPart
Пример метода можно использовать ExtractStylesPart
для получения экземпляраXDocument
, содержащего часть styles или stylesWithEffects для документа Microsoft Word. Имейте в виду, что в документе, созданном в Word 2010 году, будет только одна часть стилей; Word 2013+ добавляет вторую часть stylesWithEffects. Для обеспечения кругового пути документа с Word 2013 по Word 2010 и обратно, Word 2013+ поддерживает как часть исходных стилей, так и новые стили. (Спецификация форматов файлов Open XML в Office требует, чтобы корпорация Майкрософт Word игнорировать все части, которые она не распознает. Word 2010 не замечает часть stylesWithEffects, добавленную в документ Word 2013 и более поздних версий.) Вам (и вашему приложению) необходимо интерпретировать результаты получения элементов styles или stylesWithEffects.
Процедура ExtractStylesPart
принимает два параметра: первый параметр содержит строку, указывающую путь к файлу, из которого требуется извлечь стили, а второй указывает, хотите ли вы получить часть стилей или более новую часть stylesWithEffects (в основном эту процедуру необходимо вызвать два раза для документов Word 2013 и более поздних версий, извлекая каждую часть). Процедура возвращает XDocument
экземпляр, содержащий полную часть стилей или стилейWithEffects, запрошенную вами, со всеми сведениями о стиле для документа (или пустой ссылкой, если запрошенная часть не существует).
static XDocument? ExtractStylesPart(string fileName, string getStylesWithEffectsPart = "true")
Полный листинг кода метода можно найти в разделе Пример кода.
Вызов примера метода
Чтобы вызвать метод примера, передайте строку для первого параметра, содержащего имя файла документа, из которого извлекаются стили, и логическое значение для второго параметра, указывающего, является ли извлекаемая частью styleWithEffects (true
) или частью стилей (false
). Следующий код показывает пример использования:
При наличии экземпляра XDocument
с ним можно выполнять все необходимое. В следующем примере кода содержимое XDocument
экземпляра отображается в консоли.
if (args is [{ } fileName, { } getStyleWithEffectsPart])
{
var styles = ExtractStylesPart(fileName, getStyleWithEffectsPart);
if (styles is not null)
{
Console.WriteLine(styles.ToString());
}
}
else if (args is [{ } fileName2])
{
var styles = ExtractStylesPart(fileName2);
if (styles is not null)
{
Console.WriteLine(styles.ToString());
}
}
Принципы работы кода
Код начинается с создания переменной с именем styles
, содержащей возвращаемое значение для метода .
Код продолжается, открывая документ с помощью Open метода и указывая, что документ должен быть открыт для доступа только для чтения (последний параметр false). При открытии документа код использует MainDocumentPart свойство для перехода к части документа main, а затем подготавливает переменную с именем stylesPart
для хранения ссылки на часть стилей.
// Declare a variable to hold the XDocument.
XDocument? styles = null;
// Open the document for read access and get a reference.
using (var document = WordprocessingDocument.Open(fileName, false))
{
if (
document.MainDocumentPart is null ||
(document.MainDocumentPart.StyleDefinitionsPart is null && document.MainDocumentPart.StylesWithEffectsPart is null)
)
{
throw new ArgumentNullException("MainDocumentPart and/or one or both of the Styles parts is null.");
}
// Get a reference to the main document part.
var docPart = document.MainDocumentPart;
// Assign a reference to the appropriate part to the
// stylesPart variable.
StylesPart? stylesPart = null;
Поиск части "Правильные стили"
Затем код получает ссылку на часть запрошенных стилей с помощью getStylesWithEffectsPart
Boolean параметра .
На основе этого значения код получает определенное свойство переменной docPart
и сохраняет его в переменной stylesPart
.
if (getStylesWithEffectsPart.ToLower() == "true")
{
stylesPart = docPart.StylesWithEffectsPart;
}
else
{
stylesPart = docPart.StyleDefinitionsPart;
}
Получение содержимого части
Если запрошенная часть стилей существует, код должен возвращать содержимое части в экземпляре XDocument
. Каждая часть предоставляет GetStream() метод , который возвращает Stream.
Код передает экземпляр Stream методуCreate, а затем вызывает Load метод , передавая в XmlNodeReader
качестве параметра .
if (stylesPart is not null)
{
using var reader = XmlNodeReader.Create(stylesPart.GetStream(FileMode.Open, FileAccess.Read));
// Create the XDocument.
styles = XDocument.Load(reader);
}
Пример кода
Ниже приведен полный пример кода ExtractStylesPart на C# и Visual Basic.
using DocumentFormat.OpenXml.Packaging;
using System;
using System.IO;
using System.Xml;
using System.Xml.Linq;
// Extract the styles or stylesWithEffects part from a
// word processing document as an XDocument instance.
static XDocument? ExtractStylesPart(string fileName, string getStylesWithEffectsPart = "true")
{
// Declare a variable to hold the XDocument.
XDocument? styles = null;
// Open the document for read access and get a reference.
using (var document = WordprocessingDocument.Open(fileName, false))
{
if (
document.MainDocumentPart is null ||
(document.MainDocumentPart.StyleDefinitionsPart is null && document.MainDocumentPart.StylesWithEffectsPart is null)
)
{
throw new ArgumentNullException("MainDocumentPart and/or one or both of the Styles parts is null.");
}
// Get a reference to the main document part.
var docPart = document.MainDocumentPart;
// Assign a reference to the appropriate part to the
// stylesPart variable.
StylesPart? stylesPart = null;
if (getStylesWithEffectsPart.ToLower() == "true")
{
stylesPart = docPart.StylesWithEffectsPart;
}
else
{
stylesPart = docPart.StyleDefinitionsPart;
}
if (stylesPart is not null)
{
using var reader = XmlNodeReader.Create(stylesPart.GetStream(FileMode.Open, FileAccess.Read));
// Create the XDocument.
styles = XDocument.Load(reader);
}
}
// Return the XDocument instance.
return styles;
}