В данной инструкции рассмотрен пример получения данных из таблиц, содержащихся в файле Microsoft Word. Для реализации данной задачи используется объектная библиотека «Microsoft Word 14.0 Object Library».
Создайте проект Windows Form в Microsoft Visual Studio, для этого запустите среду разработки и перейдите в меню Файл->Создать...->Проект. Выберете версию .Net Fraemwork и введите имя проекта. После создания проекта, добавьте на форму три компонента:
Установите следующие параметры в свойствах компонента:
У вас откроется окно «Менеджер ссылок – (имя вашего проекта)», в левой части данного окна вам будет предложено выбрать одну из категорий. Visual Studio предоставляет четыре группы для выбора.
После добавления библиотеки, у вас появится три новых пункта в обозревателе решений:
using WordObj = Microsoft.Office.Interop.Word; - создается псевдоним пространства имен «Microsoft.Office.Interop.Word».
В данном примере для открытия файла используется класс «OpenFileDialog», реализующий открытие окна для выбора файла по заданному фильтру «MS Word 2003 (*.doc)|*.doc|MS Word 2007 (*.docx)|*.docx». Данный фильтр так же реализует защиту от выбора файла не относящегося к Word.
Сделайте двойной клик по компоненту «button1», вы перейдете в автоматически созданный метод «button1_Click», события компонента «Click». Добавьте приведенный ниже листинг кода в тело данного метода.
В случае если открываемый вами файл занят другим процессом или открыт другим пользователем, Microsoft Word выдаст вам предупреждение «Файл уже используется» и предложит несколько вариантов действий. Выберете первый вариант «Открыть только для чтения» – документ откроется на несколько секунд для загрузки данных и закроется.
Вы можете усложнить проект и добавить элемент управления «ComboBox», в котором будет предлагаться выбрать номер таблицы и посмотреть хранящиеся в ней данные. Для этого перейдите в «Панель элементов» и добавьте элемент управления «ComboBox» на главную форму проекта. У вас получится приведенный ниже вариант.
Сделайте двойной клик по добавленному компоненту, вы перейдете в автоматически созданный метод «comboBox1_SelectedIndexChanged», события «SelectedIndexChanged» происходящего каждый раз при выборе элемента из выпадающего списка компонента. Добавьте приведенный ниже код вызова метода, реализующего загрузку таблицы по номеру выделенного элемента в компоненте «comboBox1». В данном коде методу «LoadData», в качестве параметра передается свойство «SelectedIndex» содержащее номер выбранного элемента из списка, так как нумерация элементов списка начинается с нуля, а таблицы нумеруются с единицы, к данному числу прибавляется 1.
Вы перейдете в автоматически созданный метод «Form1_FormClosed», который будет выполняться при закрытии вашего приложения. Добавьте в него приведенный ниже код.
Создайте проект Windows Form в Microsoft Visual Studio, для этого запустите среду разработки и перейдите в меню Файл->Создать...->Проект. Выберете версию .Net Fraemwork и введите имя проекта. После создания проекта, добавьте на форму три компонента:
- textBox1 - в данном компоненте будет выводится путь, имя и расширение выбранного файла;
- button1 – кнопка для запуска процесса получения данных из выбранного файла;
- dataGridView1 – элемент управления необходимый для отображения полученных данных.
Установите следующие параметры в свойствах компонента:
- Dock – None – свойство задает границы элемента управления, прикрепленные к его родительскому элементу управления и определяет способ изменения его размеров относительно родительского элемента управления (http://microsoft.com)
- Anchor - Top, Bottom, Left, Right - свойство задает границы контейнера, с которым связан элемент управления, и определяет способ изменения его при изменении размеров его родительского элемента (http://microsoft.com).
У вас откроется окно «Менеджер ссылок – (имя вашего проекта)», в левой части данного окна вам будет предложено выбрать одну из категорий. Visual Studio предоставляет четыре группы для выбора.
- Сборки — список всех компонентов платформы .NET Framework, ссылки на которые можно добавить.
- Решение — список всех повторно используемых компонентов, созданных в локальных проектах.
- COM — список всех COM-компонентов, ссылки на которые можно добавить.
- Обзор — позволяет осуществлять поиск компонента в файловой системе.
После добавления библиотеки, у вас появится три новых пункта в обозревателе решений:
- Microsoft.Office.Core;
- Microsoft.Office.Interop.Word;
- VBIDE.
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Запустите проект, нажав на клавиатуре клавишу «F5». Нажмите на кнопку «Открыть», расположенную на форме. В открывшемся диалоговом окне выберете файл Microsoft Word содержащий табличные данные и нажмите кнопку «Открыть», расположенную в нижней части окна. Если в файле содержались таблицы, то первая из них расположенная ближе к началу документа будет загружена.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(); }
В случае если открываемый вами файл занят другим процессом или открыт другим пользователем, 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В методе «button1_Click», события «Click», компонента «Button1» замените существующий листинг, на приведенный ниже. Данный код реализует предварительную очистку списка таблиц, открытие документа, по количеству таблиц находящихся в документе заполняется элемент управления «comboBox1» и выбирается первый.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]; } }
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();Запустите ваш проект, выберете документ, содержащий более одной таблицы. В выпадающем списке вы увидите номера таблиц доступные для выбора. Сделав клик по любой из них, данные автоматически будут загружены.
Ссылка для скачивания примера: Яндекс.Диск
Комментариев нет:
Отправить комментарий
Большая просьба, не писать в комментариях всякую ерунду не по теме!