Использование Word Object Model

Пример решения задачи по нахождению самого длинного слова в документе MS Word с помощью Word Object Model.

Для того чтобы воспользоваться объектной моделью Word'а, необходимо к проекту добавить COM ссылку на Microsoft Word 12.0 Object Library (номер версии может отличаться). См. также страницу MSDN Understanding the Word Object Model from a .NET Developer's Perspective
Для удобства программирования рекомендуется также использовать пространство имен Microsoft.Office.Interop.Word.

Исходный код примера:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.Office.Interop.Word;
using System.Windows.Forms;

namespace UsingWordObjectModel
{
    class Program
    {
        [STAThread]
        static void Main(string[] args)
        {
            Console.WriteLine("Выберите файл для конвертации(не должен содержать таблицы.\n" +
                                         "Откроется диалоговое окно выбора файла.");
            OpenFileDialog myFileDlg = new OpenFileDialog();
            myFileDlg.DefaultExt = "docx";
            myFileDlg.Filter = "Microsoft Word Document (*.docx)|*.docx";
            System.Windows.Forms.DialogResult res = myFileDlg.ShowDialog();
            if (res != System.Windows.Forms.DialogResult.OK)
            {
                Console.WriteLine("Выбор отменен. Выходим...");
                Console.ReadKey();
                return;
            }
            string fullPath = myFileDlg.FileName;
            object file = fullPath;
            object nullobj = System.Reflection.Missing.Value;
            try
            {
                // Создаем приложение.
                ApplicationClass wordApp = new ApplicationClass();
                // Открываем документ.
                Document doc = wordApp.Documents.Open(
                    ref file, ref nullobj, ref nullobj,
                    ref nullobj, ref nullobj, ref nullobj,
                    ref nullobj, ref nullobj, ref nullobj,
                    ref nullobj, ref nullobj, ref nullobj, ref nullobj, ref nullobj, ref nullobj, ref nullobj);
                // Получаем содержимое
                Range range = doc.Content;
                // Хранить Range слова с максимальной длиной.
                Range maxWordRange = null;
                // Хранит слово с максимальной длиной.
                string maxLenWord = "";
                int len = 0;
                // Проходим по всем словам документа.
                foreach (Range word in range.Words)
                {
                    if (word.Text.Length > len)
                    {
                        maxWordRange = word;
                        maxLenWord = word.Text;
                        len = word.Text.Length;
                    }
                }
                // Пробел включается в слово. Удалим его, если он есть.
                if (maxLenWord[maxLenWord.Length - 1] == ' ')
                    maxLenWord = maxLenWord.Substring(0, maxLenWord.Length - 1);
                Console.WriteLine("Самое длинное слово: {0}, его длина: {1}", maxLenWord, maxLenWord.Length);
                Console.WriteLine("Это слово сейчас будет выделено в Word'е =)");
                // Показали окно Word'а.
                wordApp.Visible = true;
                // Выделили слово с максимальной длиной.
                maxWordRange.Select();
                System.Threading.Thread.Sleep(5000);
                Console.WriteLine("Программы закрывается. MS Word тоже закроется =)");
                // Скрыли окно Word'а
                wordApp.Visible = false;
                // Вышли.
                wordApp.Quit(Type.Missing, Type.Missing, Type.Missing);
            }
            catch (Exception e)
            {
                Console.WriteLine("-err. Exception: {0}, TargetSite: {1}, StackTrace: {2}", e.Message, e.TargetSite, e.StackTrace);
                Console.ReadKey();
                Environment.Exit(1);
            }
        }
    }
}
--
автор: Балаян Артур

Last edited Jan 23, 2012 at 6:22 AM by basph, version 4

Comments

No comments yet.