
В приложениях WPF нередко требуется показать пользователю содержимое документа Word без запуска Microsoft Word. Это может быть просмотр отчётов, шаблонов или инструкций прямо внутри интерфейса программы. Для этого доступны несколько подходов, отличающихся сложностью и зависимостями.
Самый прямой способ – использовать Microsoft.Office.Interop.Word. Этот метод подходит, если на компьютере установлен Word, и нужно отобразить документ с сохранением оригинального форматирования. Однако такой вариант зависит от версии Office и не всегда стабилен при развёртывании.
Более универсальное решение – конвертация файла DOCX в XPS и отображение через элемент DocumentViewer. Такой подход не требует установленного Word, а XPS сохраняет разметку и шрифты. Также можно задействовать элемент WebBrowser для показа документа в HTML-виде после преобразования.
При разработке стоит учитывать обработку исключений, отсутствие нужных библиотек и совместимость с разными версиями Windows. Оптимальный вариант выбирают исходя из целей: точное отображение структуры документа или простое чтение текста пользователем.
Подключение библиотек Microsoft Office Interop для работы с Word

Для взаимодействия WPF-приложения с документами Word используется сборка Microsoft.Office.Interop.Word. Она предоставляет доступ к объектной модели Word и позволяет открывать, читать и изменять содержимое файлов DOC и DOCX напрямую из кода C#.
Чтобы подключить библиотеку, в Visual Studio нужно открыть диспетчер пакетов NuGet и установить пакет Microsoft.Office.Interop.Word. Это создаст ссылку на сборку Microsoft.Office.Interop.Word.dll в проекте. После установки в коде следует добавить пространство имён:
using Microsoft.Office.Interop.Word;
Перед использованием необходимо убедиться, что на целевом компьютере установлен Microsoft Word, так как Interop вызывает COM-компоненты приложения. Без этого библиотека не сможет корректно работать.
Рекомендуется инициализировать объекты Word через класс Application и освобождать ресурсы после завершения работы, используя методы Quit() и Marshal.ReleaseComObject(). Это предотвращает зависание процессов WINWORD.EXE в системе.
Если приложение должно работать на компьютерах без установленного Office, стоит рассмотреть альтернативы – например, Open XML SDK или конвертацию документа в XPS для последующего отображения через DocumentViewer.
Создание простого окна WPF для отображения содержимого документа

Пример разметки XAML для базового окна:
<Window x:Class="WordViewer.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Просмотр документа Word" Height="600" Width="800">
<Grid Margin="10">
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<Button Content="Открыть файл" Click="OpenFile_Click" Width="120" Height="30"/>
<RichTextBox x:Name="DocumentBox" Grid.Row="1" Margin="0,10,0,0" IsReadOnly="True"/>
</Grid>
</Window>
Чтобы реализовать открытие и отображение документа, в коде C# можно использовать следующий обработчик:
private void OpenFile_Click(object sender, RoutedEventArgs e)
{
var dialog = new Microsoft.Win32.OpenFileDialog();
dialog.Filter = "Документы Word|*.doc;*.docx";
if (dialog.ShowDialog() == true)
{
var text = System.IO.File.ReadAllText(dialog.FileName);
DocumentBox.Document.Blocks.Clear();
DocumentBox.Document.Blocks.Add(new Paragraph(new Run(text)));
}
}
Ниже приведена таблица с кратким сравнением способов отображения документа:
| Метод | Преимущества | Ограничения |
|---|---|---|
| RichTextBox | Простая реализация, не требует Word | Не сохраняет форматирование |
| Interop Word | Полное отображение стилей | Нужен установленный Word |
| DocumentViewer (XPS) | Сохраняет оформление без зависимости от Word | Требуется предварительная конвертация |
Загрузка файла Word и чтение текста через Interop
Для извлечения текста из документа Word через Interop необходимо создать экземпляр приложения Word, открыть нужный файл и считать содержимое через объект Document. Такой подход позволяет получать не только текст, но и структуру документа, включая абзацы и таблицы.
Пример кода для загрузки документа и чтения текста:
using Word = Microsoft.Office.Interop.Word;
var wordApp = new Word.Application();
Word.Document doc = null;
try
{
object fileName = @"C:\Docs\example.docx";
object readOnly = true;
doc = wordApp.Documents.Open(ref fileName, ReadOnly: ref readOnly);
string text = doc.Content.Text;
Console.WriteLine(text);
}
finally
{
if (doc != null) doc.Close();
wordApp.Quit();
System.Runtime.InteropServices.Marshal.ReleaseComObject(wordApp);
}
При чтении больших файлов рекомендуется отключать отображение интерфейса Word с помощью свойства Visible = false, чтобы ускорить выполнение кода и избежать лишних окон.
Если требуется получить только определённые части текста, можно обращаться к коллекциям Paragraphs, Tables или Bookmarks. Например, doc.Paragraphs[1].Range.Text вернёт текст первого абзаца.
После завершения обработки важно корректно закрывать документ и приложение Word, освобождая ресурсы COM-объектов, иначе процессы WINWORD.EXE останутся активными в системе.
Отображение форматированного текста Word в элементе RichTextBox
Элемент RichTextBox в WPF способен отображать форматированный текст, если преобразовать содержимое Word-документа в формат, поддерживаемый WPF, например RTF. Для этого можно использовать Microsoft.Office.Interop.Word для сохранения документа во временный файл в формате RTF и затем загрузить его в элемент.
using Word = Microsoft.Office.Interop.Word;
using System.IO;
var wordApp = new Word.Application();
Word.Document doc = null;
try
{
object inputFile = @"C:\Docs\sample.docx";
object outputFile = Path.GetTempFileName().Replace(".tmp", ".rtf");
object format = Word.WdSaveFormat.wdFormatRTF;
doc = wordApp.Documents.Open(ref inputFile, ReadOnly: true);
doc.SaveAs2(ref outputFile, ref format);
doc.Close();
var range = new TextRange(DocumentBox.Document.ContentStart, DocumentBox.Document.ContentEnd);
using (var fs = new FileStream(outputFile.ToString(), FileMode.Open))
{
range.Load(fs, DataFormats.Rtf);
}
}
finally
{
wordApp.Quit();
System.Runtime.InteropServices.Marshal.ReleaseComObject(wordApp);
}
Такой метод сохраняет исходное форматирование, включая шрифты, абзацы и таблицы. При этом в RichTextBox можно реализовать горизонтальную и вертикальную прокрутку для удобного просмотра длинных документов.
Для предотвращения зависаний при больших файлах стоит выполнять преобразование RTF в отдельном потоке и обновлять интерфейс через Dispatcher.Invoke(). Это обеспечивает стабильную работу приложения и отзывчивость интерфейса.
Использование встроенного браузера WebBrowser для визуализации документа

Компонент WebBrowser в WPF можно использовать для отображения документов Word без сложных преобразований. Контроль встроенного браузера позволяет напрямую загружать файлы формата DOC или DOCX, если на системе установлен Microsoft Word, так как используется COM-интеграция с Internet Explorer.
Пример разметки XAML:
<Window x:Class="WordViewer.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Просмотр Word через WebBrowser" Height="600" Width="800">
<Grid>
<WebBrowser x:Name="WordBrowser"/>
</Grid>
</Window>
Загрузка документа выполняется через метод Navigate:
private void LoadWordDocument(string path)
{
WordBrowser.Navigate(new Uri(path));
}
Чтобы избежать ошибок при открытии, путь должен быть абсолютным и содержать расширение файла. Поддерживаются форматы:
- .doc
- .docx
- .rtf
- .txt
Для стабильной работы рекомендуется:
- Проверять наличие установленного Microsoft Word, иначе WebBrowser не сможет корректно отобразить содержимое.
- Хранить документ в локальной папке, а не в сетевом расположении, чтобы избежать ограничений безопасности.
- Отключить автоматические диалоги Word через параметры реестра или COM-настройки, если они мешают загрузке.
- Использовать NavigateToStream при необходимости отображения документа из памяти без сохранения на диск.
Метод с WebBrowser подходит для приложений, где важно показать исходное оформление документа, но нет необходимости редактировать содержимое. Однако он зависит от версии Word и компонентов Internet Explorer, что следует учитывать при развёртывании приложения.
Преобразование документа Word в формат XPS позволяет отображать его в WPF без зависимости от установленного Microsoft Word. XPS сохраняет структуру, шрифты и разметку документа, что обеспечивает точное визуальное воспроизведение.
Алгоритм работы:
- Создать экземпляр Microsoft.Office.Interop.Word.Application.
- Открыть документ Word через объект Document.
- Сохранить документ в формате XPS с помощью метода
ExportAsFixedFormat. - Закрыть документ и приложение Word, освободив COM-объекты.
- Загрузить XPS-файл в DocumentViewer для отображения в WPF.
Пример кода конвертации:
using Word = Microsoft.Office.Interop.Word;
using System.IO;
var wordApp = new Word.Application();
Word.Document doc = null;
try
{
object inputFile = @"C:\Docs\report.docx";
object outputFile = @"C:\Docs\report.xps";
object format = Word.WdExportFormat.wdExportFormatXPS;
doc = wordApp.Documents.Open(ref inputFile, ReadOnly: true);
doc.ExportAsFixedFormat(outputFile.ToString(), format);
doc.Close();
var xpsDoc = new System.Windows.Xps.Packaging.XpsDocument(outputFile.ToString(), FileAccess.Read);
DocumentViewerControl.Document = xpsDoc.GetFixedDocumentSequence();
}
finally
{
wordApp.Quit();
System.Runtime.InteropServices.Marshal.ReleaseComObject(wordApp);
}
Рекомендации по работе с XPS:
- Хранить временные XPS-файлы в отдельной папке для последующего удаления и предотвращения захламления диска.
- Использовать асинхронную конвертацию для больших документов, чтобы интерфейс оставался отзывчивым.
- Проверять наличие разрешений на чтение/запись в каталоге, где создается XPS.
- При необходимости обновления документа в окне WPF закрывать XPS и освобождать ресурсы перед повторной загрузкой.
Метод с XPS особенно полезен, когда нужно обеспечить стабильное отображение документа с сохранением всех стилей, независимо от версии Word на компьютере пользователя.
Обработка ошибок и проверка наличия установленного Microsoft Word

Перед использованием Interop важно убедиться, что на системе установлен Microsoft Word. Это можно сделать через проверку наличия ключей реестра:
HKEY_CLASSES_ROOT\Word.Application
Если ключ отсутствует, попытка создания объекта Word.Application вызовет исключение COM. В этом случае стоит уведомить пользователя и предложить альтернативный способ просмотра документа, например через XPS или RTF.
Для безопасной работы приложения рекомендуется оборачивать вызовы Interop в try-catch блоки. Пример обработки ошибок:
try
{
var wordApp = new Word.Application();
var doc = wordApp.Documents.Open(filePath);
// работа с документом
doc.Close();
wordApp.Quit();
}
catch (System.Runtime.InteropServices.COMException ex)
{
MessageBox.Show("Microsoft Word не установлен или недоступен: " + ex.Message);
}
catch (Exception ex)
{
MessageBox.Show("Ошибка при обработке документа: " + ex.Message);
}
Дополнительно стоит использовать finally для освобождения COM-объектов через Marshal.ReleaseComObject, чтобы процессы WINWORD.EXE не оставались активными после ошибок.
Рекомендуется проверять файлы на существование и права доступа перед открытием, чтобы предотвратить исключения при отсутствии документа или недостатке разрешений.
При разработке приложений, ориентированных на разные версии Windows и Office, полезно предусмотреть fallback-методы: просмотр через DocumentViewer или загрузку текста в RichTextBox без Interop.
Вопрос-ответ:
Как подключить Microsoft Office Interop в проект WPF для работы с документами Word?
В Visual Studio необходимо через диспетчер NuGet установить пакет Microsoft.Office.Interop.Word. После этого в коде подключается пространство имён: using Microsoft.Office.Interop.Word;. Интероп позволяет открывать, читать и изменять документы Word через объекты Application и Document. Для корректной работы на компьютере должен быть установлен Microsoft Word, иначе COM-объекты создавать не получится.
Можно ли отобразить форматированный текст Word в элементе RichTextBox?
Да, но RichTextBox напрямую не поддерживает формат DOCX. Для сохранения форматирования документ Word можно временно сохранить в RTF через Interop и загрузить файл в RichTextBox с помощью TextRange.Load() и формата DataFormats.Rtf. Этот метод сохраняет абзацы, шрифты и базовое форматирование, но сложные объекты, например SmartArt, могут отображаться некорректно.
Какие способы отображения Word-документов в WPF позволяют обойти зависимость от установленного Office?
Можно использовать конвертацию в XPS с последующим выводом через DocumentViewer. XPS сохраняет структуру и оформление документа и не требует установленного Word. Ещё один вариант — преобразование документа в HTML или RTF для отображения в WebBrowser или RichTextBox. Такой подход удобен для просмотра, но редактирование остаётся ограниченным.
Как избежать зависания процесса WINWORD.EXE при работе с Interop?
Необходимо всегда закрывать открытые документы и приложение Word через методы Close() и Quit(), а также освобождать COM-объекты с помощью Marshal.ReleaseComObject(). Дополнительно полезно использовать try-finally, чтобы гарантировать завершение работы даже при возникновении ошибок.
Какие ошибки чаще всего возникают при загрузке Word-документов через Interop и как их обрабатывать?
Частые ошибки включают отсутствие установленного Microsoft Word, неверный путь к файлу, отсутствие прав доступа и повреждённый документ. Для их обработки используют блоки try-catch, проверяют существование файла через File.Exists() и права на чтение. В блоке catch можно выводить сообщения пользователю и переключаться на альтернативные методы просмотра, например через XPS или RTF.
Можно ли отображать документ Word в WPF без установленного Microsoft Word?
Да, для этого можно конвертировать файл DOCX в формат XPS и использовать DocumentViewer для отображения. XPS сохраняет разметку, шрифты и оформление документа. Альтернативно, можно сохранить Word в RTF или HTML и загрузить в RichTextBox или WebBrowser. Такой подход позволяет просматривать содержимое без зависимости от Office, но редактирование документа будет ограничено.
Как правильно закрывать Word-документ через Interop, чтобы не оставались процессы WINWORD.EXE?
Необходимо вызывать doc.Close() для каждого открытого документа и wordApp.Quit() для приложения Word. После этого объекты COM следует освобождать с помощью Marshal.ReleaseComObject(). Рекомендуется использовать блок try-finally, чтобы даже при возникновении ошибок процесс Word завершался корректно и не зависал в памяти.
