C# автоматизация работы с файлами


Содержание

О программировании и всём, всём, всём

воскресенье, 26 сентября 2010 г.

Работа с Excel из C# (забираем из Excel данные)

Итак, начался новый учебный год (с чем кстати всех и поздравляю), появились новые курсы, новые проекты, поэтому продолжу излагать некторые, на мой взгляд интересные, вещи.

Сегодня я хотел бы поговорить о работе с Excel из C#.
Пара коментариев:
1. Я использую VS 2010 и Excel 2007.
2. Как я уже сказал, мне работа с Excel понадобилась в одном из проектов, поэтому примеры будут из этого проекта.

1. Для начала работы с Excel-ем, необходимо добавить ссылку на сборку Microsoft Excel 12.0 Object Library.
2. Подключаем с псевдонимом пространство имен:
using Excel = Microsoft.Office.Interop.Excel;
3. Загружаем в память новый экземпляр приложения:
4. Открываем ранее существующий документ:
excelApp.Workbooks.Open(_sourceFile.FullName);
А вот здесь, как уже увидили те кто раньше работали с Excel, радостная новость! Теперь c# поддерживает параметры по умолчанию! И никаких больше «миссинг валуе».
5. Свойство Workbooks, как это не странно, содержит открытые книги. Почитаем с первой страницы, первой открытой книги, строчки в список (да, я имею в виду именно первой, а не нулевой! Пользуясь случаем, передаю пламенный привет раработчикам Visual Basic, начинающих нуманацию элементов массива с 1).
Вот таким нехитрым способом, мы отмапили из экселевского файла ячеки в двухмерный список, с которым дальше можно и работать, не прибегая, к всяким жутким ухищрениям.
Да, чуть не забыл, проверка в while, проверяет есть ли хоть что-то в первом столбце в текущей строке, если есть, то добро пожаловать в мапинг. если нет, то файл кончился (ну у меня просто файл такой, у вас может быть другое условие разбора. Например, нужно перетащить наперед заданное число строк, или как нибудь еще).
6. Закрываем Excel

На этом вроде бы и все, но как говорится: Следите за рекламой! В следующей части покажу как генерировать сложную таблицу (объединение ячеек и все такое) с нуля.

З.ы. Спасибо, одному моему коллеге, который напомнил, что надо писать в блог, а то что-то за лето, я действительно, расслабился.

Эффективные способы работы с Excel

Работаю в консольных приложениях. у меня стоит Windows 10 и VS последняя актуальная версия. Кое как, методом тыка и вдумчивого поиска, разобрался с элементарными задачами: прочитать данные в такой-то ячейке, записать данные в такую-то ячейку, и создать новую книгу.
Использовал при этом:

Для меня большая проблема состоит в том, что я не вижу документации для работы с этой библиотекой. Если вы считаете, что есть более эффективные способы работы с Excel через C#, то просветите меня. Буду рад, если вы понятно для меня изложите.

3 ответа 3

Во-первых вам следует определиться, какой вам формат нужен: .xls или .xlsx . Они совершенно разные: xls — бинарный, а xlsx — это zip-архив XML файлов. Также, возможно, вам может подойти ods файл, который тоже представляет собой zip-архив XML файлов, но об этом ниже.

Office COM Interop

То о чём вы ведёте речь называется Office Interop. Иногда ещё к этому названию добавляют COM. Я сильно рекомендую его не использовать. Разве что только вы генерируете небольшие файлы на компьютере для себя. Почему?

Много утечек памяти. Ни в коем случае не используйте эту библиотеку для веб-сайтов или приложений, где на сервере генерируются файлы Office-форматов. У вас кончится оперативная память довольно быстро и сайт или приложение упадёт.

Microsoft does not currently recommend, and does not support, Automation of Microsoft Office applications from any unattended, non-interactive client application or component (including ASP, ASP.NET, DCOM, and NT Services), because Office may exhibit unstable behavior and/or deadlock when Office is run in this environment.

Что в вольном переводе значит:

Корпорация Майкрософт не рекомендует и не поддерживает, автоматизации приложений Microsoft Office с помощью автоматических, не-интерактивных клиентских приложений или компонентов (включая ASP, ASP.NET, DCOM и службы NT), потому что офис может показывать нестабильное поведение и/или взаимоблокировку (deadlock), когда офис работает в этой среде.

Требует наличия офиса определённой версии. На каждую машину, где будет работать ваше приложение.

Рассмотрю xlsx файлы. Вроде уже прошло время, когда ещё надо поддерживать Office 2003 и ниже.

Путаница с названием форматов

Некорректно называть этот формат Excel. Excel — это одна из программ пакета Microsoft Office. (Также некорректно называть docx -файл Word ). Называть формат xlsx Excel — приблизительно то же самое, что называть формат HTML — Internet Explorer.

Office Open XML

Что следует из того, что это zip-архив XML файлов? Что это значит?

Это значит, что вы можете взять любой Open XML формат (все которые оканчиваются на x : docx , xlsx , pptx и т.д.), переименовать расширение на zip, открыть его. Затем можно посмотреть все нужные XML-файлы и можно даже попробовать их редактировать. (То же самое справедливо и для ods , но это OpenDocument -формат, а не Open XML !).

Стандарт Open XML

xlsx -файлы безусловно связаны с реализацией Microsoft. OpenXML форматы (все которые оканчиваются на x : docx , xlsx , pptx и т.д.) стали выходить после пакета офиса 2007 года. Microsoft опубликовало спецификацию в 2006 году, затем выпустило офис. А зачем Microsoft выпустило спецификацию? Для того, чтобы её реализовать мог кто угодно.

Трудности в работе с Open XML

Важное обновление. Все нижеописанные трудности крайне успешно решаются с помощью бесплатного инструмента от Microsoft под названием OpenXML SDK Productivity Tool. Он позволяет

  • генерировать код для создания документа,
  • генерировать код превращения одного документа в другой,
  • валидировать документы с ошибками и показывать какие именно ошибки он содержит.

Дело в том, что стандарт Open XML мягко говоря, громоздкий (занимает 6546 страниц), поэтому его просто не осилишь просто чтением стандарта.

И с ним работать довольно тяжело. У вас есть объектная обёртка над различными тэгами XML. НО:

При разработке ничто не подсказывает что и куда должно быть вложено. Вам приходится находить рабочие примеры и делать из них «винигрет» того, что работает.

Основная трудность помимо того, что нет никакой подсказки до компиляции что с ним делать, что нет и никаких исключений и ошибок, если вы сгенерировали невалидную XML-структуру.

Всё сильно усугляется тем, что офис просто не откроет ваш документ. Точнее откроет и выдаст «The file is corrupt and cannot be opened». То есть одна ошибка (вложили не тот элемент или чего-то не вложили) и даже гигантский документ не открывается.

Вам приходится вникать в низкоуровневые детали того, как устроено хранение данных. То есть сама разработка сильно усложняется тем, что вам приходится писать код для казалось бы простых вещей. К примеру:

Здесь вы узнаете, что строковые значения ради производительности хранятся в специальной таблице ( SharedStringTable ) и при добавлении и новой строки добавляется всего лишь порядкой номер в этой таблице (к примеру в ячейке будет хранится 1 ). То есть если вам надо добавить строковое значение в ячейку вам надо будет посмотреть в таблицу SharedStringTable есть ли там такая строка, и если нет — то создать запись в этой таблице, и вернуть новое число, если да — то взять порядковый номер.

Для того, чтобы даты просто добавить ячейку как дату, надо помнить что они хранятся как числа (OLE Date), но весь курьёз заключается в том, что есть тип CellValues.Date , который не работает. Далее надо будет добавить несколько секций стилей и тогда всё заработает. Пример. Если вам ещё важен формат дат, то это тоже потребует времени разобраться, как именно хранятся форматы данных.

Если вам надо будет просто удалить строку (row) или столбец (column), то придётся все значения (ниже или правее) переносить вручную.

Библиотеки, основанные на Open XML

В общем, если обернуть всё методами и потратить где-то 1-3 рабочих дня, то в целом можно и так работать. Чтобы избежать этих сложный вещей используйте уже готовые библиотеки, основанные на Open XML:

Open Document Format

Помимо xls и xlsx существует также формат ods , который первоначально поддерживался в OpenOffice и затем LibreOffice. Cейчас форматы Open Document уже поддерживаются и Microsoft Office. Для этого работы с форматами Open Document существует библиотека AODL, для которой есть Nuget-пакет и примеры.

Работа с файлами в C#

Всем доброго времени суток. На связи Алексей Гулынин. В прошлой статье вы узнали немного о том, что такое модульное тестирование в Visual Studio. В данной статье я бы хотел рассказать о работе с файлами на C#. Всю работу с файлами можно разделить на 2 группы: 1) это работа с файлами, как с элементами файловой системы, например, найти файл, получить список файлов в директории, узнать дату изменения файла, различные его атрибуты, расширение, скопировать или удалить файл, создать новый. 2) это работа с содержимым файла: прочитать файл или записать в него что-нибудь.

Для выполнения всех этих операций существует несколько классов, расположенных в пространстве имён «System.IO».

Существует 2 класса File и FileInfo, которые предназначены для работы с файлом, как с частью файловой системы. Здесь также есть несколько методов, которые позволяют работать с содержимым файла целиком. В простых случаях (когда размеры файла небольшие, скажем до 1МБ) файл можно полностью прочитать и сохранить в память.

Некоторые методы по работе с файлами:
  • ReadAllText() . Самая простая операция — это прочитать файл целиком. Данный метод является статическим. Здесь в качестве параметра можно указать полный путь к файлу. Когда указываем путь к файлу, не забываем экранировать символ «\».
  • ReadAllLines() . Этот статический метод возвращает массив строк, т.е. читает файл построчно.
  • WriteAllText() . Здесь в качестве параметра передаём строку, и эта строка целиком добавляется в файл с перезаписью содержимого файла.
  • AppendAllText() . Здесь содержимое добавляется поверх существующего файла, без его перезаписи.

Ниже приведен пример на эти методы. Для начала подготовим тестовый файл, который заполним названиями городов (Москва, Питер, Казань, Уфа, Стерлитамак). Имя каждого города находится на новой строке. Файл назовем «cities.txt» и расположим его в корне какого-нибудь диска (в моём случае — это диск «E»):

То, что можно сделать с помощью класса «File», можно сделать и с помощью класса «FileInfo», и наоборот. Почему же их два? Методы класса «File» — статические, а методы класса «FileInfo» являются методами объекта. При работе с методами класса «File» первым параметром всегда указывается путь до файла. В случае «FileInfo» — это имя указывается один раз в конструкторе при создании объекта. Если нужно выполнить разовую операцию, то лучше использовать класс «File». В случае работы со многими файлами лучше использовать «FileInfo».

Реализуем следующий алгоритм: необходимо вывести все файлы, даты изменения которых старше введенной пользователем даты. Будем рассматривать папку «C:\Windows\System32». В ней много файлов. Тут нам потребуется получить все файлы этой директории. Забегая вперед скажу, что это можно сделать с помощью метода «GetFiles()» класса «DirectoryInfo».

Протестируйте работу данного скрипта.

Напишем ещё несколько примеров на работу с файлами:

  • Copy — копирование файла.
  • Delete — удаление файла.
  • Exists — проверка существования файла.

В качестве домашнего задания: переделайте последний пример только с использованием класса «FileInfo».

В данной статье вы узнали, как работать с файлами в C#.

На связи был Алексей Гулынин, оставляйте свои комментарии, увидимся в следующих статьях.

Из опыта автоматизации Word на языке C# на примере создания оглавления Текст научной статьи по специальности « Автоматика. Вычислительная техника»

Аннотация научной статьи по автоматике и вычислительной технике, автор научной работы — Вильданов А.Н.

Описан алгоритм создания содержания документа в формате MS Word на языке C# в среде Microsoft Visual Studio 2010 Express (на примере сборника трудов конференции). Программно встраиваемое содержание имеет возможность автоматического обновления нумерации страниц. Исследованы возможности C# по форматированию текста вордовского документа, сохранению в формат PDF и т. п. Приведены основные команды по работе с документом Word на языке C#. Разработанное в статье приложение показывает, что с помощью C# можно достаточно эффективно решать широкий круг задач, связанных с автоматизацией рутинных действий с документами Microsoft Word . Рассмотренные в статье приемы и методы могут оказаться полезными при разработке подобных десктопных приложений. Ключевые слова : Microsoft Word , COM , C#, Microsoft Visual Studio 2010 Express .

Похожие темы научных работ по автоматике и вычислительной технике , автор научной работы — Вильданов А.Н.,

From experience of Word automation in C# language on the example of creation of contents

Describes the algorithm for creating the contents of a document in MS Word format in C# language in Microsoft Visual Studio 2010 Express environment (using the collection of conference proceedings as an example). Programmatically embeddable content has the ability to automatically update page numbering. The possibilities of C# for formatting the text of the Word document, saving in PDF format, etc. are explored. The main commands for working with the Word document in C# are given. The application developed in the article shows that using C# can solve quite effectively a w >Microsoft Word documents. The techniques and methods discussed in this article can be useful in the development of such desktop applications.

Текст научной работы на тему «Из опыта автоматизации Word на языке C# на примере создания оглавления»

Cloud of Science. 2020. T. 5. № 1 http:/ / cloudofscience.ru

Из опыта автоматизации Word на языке C# на примере создания оглавления

Нефтекамский филиал Башкирский государственный университет 452681, Нефтекамск, ул. Трактовая, 1

Аннотация. Описан алгоритм создания содержания документа в формате MS Word на языке C# в среде Microsoft Visual Studio 2010 Express (на примере сборника трудов конференции). Программно встраиваемое содержание имеет возможность автоматического обновления нумерации страниц. Исследованы возможности C# по форматированию текста вор-довского документа, сохранению в формат PDF и т. п. Приведены основные команды по работе с документом Word на языке C#. Разработанное в статье приложение показывает, что с помощью C# можно достаточно эффективно решать широкий круг задач, связанных с автоматизацией рутинных действий с документами Microsoft Word. Рассмотренные в статье приемы и методы могут оказаться полезными при разработке подобных десктопных приложений.

Ключевые слова: Microsoft Word, COM, C#, Microsoft Visual Studio 2010 Express.

1. Постановка задачи

Как известно, Microsoft Word является COM-объектом [1], т. е. спроектирован таким образом, что позволяет другим программам подключаться к себе и управлять им. Программно можно проделать практически все операции, которые мы делаем вручную в Word: создать новый документ, внести в него правки, сохранить его и т. п. Для такой автоматизации действий можно, например, подключиться к MS Word с помощью таких языков программирования высокого уровня, как Delphi, C++, C# и т. д. Можно, конечно, и просто создать макрос прямо внутри документа на языке Visual Basic for Applications. Как делать — дело вкуса, привычки и квалификации программиста.

В данной работе выбор пал на язык C#, который позволяет достаточно быстро создать прототип приложения для Windows. Имеется в виду, что язык C# сразу (без дополнительных библиотек) содержит готовые классы и методы, отвечающие за решения многих современных актуальных задач для десктопных приложений в ОС семейства Windows.

В качестве среды программирования в работе выбрана среда Microsoft Visual Studio 2010 Express. Несмотря на год выпуска, набор средств для создания приложений в нем весьма внушителен, имеется большой плюс — бесплатность.

Одной из распространенных задач при работе с документами является создание содержания. Понятно, что для достаточно больших документов ручная работа по его созданию становится тяжелой. Word имеет достаточно много средств и настроек для создания автоматического содержания (например, в Microsoft Word 2010 это подменю «Ссылки» ^ «Оглавление»). Но в некоторых случаях этот способ не подходит. Представим себе, например, сборник трудов конференции. Тогда заголовок и авторы могут находиться на разных строках (рис. 1):

ОСОБЕННОСТИ II ПРЕИМУЩЕСТВА ИСПОЛЬЗОВАНИЯ ДИАЛОГОВЫХ ПОЛЬЗОВАТЕЛЬСКИХ ИНТЕРФЕЙСОВ

ФГБ ОУ В О «Ба шкирский го суд арсгв енны й у нивер ситег»

ФГБ ОУ В О «Ба шкирский го суд арств енны й у нив ер сигег» Аннотация: в статье рассматриваются особенности взаимодействия Рисунок 1. Пример заголовка статьи конференции

2. Предлагаемый алгоритм решения

Как можно решить задачу составления содержания в таком случае? Желательно, чтобы нумерация страниц в содержании могла автоматически обновляться при внесении изменений в документ. В данной статье предлагается следующий способ. Нужно разметить в документе те элементы, которые мы собираемся разместить в содержании, определенными стилями. После пройтись по всему документу и сохранить в специальном массиве все встреченные элементы с созданными стилями.

Например, создадим и отформатируем стиль для заголовков статьи. Дадим ему, например, название «header_article». Для упрощения программирования стили будем присваивать не отдельным словам и предложениям, а целым абзацам. При нашем подходе он не обязательно должен иметь стиль заголовка, а может быть создан на основе стиля обычного абзаца.

Для авторов придумаем стиль «author». В сборник конференций в содержание могут входить и названия секций. Поэтому предусмотрим стиль «section_name». Таким образом пробежимся по всему документу и обработаем все статьи (рис. 2.).

1Г АаБбВ author А4ББ1 header_art. ААББ sectionji. ДаБбВвГг, ИОбычный ДаБбВвГг, АаБбВ АаБбВ в: И Без инте. Заголово. Заголово. Ааь Название

2 ] 4 5 i 3 L0 11 12 1] 14 15 1£ Д

ОСОБЕННОСТИ И ПРЕ11МУ ШЕСТВДИСПО ЛЬЗ ОВАНИЯ ДИАЛОГОВЫХ ПОЛЬЗОВАТЕЛЬСКИХ ШГГЕЕфЕЙСОВ

д.ф.-м.н.. профессор. ФГБОУ ВО «Башкирский государственный университет»

Петров ПИ. к.ф.-м.н.. доцент.

ФГБОУ ВО «Башкирский государственный университет»

Рисунок 2. Присвоение стилей

Каким теперь будет алгоритм для составления содержания? Сначала нужно организовать цикл по всем абзацам документа, в котором:

— считываются текст и стиль абзаца;

— для абзацев с заголовком статьи, со стилем «header_article», создаются закладки с названием вида «bookMarkParagN», где N — номер абзаца (можно, конечно, называть и по-другому);

— авторы статьи и название (заголовок) статьи сохраняются в массиве SelParagraphs.

Обежав весь документ, мы получим массив с данными о названиях всех статей и об их авторах. По этому массиву уже можно построить содержание, например, в виде таблицы из двух столбцов. В первом столбце размещаются авторы статьи и название статьи. Во втором столбце создаются перекрестные ссылки на номера страниц закладок.


3. Программная реализация

Итак, создадим в среде Microsoft Visual Studio 2010 Express новое приложение Windows Forms. Чтобы в нашем приложении были доступны классы Microsoft Word, нужно добавить ссылку на соответствующую библиотеку. Выбираем в меню «Проект» ^ «Добавить ссылку», открываем вкладку COM, выбираем Microsoft

Word 14.0 Object Library (рис. 3). Цифра зависит от версии установленного MS Word.

[Щ Добавить ссылку

■MET» I СОМ I Проекты | Обзор Последние файлы]

M Mn KownoHËHTa Версия 6_ Путь ‘

Microsoft Windows Common Controls 5.0 (SP2] 1.3 С \Windows\SysWOW64\comctl32.ooi

Microsoft Windows Common Controls 6.0 (SP6J za С. \Window5\SysWOW64\MSCOMCTL.OCX

Microsoft Windows Common Controls-26.0 (S. га с \Wi п d owsVSysWOW64Vm scom ct2. oa

Microsoft Windows Image Acquisition Library v. 1.0 с \Windows\System32\wiaaut.dll

Microsoft Windows Installer Object Library 1.0 с \Windows\system32\m si. dll

Microsoft Windows Media Player Network Shar. 1.0 с ‘.Program Files (x86>\Windows Media Player\wmpnssci.dll

Microsoft WinHTTP Services, version 5.1 51 с \Windows\system32\winhttp.dll

Microsoft WMI Scripting VI.2 Library 1.2 с \Windows\system32\wbem\wbemdisp.7LB

1 Microsoft Word 14.0 Object Library aj с VProgram Files (x86J\Microsoft Office\Officel4\M SWORD,OLB

Microsoft WSMAN Automation VI.0 Library 1.0 с \Windows\SysWOW64\WsmAuto.dll

Microsoft XML, v3.0 3J> с. \Windows\System32\mc(mB.dll

Microsoft XML, v6.0 6Л с \Windows\3ystem32\msmil6.dll

Microsoft,TeamFoundation.Officelnteg ration. C. 17 a с ‘.Program Files\Common Files\Microsoft £hared\Team Foundatioi

Рисунок 3. Подключение библиотеки для работы с MS Word

Теперь нам доступны методы пространства имен Microsoft.Office.Interop.Word. Для упрощения обращений к нему создадим псевдоним для него: using Word = Microsoft.Office.Interop.Word;

Нам понадобятся две глобальные переменные для работы с Word [2]: Word._Application app; Word._Document doc;

Первая переменная представляет, собственно, само приложение MS Word, а вторая — наш вордовский документ.

Создадим класс contents для хранения информации об элементах будущего содержания:

public string authors=»»; public string article_name=»»;

public string bookMark=»»; >

Пункты authors и article_name хранят информацию об авторах статьи и название статьи. Поле bookMark будет хранить название закладки на заголовок статьи. Чтобы в полученном содержании иметь возможность автоматического обновления нумерации страниц, нужно будет создать перекрестные ссылки на созданные закладки.

Итак, сначала пробежимся по всем абзацам текста. Многие основные текстовые единицы в Word представляют собой коллекции [3] (объекты, напоминающие массивы, со встроенными методами и свойствами). Например, абзацы представляют собой коллекцию Paragraphs, закладки — коллекцию Bookmarks и т. д. [4]. Нужно иметь в виду, что нумерация в коллекциях начинается с единицы (в отличие, например, от массивов в Java, где первый элемент имеет номер ноль). Запускаем цикл:

Цукерберг рекомендует:  Бесплатка иконки на тему Пасхи

for (int i = 1; i i Не можете найти то, что вам нужно? Попробуйте сервис подбора литературы.

В первый столбец размещаем авторов и название статьи: myTable.Rows[i+1].Cells[1].Range.Text = authors + » » + article_name; Теперь во второй столбец нужно вставить перекрестную ссылку на страницу

заголовка статьи. Для этого имеется метод InsertCrossReference:

cellRange = myTable.Rows[i + 1].Cells[2].Range;

object InsertAsHyperlink = true;

Четыре параметра InsertCrossReference соответственно означают, что:

1) тип ссылки — перекрестная ссылка;

2) сведения, включаемые в перекрестную ссылку — это номер страницы;

3) далее идет название закладки;

4) является ли перекрестная ссылка гиперссылкой на соответствующий элемент — истина.

При таком добавлении наблюдается небольшой глюк — перекрестная ссылка почему-то добавляется не во второй столбец, а в начало первого столбца. Этот глюк лечится сворачиванием диапазона ячейки или уменьшением границы диапазона [6]: cellRange = myTable.Rows[i + 1].Cells[2].Range; cellRange.MoveEnd(Word.WdUnits.wdCharacter, -1);

Теперь гиперссылка попадает во второй столбец. При нажатии на номер страницы можно перейти на статью (рис. 4):

Иванов И.И., Петров П.П. ОСОБЕННОСТИ И ПРЕИМУЩЕСТВА ИСПОЛЬЗОВАНИЯ ДИАЛОГОВЫХ ПОЛЬЗОВАТЕЛЬСКИХ ИНТЕРФЕЙСОВ 29

Рисунок 4. Переход к статье по ссылке из содержания

В принципе, название статьи мы также могли оформить в виде гиперссылки, но это чревато проблемами: при обновлении содержания или сохранении в формате PDF слетает форматирование, и содержание документа принимает недооформлен-ный вид.

Потом можно выделить и отформатировать первый столбец таблицы: myTable.Columns[1].Select(); app.Selection.ParagraphFormat.Alignment =

Word.WdParagraphAlignment.wdAlignParagraphJustify; app.Selection.ParagraphFormat.FirstLineIndent = 0; app.Selection.Font.Name = «Times New Roman»; app.Selection.Font.Size = 14;

Названия методов выглядят громоздкими, но понятными. Сохраняем изменения в документе, закрываем документ, закрываем Word: app.ActiveDocument.Save(); doc.Close(); app.Quit();

bookMa rkP a ra g411

Нажмите CTRL и щелкните ссылку

4. Сохранение в PDF-формат

После публикации сборника часто требуется перевести весь сборник или отдельные страницы (постатейно) в PDF-формат. В C# есть готовый метод перевода документа целиком:

FileFormat: Word.WdSaveFormat.wdFormatPDF ); Чтобы перевести не все, а только указанные страницы в PDF-формат, есть метод ExportAsFixedFormat. Для сохранения всех статей сборника в PDF номера страниц можно взять из второго столбца нашего содержания: int from = Convert.ToInt32(

int to = Convert.ToInt32(

Название файла можно позаимствовать из первого столбца (авторы и название статьи).

String articleName = myTable.Rows[i].Cells[1].Range.Text; String pdfFileName = ‘^:\\Файлы\\» +

» » + articleName + «.pdf»; В цикле создаем PDF-файлы: doc.ExportAsFixedFormat( pdfFileName,

Третий параметр, равный false, означает, что после создания pdf-файл не нужно открывать. Последние два параметра отвечают за диапазон страниц.

Разработанное приложение доказывает, что с помощью C# можно достаточно эффективно решать широкий круг задач, связанных с автоматизацией рутинных действий с документами в Microsoft Word. Но есть и существенный недостаток — низкая скорость работы технологии COM. Для обработки сборника объемом около ста страниц уходит до пяти минут.

Существуют два решения по увеличению скорости обработки документов. Первый — отказаться от прямого перебора всех абзацев. Вместо этого искать нужные фрагменты соответствующих стилей с помощью встроенного в Range объекта Find. Правда, алгоритм при этом будет более сложным и запутанным.

Второй, кардинальный способ — отказаться от технологии COM, а работать непосредственно с файлом .docx как с архивом из файлов формата Office Open XML с помощью прямых методов доступа к текстовым файлам [7]. Скорость при этом будет значительно выше. Правда, нужно хорошо разбираться в этом формате, который является достаточно сложным.

[1] Вильданов А. Н. Разработка приложений в Delphi : учеб. пособие. — Уфа : РИЦ БашГУ, 2012.

[2] Профессиональная работа с текстом Word Expert. [Электронный ресурс]. URL: http://wordexpert.ru/forum/viewtopic.php? >

[3] Гильманов Р. Ф. Автоматизированное создание договоров из шаблонов программным путем на основе объектной модели word документа // Академическая публицистика. 2020. № 5. С. 15-20.

[4] Общие сведения об объектной модели Word. Microsoft.com. [Электронный ресурс]. URL: https://msdn.microsoft.com/ru-ru/library/kw65a0we.aspx

[5] Корняков В. Н. Программирование документов и приложений MS Office в Delphi. — СПб. : БХВ-Петербург, 2005.

[6] Writing programmatically lines of text in a Word cell. Stack Exchange Inc. [Электронный ресурс]. URL: https://stackoverflow.com/ques-tions/15166728/writing-programmatically-lines-of-text-in-a-word-cell

[7] Елманова Н. Коротко об OpenXML // КомпьютерПресс. 2007. № 7. С. 158-160. Автор:

Алмаз Нафкатович Вильданов — кандидат физико-математических наук, доцент кафедры математического моделирования и информационной безопасности, Нефтекамский филиал ФГБОУ ВО «Башкирский государственный университет»

From experience of Word automation in C# language on the example of creation of contents

Neftekamsk branch of Bashkir State University Traktovaya st., 1, Neftekamsk, Russia, 452681

Abstract. Describes the algorithm for creating the contents of a document in MS Word format in C# language in Microsoft Visual Studio 2010 Express environment (using the collection of conference proceedings as an example). Programmatically embeddable content has the ability to automatically update page numbering. The possibilities of C# for formatting the text of the Word document, saving in PDF format, etc. are explored. The main commands for working with the Word document in C# are given. The application developed in the article shows that using C# can solve quite effectively a wide range of tasks related to automation of routine actions with Microsoft Word documents. The techniques and methods discussed in this article can be useful in the development of such desktop applications..

Key words: Microsoft Word, COM, C#, Microsoft Visual Studio 2010 Express. References

[1] Vildanov A. N. (2012) Razrabotka prilozheniy v Delphi : uchebnoye posobiye. Ufa, RIZ BSU, 96 p. [In Rus].

[3] Gil’manov R. F. (2020) Nauchnyj ehlektronnyj zhurnal «Akademicheskaya publicistika», 5:15-20. [In Rus].

[5] Kornyakov V. N. (2005) Programmirovanie dokumentov i prilozhenij MS Office v Delphi. SPb, BHV-Peterburg. [In Rus].

[7] Elmanova N. (2007) Komp’yuterPress, 7:158-160. [In Rus].

Автоматизация приложений Microsoft Office в примерах

Настоящая статья посвящена теме, может быть, и не новой, но, как показывают письма читателей, по-прежнему актуальной — автоматизации приложений Microsoft Office. Многие разработчики в процессе работы над своими проектами (неважно, с помощью какого средства разработки — Delphi, C++Builder, Visual Basic…) нередко применяют сервисы, предоставляемые Microsoft Office, например построение сводных таблиц и диаграмм с помощью Microsoft Excel, генерацию и печать документов с помощью Microsoft Word и т.д. Нередко пользователи, привыкшие использовать приложения Microsoft Office в повседневной работе, сами настаивают на применении в приложениях таких сервисов либо просто на сохранении отчетов и других документов в одном из форматов Microsoft Office. Отметим, что потенциальные пожелания подобного рода компанией Microsoft учтены достаточно давно — практически все, что в состоянии сделать пользователь любого приложения Microsoft Office с помощью меню, клавиатуры и инструментальной панели, может быть произведено и автоматически, то есть либо из VBA-программы, либо из приложения, созданного с помощью одного из средств разработки. Иными словами, приложения Microsoft Office являются программируемыми. Программируемость в общем случае означает возможность управления данным приложением с помощью макроязыков либо с помощью других приложений. Все компоненты Microsoft Office поддерживают один и тот же макроязык: Visual Basic for Applications (VBA), позволяющий создавать приложения непосредственно внутри документов Office (это называется «решения на базе Microsoft Office»). Управление же компонентами Office из других приложений осуществляется с помощью автоматизации (Automation, ранее — OLE Automation) — все приложения Microsoft Office являются серверами автоматизации (или COM-серверами). Для создания таких приложений пригодны любые средства разработки, позволяющие создавать контроллеры автоматизации (COM-клиенты). Наиболее часто для этой цели используется Visual Basic, но это могут быть и Delphi, и C++Builder, и Visual C++. Однако прежде чем обсуждать возможности тех или иных средств разработки, следует разобраться, что такое автоматизация.

Коротко об автоматизации

Автоматизация — это одна из возможностей, предоставляемых технологией Microsoft COM (Component Object Model). Не вдаваясь в подробности реализации этой технологии, заметим, что она используется приложениями (называемыми COM-серверами) для предоставления доступа к их объектам, а также к свойствам и методам этих объектов другим приложениям (называемым COM-клиентами), каковыми могут быть и средства разработки. Например, текстовый процессор, будучи COM-сервером, может предоставлять другим приложениям доступ к документу, абзацу, закладке с помощью соответствующих объектов. Для именования (и опознания) COM-серверов обычно используются специальные строковые обозначения — программные идентификаторы (Programmatic Identifier, ProgID). Они нужны для того, чтобы операционная система могла с помощью этих идентификаторов определить, в каком именно каталоге (или на каком компьютере локальной сети, если используется тот или иной способ удаленного доступа к серверу) расположен исполняемый файл сервера автоматизации, и запустить его на выполнение. О том, какие именно программные идентификаторы применяются для того или иного приложения Microsoft Office, будет сказано в разделах, посвященных этим приложениям.

Объекты автоматизации с точки зрения программирования мало чем отличаются от обычных объектов, знакомых нам из теории и практики объектно-ориентированного программирования. Как и обычные объекты, они обладают свойствами и методами. Свойство — это характеристика объекта; например, свойством абзаца (объект Paragraph) может быть его стиль (Style). Методом называется действие, которое можно выполнить с объектом (например, можно сохранить документ с помощью метода SaveAs объекта Document).

Нередко серверы автоматизации содержат наборы однотипных объектов, называемых коллекциями. Например, текстовый процессор может содержать коллекцию документов, а каждый документ — коллекцию абзацев.

Как узнать, какие объекты доступны в серверах автоматизации? Для этой цели в комплект поставки любого сервера автоматизации входит документация и файлы справки, описывающие их объектную модель. Если брать приложения Microsoft Office 2000, то это справочные файлы для программистов на Visual Basic for Applications VBAxxx9.CHM (для Microsoft Office 97 — VBxxx8.HLP соответственно). Отметим, что по умолчанию они не устанавливаются, так как нужны разработчикам, а не рядовым пользователям.

Вся информация об объектах, необходимая контроллерам автоматизации, содержится в библиотеках типов. Библиотеки типов хранятся в специальном бинарном формате и обычно представлены в виде файлов с расширениями *.olb или *.tlb, а также могут содержаться внутри исполняемых файлов (*.exe) или динамически загружаемых библиотек (*.dll). Библиотеки типов можно просматривать с помощью утилиты OleView, входящей в состав Microsoft Platform SDK, а средства разработки фирмы Borland содержат свои собственные утилиты просмотра библиотек типов.

Заканчивая это более чем краткое введение в автоматизацию, остановимся также на понятии связывания. Связыванием называется способ, с помощью которого переменная или класс приложения-контроллера ссылается на объект автоматизации. Таких способов существуют два: позднее связывание и раннее связывание.

Позднее связывание означает, что реальная ссылка на объект в переменной или классе появляется на этапе выполнения приложения-контроллера. Этот способ обычно более медленный, чем ранее связывание, но он доступен во всех средствах разработки, позволяющих создавать контроллеры автоматизации, и менее чувствителен к тому, все ли параметры методов перечислены при их вызовах в коде приложения-контроллера. При позднем связывании корректность вызовов методов проверяется в момент их осуществления, то есть на этапе выполнения приложения, а не на этапе его компиляции.

Раннее связывание означает, что реальная ссылка на объект автоматизации появляется уже на этапе компиляции. Поэтому в коде приложения-контроллера требуется ссылка на библиотеку типов (или на специальный модуль, являющийся интерфейсом к ней), и это приводит к генерации в этом приложении классов с теми же свойствами и методами, что и у объектов автоматизации, что делает возможными синтаксическую проверку имен методов на этапе компиляции и доступ к именованным константам, содержащимся в библиотеке типов. Отметим, однако, что далеко не все средства разработки, поддерживающие позднее связывание, осуществляют также поддержку раннего связывания.

Закончив экскурс в COM и автоматизацию, вернемся к вопросу о том, какие средства разработки удобно применять для создания контроллеров автоматизации.

VBA и средства разработки контроллеров автоматизации

Как уже было сказано выше, контроллеры автоматизации можно создавать с помощью различных средств разработки, и если вы уже используете какое-либо из инструментальных средств, поддерживающих создание контролеров автоматизации, можно именно им и воспользоваться. Единственное, что следует сделать — это узнать, поддерживается ли вашим средством разработки ранее связывание, если вы планируете его использовать. Примеры простейших контроллеров автоматизации (как правило, для Microsoft Word или Microsoft Excel), дающие представление о том, как вызываются методы сервера, обычно можно найти в комплекте поставки большинства современных средств разработки.

Освоение объектной модели автоматизируемого сервера можно начать с записи необходимой последовательности действий в виде макроса с помощью VBА. Создать макрос можно, выбрав из меню приложения Microsoft Office пункт Tools | Macro |Record New Macro. Просмотр полученного макроса в редакторе кода VBA обычно позволяет понять, как должен выглядеть код, реализующий эту последовательность действий.

Обсудив возможные средства разработки контроллеров автоматизации, можно наконец перейти к самим приложениям Microsoft Office, к их объектным моделям и к их использованию. В качестве средства разработки для приведенных ниже примеров используется Borland Delphi 5, но поскольку в них приводится последовательность вызова свойств и методов объектов Microsoft Office, перенос кода на другие языки программирования не должен вызвать особых затруднений. Если специально не оговорено, в данной статье во всех примерах используется раннее связывание.

Объектные модели Microsoft Office

Как было сказано выше, приложения Microsoft Office предоставляют контроллерам автоматизации доступ к своей функциональности с помощью своей объектной модели, представляющей собой иерархию объектов. Объекты могут предоставлять доступ к другим объектам посредством коллекций.

В качестве иллюстрации того, как выглядит иерархия объектов Microsoft Office, приведем небольшой фрагмент объектной модели Microsoft Word (рис.1):

В объектных моделях всех приложений Microsoft Office всегда имеется самый главный объект, доступный приложению-контроллеру и представляющий само автоматизируемое приложение. Для всех приложений Microsoft Office он называется Application, и многие его свойства и методы для всех этих приложений также одинаковы. Наиболее часто мы будем использовать следующие из них:

  1. Свойство Visible (доступное для объекта Application всех приложений Microsoft Office) позволяет приложению появиться на экране и в панели задач; оно принимает значения True (пользовательский интерфейс приложения доступен) или False (пользовательский интерфейс приложения недоступен; это значение устанавливается по умолчанию). Если вам нужно сделать что-то с документом Office в фоновом режиме, не информируя об этом пользователя, можно не обращаться к этому свойству — в этом случае приложение можно будет найти только в списке процессов с помощью приложения Task Manager.
  2. Метод Quit закрывает приложение Office. В зависимости от того, какое приложение Office автоматизируется, он может иметь параметры или не иметь таковых.

Общие принципы создания контроллеров автоматизации

В общем случае контроллер автоматизации должен выполнять следующие действия:

  1. Проверить, запущена ли копия приложения-сервера.
  2. В зависимости от результатов проверки запустить копию автоматизируемого приложения Office либо подключиться к уже имеющейся копии.
  3. Сделать окно приложения-сервера видимым (в общем случае это не обязательно).
  4. Выполнить какие-то действия с приложением-сервером (например, создать или открыть документы, изменить их данные, сохранить документы и пр.)
  5. Закрыть приложение-сервер, если его копия была запущена данным контроллером, или отключиться от него, если контроллер подключился к уже имеющейся копии.


Соответствующий код для Delphi представлен в листинге 1.

Здесь мы воспользовались функциями GetActiveOleObject и CreateOleObject для подключения к уже запущенной копии приложения-сервера или запуска новой, если сервер не запущен, что приводит к тому, что в вариантную переменную помещается ссылка на объект Application соответствующего сервера.

Приведенная часть кода контроллера в других средствах разработки может выглядеть по-другому — она не имеет прямого отношения к методам объектов Office, так как обусловлена правилами вызова стандартных функций OLE в Delphi (за исключением вызовов методов Visible и Quit объекта Application). А вот все то, что должно быть вставлено вместо комментария «Здесь выполняются другие действия с объектами приложения Office», в разных средствах разработки должно выглядеть более или менее однотипно — используя созданную вариантную переменную, мы манипулируем методами и свойствами объекта Application.

В заключение сделаем одно маленькое замечание касательно числа параметров методов объектов автоматизации. В случае применения позднего связывания число указанных в коде параметров метода не обязано совпадать с их истинным числом (которое можно найти в описании объектной модели соответствующего приложения). В этом случае вполне допустимым является следующий код:

несмотря на то что метод Quit объекта Application в случае некоторых приложений Microsoft Office (например, Microsoft Word) имеет параметры.

При использовании же раннего связывания, например при создании контроллеров с помощью Delphi, следует более строго подходить к определению параметров — их число и тип должны соответствовать описанию методов в библиотеке типов. Например, в случае раннего связывания корректный код на Delphi для закрытия документа Word со значениями всех параметров по умолчанию будет иметь вид:

App.Quit(EmptyParam, EmptyParam, EmptyParam);

Исключением из этого правила является Visual Basic — это средство разработки позволяет не задумываться о числе параметров методов при написании кода.

Обсудив общие принципы создания контроллеров автоматизации и узнав, как это делается средствами Borland Delphi, мы можем перейти к рассмотрению автоматизации конкретных приложений Microsoft Office. Начнем с одного из самого популярных компонентов этого пакета — с Microsoft Word.

Автоматизация Microsoft Word

В данном разделе мы обсудим наиболее часто встречающиеся задачи, связанные с автоматизацией Microsoft Word. Но перед этим рассмотрим, каковы программные идентификаторы основных объектов Microsoft Word и что представляет собой его объектная модель.

Программные идентификаторы и объектная модель Microsoft Word

Для приложения-контроллера доступны непосредственно следующие объекты:

Комментарий

Application

Word.Application, Word.Application.9

С помощью этого программного идентификатора создается экземпляр Word без открытых документов

Document

Word.Document, Word.Document.9, Word.Template.8

С помощью этого программного идентификатора создается экземпляр Word с одним вновь созданным документом

Все остальные объекты Word являются так называемыми внутренними объектами. Это означает, что они не могут быть созданы сами по себе; так, объект Paragraph (абзац) не может быть создан отдельно от содержащего его документа.

Если вспомнить, что основное назначение Word — работа с документами, можно легко понять иерархию его объектной модели (фрагмент ее был показан на рис. 1). Основным объектом в ней, как иво всех других приложениях Microsoft Office, является объект Application, содержащий коллекцию Documents объектов типа Document. Каждый объект типа Document содержит коллекцию Paragraphs объектов типа Paragraph, Bookmarks типа Bookmark, Characters типа Character и т.д. Манипуляция документами, абзацами, символами, закладками реально осуществляется путем обращения к свойствам и методам этих объектов.

Ниже мы рассмотрим наиболее часто встречающиеся задачи, связанные с автоматизацией Microsoft Word. Если же вам встретилась задача, не совпадающая ни с одной из перечисленных, вы можете попытаться найти подходящий пример на Visual Basic в справочном файле VBAWRD9.CHM, либо, как уже было сказано выше, записать необходимую последовательность действий в виде макроса и проанализировать его код.

Создание и открытие документов Microsoft Word

Для создания примеров использования Microsoft Word можно использовать код создания контроллера, приведенный выше, и модифицировать его, заменяя комментарии кодом, манипулирующим свойствами и методами объекта Word.Application. Мы начнем с создания и открытия документов.

Создать новый документ Word можно, используя метод Add коллекции Documents объекта Application:

Как создать нестандартный документ? Очень просто — нужно указать имя шаблона в качестве параметра метода Add:

Для открытия уже существующего документа следует воспользоваться методом Open коллекции Documents:

Отметим, что свойство ActiveDocument объекта Word.Application указывает на текущий активный документ среди одного или нескольких открытых. Помимо этого к документу можно обращаться по его порядковому номеру с помощью метода Item; например ко второму открытому документу можно обратиться так:

Отметим, что нумерация членов коллекций в Microsoft Office начинается с единицы.

Сделать документ активным можно с помощью метода Activate:

Следующее, чему следует научиться — это сохранять документ Word и закрывать сам Word.

Сохранение, печать и закрытие документов Microsoft Word

Закрытие документа может быть осуществлено с помощью метода Close:

Метод Close имеет несколько необязательных (в случае позднего связывания) параметра, влияющих на правила сохранения документа. Первый из них влияет на то, сохраняются ли внесенные в документ изменения, и принимает три возможных значения (соответствующие константы рекомендуется описать в приложении. См. листинг 2):

Третий параметр принимает значения True или False и влияет на то, пересылать ли документ следующему пользователю по электронной почте. Если эта функциональность не применяется, можно проигнорировать этот параметр.

Таким образом, при использовании этих параметров закрыть документ можно, например, так:

Просто сохранить документ, не закрывая его, можно с помощью метода Save:

Этот метод также имеет несколько необязательных (в случае позднего связывания) параметров, первый из которых равен True, если документ сохраняется автоматически, и False, если нужно выводить диалоговую панель для получения подтверждения пользователя о сохранении изменений (если таковые были сделаны). Второй параметр влияет на формат сохраняемого документа, и список его возможных значений совпадает со списком значений второго параметра метода Close.

Напоминаем, что закрыть сам Word можно с помощью метода Quit объекта Word.Application. Этот метод имеет в общем случае три параметра, совпадающих с параметрами метода Close объекта Document.

Вывод документа на устройство печати можно осуществить с помощью метода PrintOut объекта Document, например:

Если нужно изменить параметры печати, следует указать значения соответствующих параметров метода PrintOut (в случае Microsoft Word их около двадцати).

Вставка текста и объектовв документ и форматирование текста

Для создания абзацев в документе можно использовать коллекцию Paragraphs объекта Document, представляющую набор абзацев данного документа. Добавить новый абзац можно с помощью метода Add этой коллекции:

Для вставки собственно текста в документ, тем не менее, применяется не объект Paragraph, а объект Range, представляющий любую непрерывную часть документа (в том числе и вновь созданный абзац). Этот объект может быть создан разными способами. Например, можно указать начальный и конечный символы диапазона (если таковые имеются в документе):

или указать номер абзаца (например, только что созданного):

или указать несколько абзацев, следующих подряд:

Вставить текст можно с помощью методов объекта Range InsertBefore (перед диапазоном) или InsertAfter (после диапазона), например:

Помимо объекта Range текст можно вставлять с помощью объекта Selection, являющийся свойством объекта Word.Application и представляющий собой выделенную часть документа (этот объект создается, если пользователь выделяет часть документа с помощью мыши, и может быть также создан с помощью приложения-контроллера). Сам объект Selection можно создать, применив метод Select к объекту Range, например:

В приведенном выше примере в текущем документе выделяется третий абзац.

Если мы хотим вставить строку текста в документ либо вместо выделенного фрагмента текста, либо перед ним, это можно сделать с помощью следующего фрагмента кода:

Отметим, что если свойство Options.ReplaceSelection объекта Word.Application равно True, выделенный текст будет заменен на новый текст (этот режим действует по умолчанию); если же нужно, чтобы текст был вставлен перед выделенным фрагментом, а не вместо него, следует установить это свойство равным False:

Символ конца абзаца при использовании объекта Selection может быть вставлен с помощью следующего фрагмента кода:

К объекту Selection, так же как и к объекту Range, можно применить методы InsertBefore и InsertAfter. В этом случае, в отличие от предыдущего, вставляемый текст станет частью выделенного фрагмента текста.

С помощью объекта Selection, используя его свойство Font и свойства объекта Font, такие как Bold, Italic, Size,…, можно отформатировать текст. Например, таким образом можно вставить строку, выделенную жирным шрифтом:

Для наложения на вставляемый текст определенного заранее стиля можно использовать свойство Style этого же объекта, например:

Нередко документы Word содержат данные других приложений. Простейший способ вставить такие данные в документ — использовать метод Paste объекта Range:

Естественно, в этом случае в буфере обмена уже должны содержаться вставляемые данные.

Если нужно поместить в буфер обмена часть документа Word, это можно сделать с помощью метода Copy объекта Range:

Следующее, чему нужно научиться — перемещению курсора в нужное место текста, чем мы и займемся в следующем разделе.

Перемещение курсора по тексту

Используя метод Collapse, можно «сжать» объект Range или объект Selection, сократив его размер до нуля символов:

Параметр этого метода указывает, в начале или в конце исходного фрагмента окажется новый объект Range или Selection. Если вы используете позднее связывание и ваше средство разработки — не Visual Basic, нужно определить в приложении соответствующие константы:

Перемещать курсор по тексту можно с помощью метода Move объектов Range и Selection. Этот метод имеет два параметра. Первый указывает на то, в каких единицах измеряется перемещение — в символах (по умолчанию), словах, предложениях, абзацах и др. Второй параметр указывает, на сколько единиц при этом нужно переместиться (это число может быть и отрицательным; по умолчанию оно равно 1). Например, следующий фрагмент кода:

приведет к перемещению курсора на один символ вперед, а

приведет к перемещению курсора на три абзаца вперед. Отметим, что этот метод использует следующие константы:

Нередко для перемещения по тексту используются закладки. Создать закладку в текущей позиции курсора можно путем добавления члена коллекции Bookmarks объекта Document c помощью метода Add, указав имя закладки в качестве параметра, например:

Проверить существование закладки в документе можно с помощью метода Exists, а переместиться на нее — с помощью метода Goto объектов Document, Range или Selection:

Значения констант для этого примера таковы:

Отметим, что с помощью метода Goto можно перемещаться не только на указанную закладку, но и на другие объекты (рисунки, грамматические ошибки и др.), и направление перемещения тоже может быть различным. Поэтому список констант, которые могут быть использованы в качестве параметров данного метода, довольно велик.

Создание таблиц

Создавать таблицы можно двумя способами. Первый заключается в вызове метода Add коллекции Tables объекта Document и последовательном заполнении ячеек данными. Этот способ при позднем связывании работает довольно медленно.

Второй способ, намного более «быстрый», заключается в создании текста из нескольких строк, содержащих подстроки с разделителями (в качестве разделителя можно использовать любой или почти любой символ, нужно только, чтобы он заведомо не встречался в данных, которые будут помещены в будущую таблицу), и последующей конвертации такого текста в таблицу с помощью метода ConvertToTable объекта Range. Ниже приведен пример создания таблицы из трех строк и трех столбцов этим способом (в качеcтве разделителя, являющегося первым параметром метода ConvertToTable, используется запятая):

Отметим, что внешний вид таблицы можно изменить с помощью свойства Format, а также с помощью свойств коллекции Columns, представляющей колонки таблицы, и коллекции Rows, представляющей строки таблицы объекта Table.

Обращение к свойствам документа

Свойства документа можно получить с помощью коллекции BuiltInDocumentProperties объекта Document, например:

Константы, необходимые для обращения к свойствам документа по имени, приведены в листинге 3.

Итак, в данном разделе мы изучили основные операции, которые наиболее часто применяются при автоматизации Microsoft Word. Естественно, возможности автоматизации Word далеко не исчерпываются приведенными примерами, однако я надеюсь, что, руководствуясь основными принципами создания контроллеров Word, изложенными в данной статье, и соответствующим справочным файлом, вы сможете ими воспользоваться — мы с вами уже убедились, что это вовсе не так сложно.

Следующим приложением Microsoft Office, автоматизацию которого мы рассмотрим, будет Microsoft Excel — второе по популярности приложение Microsoft Office.

Автоматизация Microsoft Excel

В данном разделе мы обсудим наиболее часто встречающиеся задачи, связанные с автоматизацией Microsoft Excel. Но перед этим рассмотрим, каковы программные идентификаторы основных объектов Microsoft Excel и что представляет собой его объектная модель.

Программные идентификаторы и объектная модель Microsoft Excel

Существует три типа объектов Excel, которые могут быть созданы непосредственно с помощью приложения-контроллера. Эти объекты и соответствующие им программные идентификаторы перечислены ниже.

Все остальные объекты Excel являются так называемыми внутренними объектами.

Небольшой фрагмент объектной модели Microsoft Excel изображен на рис.2:

Основным в объектной модели Excel является объект Application, содержащий коллекцию Workbooks объектов типа WorkBook. Каждый объект типа WorkBook содержит коллекцию WorkSheets-объектов типа WorkSheet, Charts типа Chart и др. Манипуляция рабочими книгами, их листами, ячейками, диаграммами реально осуществляется путем обращения к свойствам и методам этих объектов.

Ниже мы рассмотрим наиболее часто встречающиеся задачи, связанные с автоматизацией Microsoft Excel. Если вам встретилась задача, не совпадающая ни с одной из перечисленных, вы можете попытаться найти подходящий пример на Visual Basic в справочном файле VBAXL9.CHM, либо, как и в случае Microsoft Word, записать соответствующий макрос и проанализировать его код.

Запуск Microsoft Excel, создание и открытие рабочих книг

Для создания примеров использования Microsoft Excel можно использовать код создания контроллера, приведенный в разделе «Общие принципы создания контроллеров автоматизации», заменив первый оператор в приведенном примере на следующий:

и заменить комментарии кодом, манипулирующим свойствами и методами объекта Excel.Application. Отметим, однако, что подключение контроллера автоматизации к имеющейся версии Excel с помощью метода GetActiveOleObject может привести к тому, что вся клиентская часть Excel окажется невидимой (это происходит, если имеющаяся копия Excel запущена в режиме, когда ее пользовательский интерфейс недоступен). Причины подобного поведения автору неизвестны. Поэтому, если существует вероятность возникновения подобной ситуации, лучше упростить код создания контроллера и всегда создавать новую копию Excel.

Изучение создания контроллеров Excel мы начнем с создания и открытия рабочих книг.

Создать новую рабочую книгу Excel можно, используя метод Add коллекции Workbooks объекта Application:

Для создания рабочей книги на основе шаблона следует указать его имя в качестве первого параметра метода Add:

В качестве первого параметра этого метода можно также использовать следующие константы:

В этом случае рабочая книга будет содержать один лист типа, заданного указанной константой (график, обычный лист с данными и др.)

Для открытия уже существующего документа следует воспользоваться методом Open коллекции WorkBooks:

Отметим, что свойство ActiveWorkBook объекта Excel.Application указывает на текущую активную рабочую книгу среди одной или нескольких открытых. Помимо этого к рабочей книге можно обращаться по ее порядковому номеру, например ко второй открытой рабочей книге можно обратиться так:

Обратите внимание на то, что в Delphi при использовании позднего связывания синтаксис, используемый для обращения к членам коллекций объектов Excel, отличен от синтаксиса, используемого для обращения к объектам Word — в случае Word мы использовали метод Item, а в случае Excel мы обращаемся к членам коллекции как к элементам массива. Если же вы используете Visual Basic, синтаксис, применяемый для обращения к членам коллекций, будет одинаков для всех коллекций Microsoft Office.

Сделать рабочую книгу активной можно с помощью метода Activate:

Следующее, чему следует научиться — это сохранять рабочие книги в файлах.

Сохранение, печать и закрытие рабочих книг Microsoft Excel

Закрытие документа может быть осуществлено с помощью метода Close:


Метод Close имеет несколько необязательных (в случае позднего связывания) параметров, влияющих на правила сохранения рабочей книги. Первый из параметров принимает значения True или False и влияет на то, сохранять ли изменения, внесенные в рабочую книгу. Второй параметр (типа Variant) — имя файла, в котором нужно сохранить рабочую книгу (если в нее были внесены изменения). Третий параметр, также принимающий значения True или False, влияет на то, следует ли пересылать документ следующему пользователю по электронной почте, и может быть проигнорирован, если эта функциональность не используется.

Просто сохранить рабочую книгу, не закрывая ее, можно с помощью методов Save или SaveAs:

Метод SaveAs имеет более десятка параметров, влияющих на то, как именно сохраняется документ (под каким именем, с паролем или без него, какова кодовая страница для содержащегося в ней текста и др.).

Закрыть сам Excel можно с помощью метода Quit объекта Excel.Application. В случае Excel этот метод параметров не имеет.

Вывод документа Excel на устройство печати можно осуществить с помощью метода PrintOut объекта WorkBook, например:

Если нужно изменить параметры печати, следует указать значения соответствующих параметров метода PrintOut (в случае Excel их восемь).

Обращение к листам и ячейкам

Обращение к листам рабочей книги производится с помощью коллекции WorkSheets объекта WorkBook. Каждый член этой коллекции представляет собой объект WorkSheet. К члену этой коллекции можно обратиться по его порядковому номеру, например:

Приведенный выше пример иллюстрирует, как можно изменить имя листа рабочей книги.

К листу рабочей книги можно обратиться и по имени, например:

Обращение к отдельным ячейкам листа производится с помощью коллекции Cells объекта WorkSheet. Например, добавить данные в ячейку B1 можно следующим образом:

Здесь первая из координат ячейки указывает на номер строки, вторая — на номер столбца.

Добавление формул в ячейки производится аналогичным способом:

Очистить ячейку можно с помощью метода ClearContents.

Форматирование текста в ячейках производится с помощью свойств Font и Interior объекта Cell и их подсвойств. Например, следующий фрагмент кода выводит текст в ячейке красным жирным шрифтом Courier кегля 16 на желтом фоне:

Комментарий

Application

Excel.Application, Excel.Application.9

С помощью этого программного идентификатора создается экземпляр приложения без открытых рабочих книг

WorkBook

Excel.AddIn

С помощью этого программного идентификатора создается экземпляр расширения (add-in) Excel (имеющиеся расширения доступны с помощью пункта меню Tools | Add-Ins)

Excel.Chart, Excel.Chart.8

Рабочая книга, созданная с помощью этих программных идентификаторов, состоит из двух листов — одного для диаграммы, другого — для данных, на основе которых она построена

Excel.Sheet, Excel.Sheet.8

Рабочая книга, созданная с помощью этих программных идентификаторов, состоит из одного листа

Вместо свойства Color можно использовать свойство ColorIndex, принимающее значения от 1 до 56; таблицу соответствий значений этого свойства реальным цветам можно найти в справочном файле VBAXL9.CHM.

Обратиться к текущей ячейке можно с помощью свойства ActiveCell объекта Excel.Application, а узнать местоположение ячейки можно с помощью свойства Address объекта Cell, например:

Помимо обращения к отдельным ячейкам, можно манипулировать прямоугольными областями ячеек с помощью объекта Range, например:

Приведенный выше код приводит к заполнению прямоугольного участка текстом и к изменению цвета шрифта ячеек.

Объект Range также часто используется для копирования прямоугольных областей через буфер обмена. Ниже приведен пример, иллюстрирующий копирование такой области:

Обратите внимание на то, что диапазон, куда копируются данные, предварительно выделяется с помощью метода Select.

Отметим, что примерно таким же образом можно копировать данные и из других приложений (например, из Microsoft Word).

Довольно часто при автоматизации Excel используются его возможности, связанные с построением диаграмм. Ниже мы рассмотрим, как это сделать.

Создание диаграмм

Диаграммам Excel соответствует объект Chart, который может располагаться как на отдельном листе, так и на листе с данными. Если объект Chart располагается на листе с данными, ему соответствует член коллекции ChartObjects объекта WorkSheet и создание диаграммы нужно начать с добавления элемента в эту колекцию:

Параметрами этого метода являются координаты левого верхнего угла и размеры диаграммы в пунктах (1/72 дюйма).

Если же диаграмма располагается на отдельном листе (не предназначенном для хранения данных), то создание диаграммы нужно начать с добавления элемента в коллекцию Sheets объекта Application (которая отличается от коллекции WorkSheets тем, что содержит листы всех типов, а не только листы с данными):

В этом случае первый параметр метода Add указывает порядковый номер листа, перед которым нужно поместить данный лист (или данные листы, если их несколько), второй параметр — порядковый номер листа, после которого нужно поместить данный лист (используется обычно один из них), третий параметр — сколько нужно создать листов, а четвертый — какого типа должен быть лист. Значения четвертого параметра совпадают со значениями первого параметра метода Add коллекции WorkBooks объекта Application, и при использовании имен соответствующих констант следует определить их в приложении-контроллере.

Простейший способ создать диаграмму, с точки зрения пользователя, — создать ее с помощью соответствующего эксперта на основе прямоугольной области с данными. Точно так же можно создать диаграмму и с помощью контроллера автоматизации — для этой цели у объекта Chart, являющегося свойством объекта ChartObject (члена коллекции ChartObjects), имеется метод ChartWizard. Первым параметром этого метода является объект Range, содержащий диапазон ячеек для построения диаграммы, а вторым — числовой параметр, указывающий, какого типа должна быть эта диаграмма:

Возможные значения параметра, отвечающего за тип диаграммы, можно найти в справочном файле.

У объекта Chart имеется множество свойств, отвечающих за внешний вид диаграммы, с помощью которых можно изменить ее точно так же, как пользователи делают это вручную. Ниже приводится пример создания заголовка диаграммы и подписей вдоль ее осей (отметим, что оси есть не у всех типов диаграмм).

Еще один способ создания диаграммы — определить все ее параметры с помощью свойств объекта Chart, включая и определение серий, на основе которых она должна быть построена. Данные для серии обычно находится в объекте Range, содержащем строку или столбец данных, а добавление серии к диаграмме производится путем добавления члена к коллекции SeriesCollection, например:

В данном примере к диаграмме, созданной на отдельном листе, специально предназначенном для диаграмм, добавляется одна серия на основе диапазона ячеек другого листа.

Мы изучили основные операции, применяемые при автоматизации Microsoft Excel. Описания некоторых аналогичных операций для Microsoft Word, например обращение к свойствам документов, были здесь опущены во избежание повторов. Возможности автоматизации Microsoft Excel и Word далеко не исчерпываются приведенными примерами. Сведения о них можно всегда найти в соответствующем справочном файле.

В следующих статьях данного цикла будет рассмотрена автоматизация других приложений Microsoft Office — Microsoft PowerPoint, Microsoft Access, Microsoft Outlook и др.

Программное средство по автоматизации в сфере недвижимости на C#

Данный проект написан на C#, Visual Studio 2015. Тип базы данных MSSQL Server 2014.

Программное средство по автоматизации в сфере недвижимости

В архиве отсутствует пояснительная записка, только программа!

  • поиск квартир по критериям цена и/или город
  • просмотр снимков жилья
  • возможность выставлять свое жилье на продажу / а также закрыть заявку о продаже жилья
  • возможность удалять и редактировать предложения пользователей
  • регистрация в системе
  • возможность пожаловатья на предложение жилья
  • возможность увидеть предложения жилья с самым высоким рейтингом жалоб и удалить все выбранные

Присоединяйся

Зарегестрируйся с помощью социальных сетей.

Публикуй

Опиши работу, прикрепи файлы и назначь цену.

C#: автоматизация работы с файлами

Из таблицы видно, что для достижения требуемого вида числа необходимо будет после импорта текста изменить формат ячейки (числового формата в FieldInfo нет).

Для демонстрации некоторых возможностей функции, создадим в любом текстовом редакторе простой текстовый файл «a.txt», в котором столбцы разделены символом табуляции — Tab (Рис.3).

Рис.3 Текстовый файл для импорта

Выполним следующий код:

Результат выполнения фрагмента кода показан на Рис.4.

Рис.4. Импортированный текстовый файл

С этим примером можно поэкспериментировать, меняя системные установки и заданные в программе разделители и меняя формат ячеек с числовой информацией.

Параграф 5. Вывод информации в ячейки Excel

5.1. Вывод без форматирования

Для примеров данного параграфа будем использовать файл «C:\a.xls», созданный в предыдущем пункте.

Вывод информации может быть выполнен на конкретный лист рабочей книги Excel в конкретную ячейку, поэтому нам необходимо определить объекты лист, в коллекции листов и ячейку. В глобальной области определения переменных напишем:

Обратим внимание на разницу задания всех и рабочих листов книги.

Аналогичного определения для ячеек и ячейки мы задать не можем, так как отдельно данные объекты как самостоятельные в C# отсутствуют, а есть понятие области выделенных ячеек, которая может включать одну или более ячеек, с которыми можно выполнять действия. Поэтому для ячеек, с которыми выполняется действие, введем следующее определение:

Для выделения используется метод get_Range, который позволяет выделить группу ячеек через задание угловых ячеек диапазона, и есть возможность обратиться непосредственно к свойствам Rows и Cells — в любом случае выделенным будет диапазон ячеек.

Еще один способ определения выбранных ячеек — использование метода get_Offset(x,y) объекта Range, возвращающего объект Range, отстоящий от заданной ячейки на заданное количество строк и столбцов, считая от левого верхнего угла. Это позволяет работать с ячейками, позиция которых заданы относительно выбранной ячейки или группы ячеек.

Возможности объединения ячеек гораздо богаче — можно использовать объединения областей, группу областей, определение границ выделенных ячеек и.т.п., однако, для большинства практических задач вполне достаточно перечисленных выше методов.

Выделенные ячейки далее могут быть объединены и с ними действия могут выполняться как с одной ячейкой. Для этого используется метод Merge:

На данном этапе мы уже использовали основные объекты иерархической структуры объектов Excel. Следует также отметить и еще одну особенность группы свойств Excel.Application. Как только мы получили ссылку на конкретный объект (книгу, лист, группу ячеек, диаграмму) их можно сделать активными, применив к ним метод Activate(). С этого момента они доступны через соответствующие свойства ActiveWorkbook, ActiveSheet, ActiveChart, ActiveCell. Кроме того, при выполнении действий с конкретным объектом, он автоматически становится активным и, действия с ним могут далее выполняться с использованием перечисленных свойств.

Точно также можно использовать и свойство Excel.Application Selection. То есть, объект может быть определен как селектированный и, далее, для ссылки на объект использоваться свойство Selection.

В следующем примере объединяется группа ячеек в одну без ссылки на выделенный объект.

Хотя это и заманчиво, чтобы работать с текущим селективным выбором как средством изменения свойств и поведения объекта, но лучше, все-таки, избегать этого. Причина — селективный выбор может быть легко изменен и во время выполнения приложения, например, кликом мышки в пределах документа, что при большом объеме вывода на 100% приведет к ошибке.

Рассмотрим пример различных вариантов вывода в ячейки Excel, на различные страницы рабочей книги:

Рис.5. Результаты выполнения фрагмента кода

Результаты выполнения фрагмента кода показаны на Рис.5.

Заметим, что в C# требуется считывать и присваивать значения свойству Value2, а не Value объекта Range, так как свойство Value содержит параметр. C# не поддерживает свойства с параметрами (за исключением индексных свойств).

Если в приведенном выше примере для вывода на лист 1 выбрать не одну, а сразу несколько ячеек, то результат можно видеть на Рис.5.1. (фрагмент слева).

Однако, как и в приложении Excel, можно объединить ячейки программно, задать выравнивание и получить результат, как на Рис.5.1 (вторай слева фрагмент).

Рис. 5.1 Результаты выполнения примера c объединением ячеек

5.2. Форматированный вывод

При выводе информации часто бывает необходимо изменить формат ячейки, например, задать числовой формат, это можно сделать следующим образом:

Результат будет зависеть от системных установок Windows (Пуск|Настройка|Панель управления|Язык и стандарты) и, для данного примера, результат может быть как на Рис.5.1. (третий слева фрагмент).

Для формата даты и установки общего формата:

Результат выполнения Рис.5.1. (фрагмент справа).

И последнее — возврат к общему формату.

Приведенный ниже пример форматирования текста в ячейках добавлен в качестве ответа на вопрос, поступивший автору 20.01.2009г.

Попробуем выполнить форматирование, показанное на Рис.6.

Рис.6. Пример форматированного вывода

Макрос, реализующий данное форматирование, имеет вид:


Его перевод на C#, будет выглядеть примерно так:

5.3. Вставка формул

Параграф 6. Защита листа и книги документа Excel

Материал прислан Андреем Ковалевым и отредактирован автором.

Для защиты листа документа или книги Excel необходимо установить пароль. В качестве пароля используется любая переменная тира string.

Пароль задавать необязательно — string s=string.Emptu; однако, если не задать пароль, любой пользователь сможет снять защиту с листа и изменить защищенные элементы.

Второй параметр: true, означает защиту структуры (запрет перемещения, удаления, скрытия, показа или переименования, а также вставки новых листов).

Третий параметр: true, означает защиту окна (блокировка окна для восстановления размера и расположения при каждом открытии книги).

Соответственно для снятия защиты книги используем:

Функция Protect определена в Microsoft.Office.Interop.Excel.dll как:

Множество параметров функции, начиная со второго, означают:

DrawingObjects — защита фигур;

Contents — защита содержимого заблокированных ячеек;

Scenarios — защита скриптов;

userInterfaceOnly — защита пользовательского интерфейса, но не макросов. Если этот аргумент не указан, защита применяется как к макросам, так и к пользовательскому интерфейсу.

AllowFormattingCells — позволяет форматирование любой ячейки защищенного рабочего листа.

AllowFormattingRows — позволяет форматирование любой строки защищенного рабочего листа.

AllowFormattingColumns — позволяет форматирование любого столбца защищенного рабочего листа.

AllowInsertingColumns — позволяет вставку столбцов;

AllowInsertingRows — позволяет вставку строк;

AllowInsertingHyperlinks — позволяет вставку гиперссылок;

AllowDeletingColumns — позволяет удаление столбцов;

AllowDeletingRows — позволяет удаление строк;

AllowSorting — разрешает сортировку;

AllowFiltering — разрешает использовать автофильтры;

allowUsingPivotTables разрешает использование отчетов сводной таблицы.

Для снятия защиты используем:

Параграф 7. Чтение информации из ячеек Excel

Чтение информации из ячеек Excel во многом аналогично выводу (см. выше). На выбранном листе необходимо в выбранной книге выбрать одну ячейку или объединенную группу ячеек (метод get_Range или преобразование к Excel.Range)- после чего достаточно преобразовать значения в выделенных ячейках к нужному типу данных.

Создадим в Excel новую книгу, на первом листе запишем соответственно:

Сохраним документ с именем a1.xls в корне диска C.

Запишем и выполним следующий код:

Код не требует пояснений — в заглавии приложения после выполнения будет выведено:

Параграф 8. Рисуем таблички

Чтобы нарисовать табличку в Excel надо научиться рисовать рамки вокруг выбранной ячейки или объединенной группы ячеек.

Шаги рисования рамки будут следующие:

Выбрать ячейку или группу ячеек на листе документа.

Определяем цвет линий обводки. Цвет может быть выбран как один из 56 цветов цветовой палитры Excel и, поэтому, он задается через цветовой индекс (например, excelcells.Borders.ColorIndex=3; — красный)
Некоторые значения ColorIndex 1 — белый, 2 — черный, 3 — красный, 4 — зеленый, 6 — желтый, 41 — синий и т.д.

Выбрать стиль линии (Excel.XlLineStyle.xlContinuous). Стиль линии может быть одним из следующих: xlContinuous, xlDash, xlDashDot, xlDashDotot, xlDot, xlDouble, xlSlantDashDot, xlLineStyleNone.

Задать толщину линии (Excel.XlBorderWeight.lHairline). Толщина линии может быть одной из следующих: lHairline, xlMedium, xlThick, xlThin.

Можно рисовать линии по любой границе ячейки и не по границе ячейки, для чего необходима задать расположение линии — вместо excelcells.Borders задать excelcells.Borders[направление], где направление может быть одним из следующих: Excel.XlBordersIndex.xlDiagonalDown, Excel.XlBordersIndex.xlDiagonalxlDiagonalUp, Excel.XlBordersIndex.xlDiagonalUp, Excel.XlBordersIndex.xlEdgeBottom, Excel.XlBordersIndex.xlEdgeLeft, Excel.XlBordersIndex.xlEdgeRight, Excel.XlBordersIndex.xlEdgeTop, Excel.XlBordersIndex.xlInsideHorizontal, Excel.XlBordersIndex.xlInsideVertical.

Следующий пример демонстрирует выполнение обводки вокруг ячеек (Рис.7. слева), и, тем самым, при использовании для некоторой группы объединенных ячеек, показывает принцип рисования табличек.

Рис.7. Создание рамок вокруг ячеек и выполнение заливки

Добавим две строчки к коду предыдущего примера и можем выполнить заливку ячеек (Рис.7. справа).

Параграф 9. Создание диаграмм

Для того, чтобы создать диаграмму, она должна быть привязана к конкретным ячейкам с цифровой информацией, поэтому откроем наш файл C:\a.xls и нарисуем в нем табличку, показанную на Рис.8. (у кого есть время — может выполнить это программно — в предыдущих параграфах есть достаточно материала, чтобы сделать это).

Рис.8. Табличка для диаграммы

8.1. Пошаговое создание диаграмм

Приведенный ниже пример может показаться громоздким, и не всегда нужно будет пройти все шаги, которые требуются для создания диаграмм, и, конечно, всегда может потребоваться еще что-то в смысле дополнительных усовершенствований стилей, надписей и т.п. Однако в примере есть все, чтобы сразу, напрямую используя приведенные ниже коды, можно было использовать в приложении связанные с таблицами диаграммы. Путь создания тоже не бесспорный и ниже приведен еще один пример, как можно вставить диаграмму на лист Excel, но отличие обоих путей не существенны, а после того как диаграмма вставлена, путь ее изменения может быть только таким, как показано в этом примере.

Некоторые общие замечания по коду:

Все глобальные объявления для примера описаны в предыдущих параграфах, здесь мы только их напомним:

Пример оперирует с данными таблицы (Рис.8), в которой специально каждая цифра была размещена в двух ячейках. Это позволило показать способ удаления лишних и пустых серий линий диаграммы.

В примере сначала диаграмма размещается на отдельном листе, а затем переносится на лист, в котором размещена таблица для диаграммы — это позволит нам на практике использовать один и тот же код для различного размещения диаграмм.

Код испытан в решении, описанном в начале раздела. Как тип диаграммы можно задать один из предопределенных: xlArea, xlBar, xlColumn, xlLine, xlPie, xlRadar, xlXYScatter, xlCombination, xl3DArea, xl3DBar, xl3DColumn, xl3DLine, xl3DPie, xl3DSurface, xlDoughnut, xlDefaultAutoFormat.

Рис.9. Диаграммы на отдельном листе

Рис.10. Диаграммы на листе 1

Есть возможность поместить диаграмму сразу на выбранном листе. Но, в этом случае, нельзя использовать метод ActiveChart и, поэтому, предыдущий код незначительно изменится. В примере комментарии даны в строках, имеющих принципиальное отличие от кода предыдущего примера.

Код формирует туже диаграмму (Рис.10.), что и предыдущий пример.

9.2. Использование метода ChartWizard для создания диаграмм

Метод свойства Chart объекта типа ChartsObject имеет достаточно много параметров, большинство из которых, как всегда, могут не указываться (Type.Missing), однако чем больше их будет указано — тем меньше далее потребуется писать кода, аналогичного коду предыдущего примера. Поэтому рассмотрим параметры метода:

Немного изменим код предыдущего примера для построения диаграммы с использованием ChartWizard.

Рис.11. Диаграмма, построенная с использованием ChartWizard

Код может показаться проще, но как видно из Рис.11., метод реализует далеко не все возможности и вновь придется вернуться к методам, которые мы использовали выше.

Параграф 10. Обработка событий сервера Excel

События также необходимы для создания функционального приложения для работы с Excel как и доступ к свойствам и методам. Если рассматривать использование свойств и методов, предоставляемых интерфейсом COM объекта, как прямую связь по управлению сервером, то события обеспечивают обратную связь. Благодаря наличию событий, приложение может обеспечить программную функциональность для отклика на происходящее в приложении.

Объекты Excel, также как и любой контрол C#, имеют свои события и программист, как и для контрола, может создать обработчик для любого из событий. Однако, у нас нет визуального компонента Excel и нельзя двойным кликом мышки в окошечке напротив события в окне Properties на вкладке Events создать обработчик. Можно попробовать сделать это вручную. Вспомним, как мы это делали, например, в параграфе «Присоединение меню для формы» в первом разделе. Но, при этом, возникает вопрос — где взять передаваемые в приложения параметры событий?

И сами события, и параметры есть в проекте решения, а изложенное ниже — методика создания обработчика событий для серверов автоматизации.

Для создания обработчика событий необходимо:

1. Уяснить на какое событие, и для какого объекта мы хотим получить отклик (хотим отреагировать).

Основные события объектов Excel:

a.) связанные с поведением объектов на листе
— SheetActivate (произошла активизация листа);
— SheetBeforeDoubleClick (выполнен двойной клик на листе и после этого события ожидается какая либо реакция сервера — выполнение обработчика по умолчанию);
— SheetBeforeRightClick (выполнен правый клик на листе и после этого события ожидается какая либо реакция сервера — выполнение обработчика по умолчанию);
— SheetCalculate (выполнен пересчет формул на листе);
— SheetChange (смена выбранной ячейки на листе); SheetDeactivate (лист потерял фокус); SheetFollowHyperlink (пользователь ушел по гиперссылке); SheetSelectionChange (изменилось выделение на листе).

b.) связанные с поведением окна
— WindowActivate (произошла активизация окна если Excel на данный момент был активен);
— WindowDeactivate (окно потеряло фокус);
— WindowResize (изменился размер окна);

c.) связанные с управлением рабочей книгой — NewWorkbook (создана новая рабочая книга);
— WorkbookActivate (книга, один из ее листов, получили фокус);
— WorkbookAddinInstall (выполняется инсталляция не установленного компонента);
— WorkbookAddinUninstall (выполняется деинсталляция установленного компонента);
— WorkbookBeforeClose (после этого события ожидается закрытие книги — выполнение обработчика по умолчанию);
— WorkbookBeforePrint (после этого события ожидается печать листа — выполнение обработчика по умолчанию);
— WorkbookBeforeSave (после этого события ожидается сохранение книги — выполнение обработчика по умолчанию);
— WorkbookDeactivate (книга потеряла фокус);
— WorkbookNewSheet (в книгу добавлен лист);
— WorkbookOpen (открыта рабочая книга).

a.) все события объекта Application для пункта a, связанные с поведением объектов на листе. Генерируются только для листов данной рабочей книги.

b.) все события объекта Application для пункта b. Генерируются только для листов данной рабочей книги.

c.) связанные с управлением рабочей книгой — Activate (книга, один из ее листов, получили фокус);
— BeforeClose (после этого события ожидается закрытие книги — выполнение обработчика по умолчанию);
— BeforePrint (после этого события ожидается печать листа — выполнение обработчика по умолчанию);
— BeforeSave (после этого события ожидается сохранение книги — выполнение обработчика по умолчанию);
— Deactivate (книга потеряла фокус);
— NewSheet (в книгу добавлен лист);
— Open (открыта рабочая книга).

a) связанные с поведением объектов на листе
— Activate (произошла активизация листа);
— BeforeDoubleClick (выполнен двойной клик на листе и после этого события ожидается какая либо реакция сервера — выполнение обработчика по умолчанию);
— BeforeRightClick (выполнен правый клик на листе и после этого события ожидается какая либо реакция сервера — выполнение обработчика по умолчанию);
— Calculate (выполнен пересчет формул на листе);
— Change (смена выбранной ячейки на листе); SheetDeactivate (лист потерял фокус); SheetFollowHyperlink (пользователь ушел по гиперссылке); SheetSelectionChange (изменилось выделение на листе).

2. Инициализируем объект, для которого необходимо создать обработчик, например:

3. Находим (поставив точку после excelappworkbook . ) в списке отображенных объектов, свойств, методов и событий требуемое событие и добавляем его к объекту, например:

4. Поставив к полученной в пункте 3 строки знак += к полученной в пункте 3 строки, копируем (нажатием Tab) высвеченную подсказку в строку кода и получим:

Обработчик события создан и добавлен к объекту. excelappworkbook_SheetActivate — это имя функции обратного вызова для нашего обработчика. Осталось записать код функции обработчика и определить параметры функции.

5. Определение параметров функции кода обработчика для выбранного события.

Для определения метода необходимо (Рис.12.) в окне Solutation Explorer открыть узел Reference и двойным кликом мышки по узлу Microsoft.Office.Interop.Excel вызвать окно Object Browser. В окне Object Browser открыть узлы Microsoft.Office.Interop.Excel, и в последней открытой закладке найти узел списка событий. Выбрав узел требуемого списка событий, кликаем по нему мышкой — в правой части окна появляется список доступных событий. Выбираем требуемое событие и кликаем по нему мышкой — внизу окна появляется функция метода. Копируем из нее параметры функции: new void SheetActivate ( Object Sh ).


PS: Еще проще, в контекстном меню делегата WorkbookEvents_SheetActivateEventHandler выбрать пункт Go To Difination и посмотреть параметры определенные в dll Microsoft.Office.Interop.Excel:

Рис.12. Определение параметров функции кода обработчика

Пишем код функции для события:

6. Осталось назначить имя делегату события и сделать его доступными извне (public). Для этого представим назначение обработчика события (п.4.)

Это все шаги, которые необходимо сделать для добавления событий.

Следующий пример показывает как, меняя лист в книге Excel или вводя информацию в ячейку (не важно, программно или вручную), мы выводим информацию об этом в приложение, а закрывая книгу — уничтожаем объект Excel.Application, что позволяет избежать зависших процессов Excel в Windows (по крайней мере после закрытия приложения все процессы уничтожаются):

Отметим, что в функции обработчиков событий Excel передаются не ссылки на конкретный объект типа Workbook, Worksheet, Chart, а переменная типа Object, которую перед использованием необходимо явно привести к требуемому типу.

Все события, в имени которых есть слово «Before», позволяют отменить обработку события по умолчанию. Параметр, передаваемый обработчику события, обычно именуется Cancel, а его значение по умолчанию — false. Если присвоить этому параметру True, Excel не выполняет обработку события по умолчанию.

Взаимодействие с серверами автоматизации выполняется аналогично выполнению фонового процесса и, поэтому, доступа к элементам, тем, которые представлены контролами или являются свойствами WindowsForm), из функций делегатов нет (хотя при выполнении, например textBox1.Text=»Перешли на лист = » + ((Excel.Worksheet)Sh).Name); прерывания не будет, но и отображения информации также не будет).

Параграф 11. Об особенности использования метода Activate в VS 2005/2008

Кто добросовестно повторял приведенные выше примеры, тот должен был заметить, что при компиляции приложения на строке

Эта двусмысленность в использовании одноименных свойства и метода объявленных в интерфейсе _Worksheet и интерфейсе DocEvents. Оба эти интерфейса наследует класс Worksheet. И, хотя использование метода Activate не приводит к двусмысленности в выполнении кода, для тех, кто привык писать «чистый код» этот «глюк» лучше устранить. Устранение можно выполнить через события Excel (см. предыдущий параграф).

Уберем из предыдущего кода в case 1: две строчки:

Вместо убранных строчек напишем вызов:

Функцию iMySheetActivate запишем следующим образом (как писать код для работы с событиями описано выше):

Делегат может быть и пустым:

Предупреждений компиляции не будет в коде предыдущего параграфа если мы изменим и обработчик нажатия кнопки 4:

Параграф 12. Автозаполнение или работа с диапазонами

Создадим файл 1.xls, в который предварительно запишем информацию, показанную на Рис.13.

Рис 13 Файл xls для автозаполнения

Выполним следующий код:

Результат выполнения кода показан на Рис.14.

Рис 14. Файл xls после автозаполнения

Параграф 13. Некоторые возможности по управлению параметрами Excel

Приведенный ниже код демонстрирует богатство возможностей по управлению параметрами Excel из приложения на C#. Приведенные примеры целесообразно испытывать раздельно (по возможностям) — каждая новая из нескольких приведенных здесь возможностей (их, реально, во много раз больше), начинаются в коде примера фразой «Можно . «.

Заключение. О богатстве возможностей

Богатства возможностей по управлению запущенным приложением потрясающе. Практически, все, что можно сделать в автономно запущенном приложении доступно и из приложения на C#. Каждый может достаточно легко выполнить то или иное действия из приложения, если создаст макрос для этого действия, а, затем, «переведет» код VBA в коды C#.

И, в тоже время, по мнению автора, для начального этапа практической работы по формированию документов из приложения, изложенного материала вполне достаточно. Но, несмотря на это, раздел будет пополняться по мере возникновения какой либо проблемы в практической работе и ее разрешении. Если у Вас есть интересные находки — присылайте — с указанием авторства они будут включены в данный материал.

Молчанов Владислав 1.11.2004г.

Адаптировано к VS 2005/2008 14.10.2007г.

Перепечатка материала без разрешения автора не допускается.

C#: автоматизация работы с файлами

Мы изучили основные принципы программирования, это конечно азы, но зная эти азы, дальше уже можно совершенствоваться самостоятельно — просто писать как можно больше кода, это чистая практика.

Но к рассылке присоединяются новые читатели, поэтому напоминаю — если вы не умеете программировать на Си и С++, и хотите этому научиться, то пишете мне письмо и получаете задания. Делаете их, после чего мы совместно разбираем, что получилось, что нет, и двигаемся дальше. В принципе, в архиве рассылки уже есть все, что надо для самостоятельного изучения, но многим, почему-то :) , нужен живой тьютор, поэтому схема с письмами продолжает функционировать. В письме указываете, как вас зовут (на письма без подписи, с никами или кличками, принципиально не отвечаю), и не забываете здороваться:)

Одна принципиально важная вещь, которая пока осталась непройденной — это работа с файлами. Программа, которая не сохраняет результаты своей работы, очевидно, не очень-то и нужна. Мы научимся создавать файлы, записывать в них информацию, и затем считывать ее обратно в программу.

Работа с файлами складывается из трех шагов.

1. Файл открывается. Это означает, что программа «захватывает» заданный по имени файл, сообщает Windows, что далее она будет с ним работать. Данный шаг нужен, чтобы не возникало конфликтов, когда несколько программ одновременно хотят записывать информацию в один и тот же файл. Правда, считывать данные из файла, очевидно, допустимо одновременно множеством программ, поэтому в операции открытия файла обычно уточняется, что файл открывается «на чтение» (считывание информации, которая не меняется) либо «на запись» (данные в файле модифицируются).
Операция открытия файла возвращает некий идентификатор (как правило, целое число), которое идентифицирует в программе в дальнейшем нужный открытый файл. Этот идентификатор запоминается в переменной; обычно такая переменная называется файловой переменной.

2. Ведется работа с файлом. Из него данные либо считываются, либо в него записываются.

3. Файл закрывается. После этой операции он снова доступен другим программам для обработки.

Стандартные операции работы с файлами, существующие практически во всех реализациях Си, хранятся в библиотеке stdio.h. Функция открытия файла называется fopen(). Она возвращает указатель на объект стандартного (определенного в данной библиотеке) типа FILE.
Параметров у функции fopen() два. Первый — это путь к файлу (строка), второй — параметры открытия файла.

Допустим, мы хотим создать в текущем каталоге проекта новый текстовый файл и записать в него два числа и строку. Пусть этот файл будет называться test.txt. Параметр открытия файла на запись в текстовом виде записывается строкой «wt». Буква w означает write (писать), буква t — text (текст). Если такой файл в каталоге существует, он перезаписывается (все старое содержимое в нем уничтожается), если он не существует, то создается исходно пустым.

Тогда команда открытия (создания пустого) файла запишется так:

FILE * fo;
fo = fopen(«test.txt»,»wt»);

Можно задать и полный путь к файлу, например:

Не забываем, что одиночный символ \ внутри строки Си задается двумя наклонными слэшами \\. Это частая ошибка.

После открытия файла в файловую переменную fo занесется некоторое число. Если таким числом будет ноль, считается, что файл открыть не удалось. В Си нередки записи вида

где одновременно открывается файл и проверяется, успешно ли это сделано.

Закрывается файл с помощью функции fclose():
fclose(fo);
После закрытия файла к файловой переменной обращаться уже нельзя.

Запись текстовой строки в файл выполняет функция fprintf():
fprintf( имя-файловой-переменной, формат, список-переменных-для-вывода );

Формат — это текстовая строка, задающая формат записываемого в файл текста. Все, что содержится в этой строке, пишется в файл один-в-один:

fprintf( fo, «Привет!» );

В этом случае в файл запишется строка «Привет!», а так как никаких значений переменных в данном случае мы не выводим, то и список выводимых переменных отсутствует.

Чтобы вывести значение некоторой переменной, надо использовать элемент формата, который начинается с символа % . Так, формат %d задает вывод целочисленного значения, формат %s — вывод строки.
Например:

int n = 10;
char str[20] = «значение переменной n равно «;
fprintf( fo, «Вывод: %s %d», str, n );

В файл запишется строка «»Вывод: значение переменной n равно 10». Вместо формата %s подставлено значение переменной str, а вместо формата %d — значение переменной n.

Для вывода дробных чисел используют формат %f, где перед f ставят число всех выводимых символов и число символов после запятой, разделенные точкой. Например: «%5.2f» означает вывод числа из пяти позиций, причем две из них будут отведены для дробного значения. Если оно не уместится в этих позициях, то вылезет за границу, а если займет меньше, то дополнится пробелами (хотя в разных реализациях может быть по разному).

Следующая программка записывает в файл 100 строк с числами. Результирующий файл будет текстовым, его можно открыть и просмотреть, например, в Блокноте.

FILE * fo;
fo = fopen(«test.txt»,»wt»);
int i;
for( i=0; i

Комбинация символов «\n» в конце строки формата означает перевод на новую строку в выводимых текстовых данных.

Для ввода данных (текстовой строки) используют функцию fscanf(). Она напоминает fprintf():

fscanf( файловая-переменная, формат-ввода, список-адресов-переменных )

При вводе список адресов переменных отличается от списка имен переменных. Если в Си указывается имя переменной, то подразумевается значение этой переменной. Но при вводе нужно не значение, а местонахождение области в памяти, отведенной для заданной переменной — чтобы в эту область поместить новое значение, считанное из файла.

Операция &, примененная к имени переменной, возвращает адрес этой переменной в памяти. Тогда операцию ввода числа из текстового файла fi в целочисленную переменную n можно записать так:

Формат записывается также, как и в случае с fprintf, а вот перед именем переменной n дополнительно указывается операция получения адреса &.

Полезная функция feof(файловая-переменная) возвращает 1 (истинное значение), если файл, открытый для считывания, закончился. Она возвращает 0, если из файла еще можно продолжать ввод.

Программа считывания из файла всех строк с числами запишется так:

C#: Файлы и как с ними работать

Сегодня я решил рассказать тем, кто еще только начинает изучать язык программирования C# о механизме работы с файлами.
Работа с файлами в C# возможна благодаря очень мощному неймспейсу System.IO. Мы рассмотрим две основных возможности данной библиотеки — работа с файлами и работа с текстовыми файлами. Да да, разработчики уделили отдельное внимание методам для работы с текстовыми файлами — за что им стоит сказать огромное спасибо. Ведь это значительно облегчает процесс разработки. Начнем рассматривать методы работы с файлами.

Работа с текстовыми файлами в C#

Для работы с текстовыми файлами применяются два класса StreamReader и StreamWriter. По названию классов видно, что первый используется для работы с файлами в режиме чтения, второй для работы в режиме записи. Они интуитивно понятны, так как все их методы явно отражают действия. Приведем пример чтения по строкам:

Объект sr так же имеет методы ReadToEnd, ReadBlock и другие. Названия этих методов говорят сами за себя.

Пример записи в файл:

Так же стоит отметить, что оба класса реализуют интерфейс IDisposable. А это означает, что предпочтительней использовать конструкцию using.

Более того в библиотеке IO есть несколько предопределенных наиболее часто используемых операций. Нет смысла подробно описывать данные функции, нужно просто запомнить их ��

Чтение всего текстового файла в переменную

Чтение всего текстового файла построчно в массив

Работа с бинарными файлами в C#

C# позволяет очень гибко работать с бинарными файлами. В связи с этим вариантов написать один и тот же код очень много. Поэтому я просто приведу пример базовой работы с файлами на примере копирования файла с использованием FileStream.

Примечание: Параметры FileMode, FileAccess и FileShare играют очень важную. Они отвечают за флаги, которые будут проставлены файлу, пока он занят вашей программой. Именно они могут запретить/разрешить доступ к файлу сторонним программам, либо «попросить» разрешение на чтение уже занятого файла.

Записная книжка программиста-новичка, C#, SQL, PHP и все-все-все

Я ведь это уже делал, но хрен теперь найдешь тот кусок кода, гуглим снова… Где бы найти простое и понятное руководство для начинающего, а не тонкости для мега-гуру?

Рубрики

Свежие записи

Свежие комментарии

  • Calator prin Romania к записи Как переименовать проект/каталог проекта в Visual Studio?
  • iukovl к записи Как изменить максимальный размер загружаемого файла в php
  • sdfdsgeg к записи Работа с файлом конфигурации (configuration) в C# — читаем и сохраняем
  • iukovl к записи Как изменить максимальный размер загружаемого файла в php
  • Надежда к записи Ошибка в коде привела к убыткам в 476 миллионов долларов и банкротству компании

Архивы

Работаем с MS Word из C#, часть 1. Открываем шаблон, ищем текст внутри документа

Задача: вывести данные в документ Word. На самом деле это очень большая и необъятная тема, примерно как сам Word, 90% возможностей которого не используются обычными пользователями. Сузим до более простой и чаще встречающейся на практике задачи, с которой в своей время пришлось столкнуться мне самому: надо вывести красивую справку, договор, отчет или иной документ Word с добавлением данных из кода C#. Само собой должны поддерживаться версии Word до 2007, так что о новых форматах файлов придется забыть.

Для начала вспомним, что в Word есть такая замечательная вещь как шаблоны. Соответственно большую часть сложного оформления можно вынести в них и из кода открывать шаблон и вставлять данные в нужные места. Для начала ограничимся простыми строками (типовая задача в крупных предприятиях — вставка дат, цифр, фио и тому подобных вещей, договор на сумму такую-то, от такой-то даты с фио таким-то с параметрами объекта такими-то).

Задача на текущую статью: открыть из кода C# шаблон Word и что-то в него вставить. Шаблон в формате .dot приготовим заранее, в том же самом ворде. Для связи с ним будем использовать механизм COM Interoperability (сокращенно Interop), то есть запускать отдельный exe-процесс самого Word и через специальный интерфейс управлять им. Интерфейсы слава богу есть и находятся они в специальных библиотеках, поставляемых вместе с Office, но документация по ним крайне невнятная, поведение местами очень странное и не логичное. В версиях Visual Studio 2010 и выше возможности программирования Office расширены, но текущее руководство действительно и для 2008 студии.

1. Подключить нужные библиотеки
2. Открыть шаблон Word
3. Найти в нем нужное место
4. Вставить в него строку с информацией

1. Проект в студии у нас уже должен быть. В разделе Ссылки/References кликаем правой кнопкой, идем в «Добавить ссылку» и ищем Microsoft.Office.Interop.Word. В параметрах добавленной библиотеки ставим true в Копировать локально/Copy local, так как библиотеку надо копировать вместе с исполняемыми файлами проекта.

В код добавляем соответствующие using

2. Теперь вам предстоит провести много времени с замечательным интерфейсом Word, который представляет сам текстовый редактор и его потроха в виде разнообразных обьектов. Сейчас важны два — Application и Document. Переменные для них по ряду не очевидных причин лучше объявлять через интерфейсы.

Так же почти все функции Word требуют объектных параметров, даже если внутри них сидят простые строки и логические значения, так что лучше заранее сделать несколько оберток

Чтобы запустить Word и открыть в нем шаблон с диска (путь известен), потребуется примерно такой код

Принципиально важны два момента

1. Мы создаем неуправляемый ресурс, который не соберет сборщик мусора — отдельный процесс в памяти с приложением Word, если мы его не закроем и не выведем на экран, он так и останется там висеть до выключения компьютера. Более того такие ворды могут накапливаться незаметно для пользователя, программист-то еще прибьет их вручную. Заботиться о высвобождения неуправляемого ресурса должен программист.

2. По умолчанию Word запускается невидимым, на экран его выводим мы.

Для начала рассмотрим самый простой и примитивный вариант — поиск и замена строки в документе Word. Некоторые программисты так и работают — ставят в шаблон текстовую метку вроде @@nowDate и заменяют ее на нужное значение.

Пришло время познакомится с фундаментом работы с Word — великим и ужасным объектом Range. Его суть сложно описать словами -это некоторый произвольный кусок документа, диапазон (range), который может включать в себя все что угодно — от пары символов, до таблиц, закладок и прочих интересных вещей. Не стоит путать его с Selection — куском документа, выделенным мышкой, который само собой можно конвертировать в Range. Соотвественно нам надо получить Range для всего документа, найти нужную строку внутри него, получить Range для этой строки и уже внутри этого последнего диапазона заменить текст на требуемый. И не стоит забывать, что документ может иметь сложную структуру с колонтитулами и прочей ересью, возможный универсальный метод для замены всех вхождений данной строки:

На самом деле это не самый лучший метод для вставки информации в документ, так как могут возникнуть сложности с уникальными именами для текстовых меток (если текст одной входит в начало другой, данный метод найдет ее и заменит), их совпадением с произвольным текстом и так далее.

Даже если нам надо найти (и например отформатировать) именно строку с текстом внутри документа, лучше всего выдать наружу найденный Range и уже с ним производить разные злодеяния. Получим примерно такой метод:

Простейшее решение проблемы уникальности текста (нужно нам найти Range слова Word, но внутри всего документа оно встречается десятки раз) — искать строку внутри строки, сначала найти уникальную строку, потом не уникальную внутри нее, неэстетично, но дешево, надежно и практично.

Если строку надо просто заменить, то сойдет простейшее

Но так как Range является универсальный контейнером для любого куска документа Word, то его возможности неизмеримо шире, часть их будет рассмотрена в дальнейших заметках.

Если нам надо просто встать в начало документа (и что-то вставить уже туда):

Сохранить документ на диск можно следующим образом

Цукерберг рекомендует:  Как стать экспертом в CMS
Понравилась статья? Поделиться с друзьями:
Все языки программирования для начинающих