Откройте текстовый документ для доступа только для чтения
В этом разделе описывается использование классов в пакете SDK Open XML для Office для программного открытия текстового документа для доступа только для чтения.
Когда рекомендуется открывать документ только для чтения
Иногда требуется открыть документ для проверки или получения некоторых сведений, при этом нужно сделать это так, чтобы документ нельзя было изменить. В этих случаях документ нужно открыть только для чтения. В этом разделе описывается несколько программных способов открытия документа Word в режиме только для чтения.
Создание объекта WordprocessingDocument
В пакете SDK WordprocessingDocument Open XML класс представляет пакет документов Word. Чтобы работать с документом Word, сначала создайте экземпляр WordprocessingDocument класса из документа, а затем работайте с этим экземпляром. После создания экземпляра в документе можно получить доступ к основной части документа, которая содержит текст. Каждый пакет Open XML содержит различные части. Как минимум, объект должен содержать main часть документа, WordprocessingDocument которая выступает в качестве контейнера для main текста документа. Пакет также может содержать дополнительные части. Учтите, что в документе Word текст основной части документа представлен в пакете как XML с использованием разметки WordprocessingML.
Чтобы создать экземпляр класса из документа, вызовите один из Open
методов . Предоставляется несколько Open
методов, каждый из которых имеет разную сигнатуру. Эти методы позволяют указать, можно ли изменять документ, как описано в следующей таблице.
Метод Open | Раздел справочника библиотеки классов | Описание |
---|---|---|
Open(String, Boolean) |
Open(String, Boolean) | Создайте экземпляр класса из WordprocessingDocument указанного файла. |
Open(Stream, Boolean) |
Open(Stream, Boolean) | Создайте экземпляр класса из WordprocessingDocument указанного потока ввода-вывода. |
Open(String, Boolean, OpenSettings) |
Open(String, Boolean, OpenSettings) | Создайте экземпляр класса из WordprocessingDocument указанного файла. |
Open(Stream, Boolean, OpenSettings) |
Open(Stream, Boolean, OpenSettings) | Создайте экземпляр класса из WordprocessingDocument указанного потока ввода-вывода. |
В приведенной выше таблице перечислены только те Open
методы, которые принимают логическое значение в качестве второго параметра для указания возможности редактирования документа. Чтобы открыть документ только для чтения задайте в этом параметре значение false.
Обратите внимание, что два метода Open
создают экземпляр класса на WordprocessingDocument основе строки в качестве первого параметра. Первый пример в коде применяет этот способ. В ней используется первый Open
метод из приведенной выше таблицы с сигнатурой, требующей двух параметров. Первый параметр принимает строку, представляющую полный путь к файлу, из которого требуется открыть документ. Вторым параметром является true
или false
; в этом примере используется false
и указывает, нужно ли открыть файл для редактирования.
В следующем примере кода вызывается Open
метод .
// Open a WordprocessingDocument based on a filepath.
using (WordprocessingDocument wordProcessingDocument = WordprocessingDocument.Open(filepath, false))
Два других Open
метода создают экземпляр класса на WordprocessingDocument основе потока входных и выходных данных. Этот подход можно использовать, например, если у вас есть приложение Microsoft Office SharePoint Online, использующее потоковые входные и выходные данные, и вы хотите использовать пакет SDK Open XML для работы с документом.
В следующем коде открывается документ на основе потока.
// Get a stream of the wordprocessing document
using (FileStream fileStream = new FileStream(filepath, FileMode.Open))
// Open a WordprocessingDocument for read-only access based on a stream.
using (WordprocessingDocument wordDocument = WordprocessingDocument.Open(fileStream, false))
Предположим, что у вас есть приложение, использующее поддержку Open XML в пространстве имен System.IO.Packaging библиотеки классов платформа .NET Framework, и вы хотите использовать пакет SDK Open XML для работы только с пакетом для чтения. Хотя пакет SDK Open XML включает перегрузки методов, которые принимают в Package качестве первого параметра, не существует ни одного, который принимает логическое значение в качестве второго параметра, указывающего, следует ли открывать документ для редактирования.
Рекомендуемый метод — открыть пакет как доступный только для чтения, чтобы начать с до создания экземпляра WordprocessingDocument класса, как показано во втором примере в примере кода. В следующем примере выполняется эта операция.
// Open System.IO.Packaging.Package.
using (Package wordPackage = Package.Open(filepath, FileMode.Open, FileAccess.Read))
// Open a WordprocessingDocument based on a package.
using (WordprocessingDocument wordDocument = WordprocessingDocument.Open(wordPackage))
После открытия пакета документов Word можно получить доступ к основной части документа. Для доступа к телу основной части документа назначьте ссылку на существующее тело документа, как показано в следующем примере.
// Assign a reference to the existing document body or create a new one if it is null.
MainDocumentPart mainDocumentPart = wordProcessingDocument.MainDocumentPart ?? wordProcessingDocument.AddMainDocumentPart();
mainDocumentPart.Document ??= new Document();
Body body = mainDocumentPart.Document.Body ?? mainDocumentPart.Document.AppendChild(new Body());
Структура документа WordProcessingML
Базовая структура WordProcessingML
документа состоит из document
элементов и body
, за которыми следует один или несколько элементов уровня блока, таких как p
, который представляет абзац. Абзац содержит один или несколько r
элементов. Представляет r
собой область текста с общим набором свойств, таких как форматирование. Выполнение содержит один или несколько t
элементов. Элемент t
содержит диапазон текста. В следующем примере кода показана разметка WordprocessingML
для документа, содержащего текст "Пример текста".
<w:document xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main">
<w:body>
<w:p>
<w:r>
<w:t>Example text.</w:t>
</w:r>
</w:p>
</w:body>
</w:document>
С помощью пакета SDK Open XML можно создавать структуру документа и содержимое с помощью строго типизированных классов, соответствующих WordprocessingML
элементам. Эти классы находятся в пространстве имен. В следующей таблице перечислены имена классов, которые соответствуют document
элементам , body
, p
, r
и t
.
Элемент WordprocessingML | Класс пакета SDK Open XML | Описание |
---|---|---|
<document/> |
Document | Корневой элемент основной части документа. |
<body/> |
Body | Контейнер для структур уровня блокировки, таких как абзацы, таблицы, примечания и других элементов, описанных в спецификации ISO/IEC 29500. |
<p/> |
Paragraph | Абзац. |
<r/> |
Run | Прогон. |
<t/> |
Text | Диапазон текста. |
Дополнительные сведения об общей структуре частей и элементов документа WordprocessingML см. в разделе Структура документа WordprocessingML.
Создание разметки WordprocessingML для добавления текста и попытки сохранить текст
В этом примере кода показано, как можно добавить текст и попытаться сохранить изменения, чтобы обозначить, что документ доступен только для чтения. Получив доступ к тексту части документа main, добавьте текст, добавив экземпляры Paragraphклассов , Runи Text . При этом будет создана требуемая разметка WordprocessingML. В следующем примере кода добавляется абзац, пробег и текст.
// Attempt to add some text.
Paragraph para = body.AppendChild(new Paragraph());
Run run = para.AppendChild(new Run());
run.AppendChild(new Text("Append text in body, but text is not saved - OpenWordprocessingDocumentReadonly"));
// Call Save to generate an exception and show that access is read-only.
// mainDocumentPart.Document.Save();
Пример кода
Первый пример метода, показанного здесь, OpenWordprocessingDocumentReadOnly
открывает Word документ для доступа только для чтения. Вызовите его, передав полный путь к файлу, который нужно открыть. Например, в следующем примере кода открывается путь к файлу из первого аргумента командной строки для доступа только для чтения.
OpenWordprocessingDocumentReadonly(args[0]);
Во втором примере метода показано, OpenWordprocessingPackageReadonly
как открыть документ Word для доступа только для чтения из Package.
Вызовите его, передав полный путь к файлу, который нужно открыть. Например, в следующем примере кода открывается путь к файлу из первого аргумента командной строки для доступа только для чтения.
OpenWordprocessingPackageReadonly(args[0]);
В третьем примере метода , показано, OpenWordprocessingStreamReadonly
как открыть документ Word для доступа только для чтения из потока.
Вызовите его, передав полный путь к файлу, который нужно открыть. Например, в следующем примере кода открывается путь к файлу из первого аргумента командной строки для доступа только для чтения.
OpenWordprocessingStreamReadonly(args[0]);
Важно!
[!Важно!] При раскомментировании инструкции, отвечающей за сохранение файла, в программе возникнет исключение IOException, поскольку файл открыт только для чтения.
Ниже приведен полный пример кода на языках C# и VB.
static void OpenWordprocessingDocumentReadonly(string filepath)
{
// Open a WordprocessingDocument based on a filepath.
using (WordprocessingDocument wordProcessingDocument = WordprocessingDocument.Open(filepath, false))
{
if (wordProcessingDocument is null)
{
throw new ArgumentNullException(nameof(wordProcessingDocument));
}
// Assign a reference to the existing document body or create a new one if it is null.
MainDocumentPart mainDocumentPart = wordProcessingDocument.MainDocumentPart ?? wordProcessingDocument.AddMainDocumentPart();
mainDocumentPart.Document ??= new Document();
Body body = mainDocumentPart.Document.Body ?? mainDocumentPart.Document.AppendChild(new Body());
// Attempt to add some text.
Paragraph para = body.AppendChild(new Paragraph());
Run run = para.AppendChild(new Run());
run.AppendChild(new Text("Append text in body, but text is not saved - OpenWordprocessingDocumentReadonly"));
// Call Save to generate an exception and show that access is read-only.
// mainDocumentPart.Document.Save();
}
}
static void OpenWordprocessingPackageReadonly(string filepath)
{
// Open System.IO.Packaging.Package.
using (Package wordPackage = Package.Open(filepath, FileMode.Open, FileAccess.Read))
// Open a WordprocessingDocument based on a package.
using (WordprocessingDocument wordDocument = WordprocessingDocument.Open(wordPackage))
{
// Assign a reference to the existing document body or create a new one if it is null.
MainDocumentPart mainDocumentPart = wordDocument.MainDocumentPart ?? wordDocument.AddMainDocumentPart();
mainDocumentPart.Document ??= new Document();
Body body = mainDocumentPart.Document.Body ?? mainDocumentPart.Document.AppendChild(new Body());
// Attempt to add some text.
Paragraph para = body.AppendChild(new Paragraph());
Run run = para.AppendChild(new Run());
run.AppendChild(new Text("Append text in body, but text is not saved - OpenWordprocessingPackageReadonly"));
// Call Save to generate an exception and show that access is read-only.
// mainDocumentPart.Document.Save();
}
}
static void OpenWordprocessingStreamReadonly(string filepath)
{
// Get a stream of the wordprocessing document
using (FileStream fileStream = new FileStream(filepath, FileMode.Open))
// Open a WordprocessingDocument for read-only access based on a stream.
using (WordprocessingDocument wordDocument = WordprocessingDocument.Open(fileStream, false))
{
// Assign a reference to the existing document body or create a new one if it is null.
MainDocumentPart mainDocumentPart = wordDocument.MainDocumentPart ?? wordDocument.AddMainDocumentPart();
mainDocumentPart.Document ??= new Document();
Body body = mainDocumentPart.Document.Body ?? mainDocumentPart.Document.AppendChild(new Body());
// Attempt to add some text.
Paragraph para = body.AppendChild(new Paragraph());
Run run = para.AppendChild(new Run());
run.AppendChild(new Text("Append text in body, but text is not saved - OpenWordprocessingStreamReadonly"));
// Call Save to generate an exception and show that access is read-only.
// mainDocumentPart.Document.Save();
}
}