Получение данных из таблиц документа Microsoft Word

      В данной инструкции рассмотрен пример получения данных из таблиц, содержащихся в файле Microsoft Word. Для реализации данной задачи используется объектная библиотека «Microsoft Word 14.0 Object Library».
      Создайте проект Windows Form в Microsoft Visual Studio, для этого запустите среду разработки и перейдите в меню Файл->Создать...->Проект. Выберете версию .Net Fraemwork и введите имя проекта. После создания проекта, добавьте на форму три компонента:
  • textBox1 - в данном компоненте будет выводится путь, имя и расширение выбранного файла;
  • button1 – кнопка для запуска процесса получения данных из выбранного файла;
  • dataGridView1 – элемент управления необходимый для отображения полученных данных.
      Выберете компонент «dataGridView1» и сделайте клик правой клавишей мыши по нему, из появившегося контекстного меню выберете пункт «Свойства».
Установите следующие параметры в свойствах компонента:
  • Dock None – свойство задает границы элемента управления, прикрепленные к его родительскому элементу управления и определяет способ изменения его размеров относительно родительского элемента управления (http://microsoft.com
  • Anchor - Top, Bottom, Left, Right - свойство задает границы контейнера, с которым связан элемент управления, и определяет способ изменения его при изменении размеров его родительского элемента (http://microsoft.com).
      Перейдите в «Обозреватель решений» и найдите группу «References» которая содержит все ссылки на внешние компоненты в проекте. Сделайте клик правой клавишей мыши по данной группе и выберете из появившегося контекстного меню, пункт «Добавить ссылку…».
      У вас откроется окно «Менеджер ссылок – (имя вашего проекта)», в левой части данного окна вам будет предложено выбрать одну из категорий. Visual Studio предоставляет четыре группы для выбора.
  • Сборки — список всех компонентов платформы .NET Framework, ссылки на которые можно добавить.
  • Решение — список всех повторно используемых компонентов, созданных в локальных проектах.
  • COM — список всех COM-компонентов, ссылки на которые можно добавить.
  • Обзор — позволяет осуществлять поиск компонента в файловой системе.
      Выберете группу «COM» и ее подгруппу «Библиотеки типов». В центральной части окна вам будет предложен список доступных библиотек для подключения к вашему проекту. Найдите в списке библиотеку «Microsoft Word 14.0 Object Library» и поставьте галочку рядом с именем данной библиотеки. В нижней части окна нажмите кнопку «ОК».
После добавления библиотеки, у вас появится три новых пункта в обозревателе решений:
  • Microsoft.Office.Core;
  • Microsoft.Office.Interop.Word;
  • VBIDE.
      Для извлечения таблиц содержащихся в документе Word воспользуемся коллекцией «Tables», являющейся членом классов «Microsoft.Office.Interop.Word.Document», «Microsoft.Office.Tools.Word.Document», «Selection» и «Range», это означает, что можно прочитать или создать таблицу в контексте любого из них. Для работы с добавленными ссылками необходимо добавить следующие пространства имен с использованием директивы «using»:
using WordObj = Microsoft.Office.Interop.Word; - создается псевдоним пространства имен «Microsoft.Office.Interop.Word».
      В данном примере для открытия файла используется класс «OpenFileDialog», реализующий открытие окна для выбора файла по заданному фильтру «MS Word 2003 (*.doc)|*.doc|MS Word 2007 (*.docx)|*.docx». Данный фильтр так же реализует защиту от выбора файла не относящегося к Word.

OpenFileDialog dialog = new OpenFileDialog();
dialog.Filter = "MS Word 2003 (*.doc)|*.doc|MS Word 2007 (*.docx)|*.docx";
dialog.Title = "Выберите документ для загрузки данных";
      После выбора файла выполняется проверка, что файл действительно выбран. Если данное условие выполнено, создается новый объект «Application» или приложение «Word». Далее необходимо открыть указанный документ и добавить его в коллекцию документов, данную функцию выполняет метод «Documents.Open». Для загрузки данных из необходимой таблицы, выбирается активный документ из коллекции с помощью метода «ActiveDocument», из которого выбирается таблица для открытия. Нумерация таблиц начинается с 1.
      Сделайте двойной клик по компоненту «button1», вы перейдете в автоматически созданный метод «button1_Click», события компонента «Click». Добавьте приведенный ниже листинг кода в тело данного метода.
OpenFileDialog dialog = new OpenFileDialog();
dialog.Filter = "MS Word 2003 (*.doc)|*.doc|MS Word 2007 (*.docx)|*.docx";
dialog.Title = "Выберите документ для загрузки данных";
if (dialog.ShowDialog() == System.Windows.Forms.DialogResult.OK)
{
    textBox1.Text = dialog.FileName;
    WordObj.Application application = new WordObj.Application();
    Object FileName = dialog.FileName;
    application.Documents.Open(ref FileName);
    WordObj.Document document = application.ActiveDocument;
    WordObj.Table table = document.Tables[1];
    if (table.Rows.Count > 0 && table.Columns.Count > 0)
    {
        List headers = new List();
        DataTable dataTable = new DataTable();
        for (int i = 0; i < table.Columns.Count; i++)
        {
            dataTable.Columns.Add();
            headers.Add(table.Cell(1, i + 1).Range.Text.Trim('\a', '\r', '\n', '\t'));
        }
        for (int i = 0; i < table.Rows.Count - 1; i++)
        {
            string[] row = new string[table.Columns.Count];
            for (int j = 0; j < table.Columns.Count; j++)
                row[j] = table.Cell(i + 2, j + 1).Range.Text.Trim('\a', '\r', '\n', '\t');
            dataTable.Rows.Add(row);
        }
        dataGridView1.DataSource = dataTable;
        for (int i = 0; i < headers.Count; i++)
            dataGridView1.Columns[i].HeaderText = headers[i];
    }
    application.Quit();
}
      Запустите проект, нажав на клавиатуре клавишу «F5». Нажмите на кнопку «Открыть», расположенную на форме. В открывшемся диалоговом окне выберете файл Microsoft Word содержащий табличные данные и нажмите кнопку «Открыть», расположенную в нижней части окна. Если в файле содержались таблицы, то первая из них расположенная ближе к началу документа будет загружена.
      В случае если открываемый вами файл занят другим процессом или открыт другим пользователем, Microsoft Word выдаст вам предупреждение «Файл уже используется» и предложит несколько вариантов действий. Выберете первый вариант «Открыть только для чтения» – документ откроется на несколько секунд для загрузки данных и закроется.
      Вы можете усложнить проект и добавить элемент управления «ComboBox», в котором будет предлагаться выбрать номер таблицы и посмотреть хранящиеся в ней данные. Для этого перейдите в «Панель элементов» и добавьте элемент управления «ComboBox» на главную форму проекта. У вас получится приведенный ниже вариант.
      Сделайте двойной клик по добавленному компоненту, вы перейдете в автоматически созданный метод «comboBox1_SelectedIndexChanged», события «SelectedIndexChanged» происходящего каждый раз при выборе элемента из выпадающего списка компонента. Добавьте приведенный ниже код вызова метода, реализующего загрузку таблицы по номеру выделенного элемента в компоненте «comboBox1». В данном коде методу «LoadData», в качестве параметра передается свойство «SelectedIndex» содержащее номер выбранного элемента из списка, так как нумерация элементов списка начинается с нуля, а таблицы нумеруются с единицы, к данному числу прибавляется 1.
LoadData(comboBox1.SelectedIndex + 1);
Добавьте приведенный ниже листинг загрузки выбранной таблицы в листинг главной формы.
WordObj.Application application;
WordObj.Document document;
public void LoadData(int TableNum)
{
    WordObj.Table table = document.Tables[TableNum];
    if (table.Rows.Count > 0 && table.Columns.Count > 0)
    {
        List headers = new List();
        DataTable dataTable = new DataTable();
        for (int i = 0; i < table.Columns.Count; i++)
        {
            dataTable.Columns.Add();
            headers.Add(table.Cell(1, i + 1).Range.Text.Trim('\a', '\r', '\n', '\t'));
        }
        for (int i = 0; i < table.Rows.Count - 1; i++)
        {
            string[] row = new string[table.Columns.Count];
            for (int j = 0; j < table.Columns.Count; j++)
                row[j] = table.Cell(i + 2, j + 1).Range.Text.Trim('\a', '\r', '\n', '\t');
            dataTable.Rows.Add(row);
        }
        dataGridView1.DataSource = dataTable;
        for (int i = 0; i < headers.Count; i++)
            dataGridView1.Columns[i].HeaderText = headers[i];
    }
}
      В методе «button1_Click», события «Click», компонента «Button1» замените существующий листинг, на приведенный ниже. Данный код реализует предварительную очистку списка таблиц, открытие документа, по количеству таблиц находящихся в документе заполняется элемент управления «comboBox1» и выбирается первый.
comboBox1.Items.Clear();
OpenFileDialog dialog = new OpenFileDialog();
dialog.Filter = "MS Word 2003 (*.doc)|*.doc|MS Word 2007 (*.docx)|*.docx";
dialog.Title = "Выберите документ для загрузки данных";
if (dialog.ShowDialog() == System.Windows.Forms.DialogResult.OK)
{
    textBox1.Text = dialog.FileName;
    application = new WordObj.Application();
    Object FileName = dialog.FileName;
    application.Documents.Open(ref FileName);
    document = application.ActiveDocument;
    for (int i=1; i <= document.Tables.Count; i++)
    {
        comboBox1.Items.Add("Таблица №"+i);
    }
    comboBox1.SelectedIndex = 0;
    LoadData(comboBox1.SelectedIndex + 1);                
}
      По завершению работы с документом его необходимо закрыть, перейдите в конструктор главной формы, выполнив сочетание клавиш «Shift+F7». Сделайте клик правой клавишей мыши по свободному пространству главной формы и выберете из открывшегося контекстного меню, пункт «Свойства». В верхней части окна свойств расположена кнопка с рисунком молнии, нажав на нее, вы перейдете в события главной формы. Найдите событие «FormClosed» и сделайте по нему двойной клик левой клавишей мыши.
      Вы перейдете в автоматически созданный метод «Form1_FormClosed», который будет выполняться при закрытии вашего приложения. Добавьте в него приведенный ниже код.
application.Quit();
      Запустите ваш проект, выберете документ, содержащий более одной таблицы. В выпадающем списке вы увидите номера таблиц доступные для выбора. Сделав клик по любой из них, данные автоматически будут загружены.

Ссылка для скачивания примера: Яндекс.Диск


Комментариев нет:

Отправить комментарий

Большая просьба, не писать в комментариях всякую ерунду не по теме!