Автоматизация Microsoft Office Excel
Исследование основных возможностей работы с Microsoft Excel. Создание приложения Windows Forms. Создание и заполнение нового документа Microsoft Excel. Чтение данных с документа Microsoft Excel. Создание графиков и диаграмм при помощи "Мастера диаграмм".
Рубрика | Программирование, компьютеры и кибернетика |
Вид | лабораторная работа |
Язык | русский |
Дата добавления | 24.04.2017 |
Размер файла | 2,5 M |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
Размещено на http://www.allbest.ru
Лабораторная работа: Автоматизация Microsoft Office Excel
1. Вводная часть
В этой работе будет рассмотрена работа с программой, входящей в состав известного пакета программ Microsoft Office. В частности, речь пойдёт о Microsoft Excel и некоторых возможностях по автоматизации работы с ним. Для демонстрации работы будет использована версия Excel 2010. В данной работе будет рассмотрено следующее:
1. Автоматическое создание и заполнение нового документа.
2. Открытие и изменение документа.
3. Чтение данных из документа Excel.
4. Сохранение документа Excel.
5. Установка парольной защиты на документ Excel.
6. Автоматическое заполнение документа Excel (функции автоматического заполнения ячеек Excel).
7. Объединение ячеек на листе документа Excel.
8. Создание графиков и диаграмм при помощи «Мастера диаграмм».
9. Работа с приложением, книгами и листами документа Excel.
10. Некоторые другие возможности.
На этих примерах будут продемонстрированы основные возможности работы с Microsoft Excel при помощи сторонних приложений на C#.
2. Создание приложения Windows Forms
Запускаем Visual Studio 2010, откроется Начальная страница:
Для начала, надо создать проект, для этого выполним последовательно: Файл -> Создать -> Проект… (также можно просто нажать сочетание клавиш Ctrl+Shift+N или пункт «Создать проект…» на Начальной странице): microsoft excel документ график диаграмма
Рис. 2. 1. Создание нового проекта
Выберем слева в пункте Установленные шаблоны язык Visual C#, далее найдём в списке Приложение Windows Forms. Также здесь можно выбрать какой использовать «фреймворк» (набора компонентов для написания программ). В нашем случае выберем .NET Framework 4.
Рис. 2. 2. Окно создания нового проекта
В поле Имя вводим LWP13Excel -- это название программы (выбрано по названию лабораторного практикума, номеру и названию работы). В поле Расположение указана конечная директория, где будет находиться весь проект. Выберем расположение удобное для быстрого поиска. В поле Имя решения вводится либо название программы «по умолчанию» из поля Имя автоматически, либо можно ввести своё собственное. Под этим именем будет создана конечная папка проекта (если Имя и Имя решения разные).
Рис. 2. 3. Вводим данные нового проекта приложения Windows Forms
После нажатия клавиши ОК мы увидим сформированный проект и исходный код приложения Windows Forms (не пустого изначально).
Рис. 2. 4. Обозреватель решений: состав проекта приложения Windows Forms сформированного средой разработки
Теперь, можно откомпилировать созданную программу, нажав клавишу F5 (Отладка -> Начать отладку или нажав на иконку . Тем самым мы запускаем приложение в режиме отладки (и производим компиляцию debug-версии программы) (Debug выбрано изначально).
Рис. 2. 5. Запуск приложения Windows Forms по конфигурации Debug
3. Модификация приложения Windows Forms: создание и заполнение нового документа Microsoft Excel
Что представляет из себя полная автоматизация документа? Заполнение документа и всех важных полей, например фамилий, дат и названий. Разумеется, для редактирования правописания или более глубокого изменения документа надо использовать сам Word. Автоматизация части документа подходит в основном для рутинного заполнения однотипных документов, будь то всякие бланки или ведомости... Применений можно найти массу.
Первое, что может сделать стороннее приложение, это создать полностью готовый документ получая данные, непосредственно из приложения, а следовательно и из базы данных или с удалённого сервера. Рассмотрим такой случай.
Для начала изменим размер нашей единственной формы. Для этого можно потянуть за уголок в нужном направлении на странице визуального представления формы1. Но также размер можно менять на панели свойств этой формы. Для этого нужно поменять значение размера в пикселях (высоту и ширину) в поле Size.
ПРИМЕЧАНИЕ № 1: Для перехода на визуальное представление формы, необходимо двойным нажатием в обозревателе решений нажать на значок формы () или выбрать вкладку на панели вкладок с именем <имя формы>.cs [Конструктор].
Задаём следующие параметры формы на панели Свойства:
(Name) |
изменим с Form1.cs2 на LWP13Main |
^ Поменяем внутреннее имя формы.
Text |
изменим с Form1 на Автоматизация Microsoft Office Excel (C#) |
^ Поменяем заголовок формы (то, что отображается в шапке приложения слева).
Icon |
изменим изображение (иконку) приложения |
^ Необходим файл значка *.ico.
Size |
изменим со значений 300; 300 на 500; 400 |
^ Поменяем размер формы.
ПРИМЕЧАНИЕ № 2: Для того, чтобы поменять имя файла нашей формы, необходимо выполнить следующее: выделить в обозревателе решений значок формы () и нажать правую кнопку мыши, затем выбрать Переименовать. Ввести необходимое новое имя, СОХРАНЯЯ расширение *.cs. После смены имени, автоматически поменяются имена проассоциированных непосредственно с формой файлов:
Также, поместим первую группу элементов для работы с автоматическим созданием нового документа. Получим нечто подобное:
Рис. 3. 1. Модифицированная форма приложения и расстановка первой группы элементов
Здесь у нас две кнопки Button, один GroupBox, три TextBox, два NumericUpDown и ToolTip.
По порядку распишем Свойства каждого элемента:
ToolTip:
(Name): |
Hint |
Button:
(Name): |
B_Open |
|
Text: |
Открыть Excel, создать документ |
|
Size: |
312; 23 |
Button:
(Name): |
B_Insert |
|
Text: |
Вставить данные |
|
Size: |
130; 23 |
TextBox:
(Name): |
textBox1 |
TextBox:
(Name): |
textBox2 |
TextBox:
(Name): |
textBox3 |
GroupBox:
(Name): |
GB_Insert |
|
Text: |
Вставка данных в Excel |
NumericUpDown:
(Name): |
NUD_1 |
|
Minimum: |
1 |
|
ToolTip на Hint: |
Строка |
NumericUpDown:
(Name): |
NUD_2 |
|
Minimum: |
1 |
|
ToolTip на Hint: |
Столбец |
Также, нам необходимо добавить связь приложения и библиотеку компонентов и объектов самого Excel. Для этого выполним следующее: Проект -> Добавить ссылку. В открывшемся окне выбираем COM, далее ищем Microsoft Excel 14.0 Object Library (для Excel 2010) и Microsoft Excel 12.0 Object Library (для Excel 2007):
Рис. 3. 2. Добавить ссылку: добавление библиотеки компонентов от Excel 2010
В случае наличия на «машине» только Excel 2007, при сборке приложения необходимо добавить библиотеку «12-ой» версии. Если же установлено две версии (2007 и 2010), то необходимо добавлять библиотеку той версии, что является активной в данный момент (при запуске не производит действий по перенастройке пакета установки).
Теперь отправляемся в код формы (правая кнопка мыши на значке формы, далее Перейти к коду или нажмём на клавишу F7).
В начало файла LWP13Main.cs добавим:
using Excel = Microsoft.Office.Interop.Excel;
Найдём:
public partial class LWP13Main : Form
{
Добавим после:
Excel.Application ObjExcel1;
Excel.Workbook ObjWorkBook1;
Excel.Worksheet ObjWorkSheet1;
Изменим следующую функцию LWP13Main():
public LWP13Main()
{
InitializeComponent();
B_Insert.Enabled = false;
}
Событие Click кнопки B_Open («Открыть Excel, создать документ»):
private void B_Open_Click(object sender, EventArgs e)
{
// Запускаем Excel
ObjExcel1 = new Excel.Application();
// Создаём книгу
ObjWorkBook1 = ObjExcel1.Workbooks.Add();
// Создаём лист
ObjWorkSheet1 = (Excel.Worksheet)ObjWorkBook1.Sheets[1];
// Делаем Excel видимым
ObjExcel1.Visible = true;
ObjExcel1.UserControl = true;
}
Событие Click кнопки B_Insert («Вставить данные»):
private void B_Insert_Click(object sender, EventArgs e)
{
// Значения Cells[y - строка, x - столбец]
ObjWorkSheet1.Cells[NUD_1.Value, NUD_2.Value] = textBox1.Text;
ObjWorkSheet1.Cells[NUD_1.Value, NUD_2.Value + 1] = textBox2.Text;
ObjWorkSheet1.Cells[NUD_1.Value, NUD_2.Value + 2] = textBox3.Text;
}
Компилируем приложение (Debug) и запускаем. Нажимаем на «Открыть Excel, ...», должно открыться окно Excel (текущей версии, в данном случае Excel 2010) с чистым документом. Активируется кнопка Вставить данные. Заполняем три пустых текстовых поля, а также «крутим» счётчики строки и столбца. Жмём. Видим следующее:
Рис. 3.3. Окончательная работа первого блока: заполнение листа документа Excel (в Excel 2010)
4. Модификация приложения Windows Forms: чтение данных с документа Microsoft Excel
Разместим вторую группу элементов как показано на рисунке ниже:
Рис. 4. 1. Модифицированная форма приложения и расстановка второй группы элементов
Здесь у нас один RichTextBox, один Button, один GroupBox, TextBox и OpenFileDialog. Свойства задаём такие:
Button:
(Name): |
B_Get |
|
Text: |
Получить данные |
|
Size: |
130; 23 |
GroupBox:
(Name): |
GB_Get |
|
Text: |
Получение данных из Excel |
TextBox:
(Name): |
textBox4 |
|
ToolTip на Hint: |
Столбец |
|
Size: |
130; 23 |
RichTextBox:
(Name): |
richTextBox1 |
OpenFileDialog:
(Name): |
OFD_Get |
|
FileName: |
Данные для извлечения |
|
Filter: |
Файлы Excel или файлы Access|*.* |
События Click кнопки Получить данные:
private void B_Get_Click(object sender, EventArgs e)
{
// Открываем файл Excel
if (OFD_Get.ShowDialog() == DialogResult.OK)
{
// Создаём приложение
Excel.Application ObjExcel2 = new Excel.Application();
// Открываем книгу
Excel.Workbook ObjWorkBook2 = ObjExcel2.Workbooks.Open(OFD_Get.FileName, 0, false, 5, "", "", false, Excel.XlPlatform.xlWindows, "", true, false, 0, true, false, false);
// Выбираем таблицу (лист)
Excel.Worksheet ObjWorkSheet2;
ObjWorkSheet2 = (Excel.Worksheet)ObjWorkBook2.Sheets[1];
// Очищаем от старого текста окно вывода
richTextBox1.Clear();
for (int i = 1; i < 101; i++)
{
// Выбираем область таблицы (в нашем случае просто ячейку)
Excel.Range range = ObjWorkSheet2.get_Range(textBox4.Text + i.ToString(), textBox4.Text + i.ToString());
// Добавляем полученный из ячейки текст
richTextBox1.Text = richTextBox1.Text + range.Text.ToString() + "\n";
// Чтобы форма прорисовывалась (не подвисала)
Application.DoEvents();
}
//Удаляем приложение (выходим из Excel)
ObjExcel2.Quit();
}
}
Найдём в файле LWP13Main.cs строчку:
InitializeComponent();
B_Insert.Enabled = false;
Добавим после:
textBox4.Text = "A";
Готово. Можно компилировать и проверять работоспособность.
Второй блок нашего приложение, как нетрудно догадаться считывает данные из столбцов. При открытии файла (базы данных Access или непосредственно книги Excel), программа считывает все данные из одного конкретного столбца (зависит от буквы или цифры в текстовом поле) и заносит всё в RichTexBox.
Рис. 4. 2. Окончательная работа второго блока: открытие базы данных Access и запрос на выбор таблицы или запроса для открытия в Excel (в Excel 2010)
Рис. 4. 3. Окончательная работа второго блока: открытие таблицы базы данных через Excel (в Excel 2010)
Жмём Не сохранять.
Рис. 4. 4. Окончательная работа второго блока: вывод данных столбца таблицы через Excel (столбец А) в приложение (в Excel 2010)
О проблеме разных версий Microsoft Office (Excel):
Существует несколько вариантов работы с Excel из C#: автоматизация Excel, подключение через OleDB/ODBC, дополнительные библиотеки (Aspose Excel), работа через XML, через Open XML и прочее.
Наиболее простой вариант -- воспользоваться автоматизацией Excel. Да, скорость работы - не впечатляет. Зато удобно использовать, код пишется быстро, объёмы кода не велики. Из .NET автоматизация подключается парой кликов мыши. Достаточно добавить в Ссылки сборку Microsoft.Office.Interop.Excel и можно работать с привычными объектами COM: Application, Workbook, Worksheet и прочее.
Проблема одна -- сборки «Microsoft.Office.Interop.Excel» для каждой версии Excel разные. Если установлен Office 2003 и, соответственно, Interop-сборка версии 11. А что делать, если мне нужно разработать приложение, которое может работать с Excel 97? Или с любыми версиями Excel? Для того, чтобы считать или записать пару значений в ячейки листа Excel сложного API не требуется -- любой Excel сгодится. Но приходится привязываться к конкретной версии.
Можно воспользоваться поздним связыванием. Но если его использовать «в лоб», то ни о каком удобстве работы речи уже не идёт -- код станет сложным, а вызовы методов -- косвенными, не типизированными. Ошибок будет много.
На СodeProject (http://www.codeproject.org) существует статья «SafeCOMWrapper - Managed Disposable Strongly Typed safe wrapper to late bound COM». В ней изложена элегантная методика использования позднего связывания, устраняющая все проблемы: связывание становится поздним (привязки к конкретной версии Excel нет), для объектов автоматизации автоматически реализуется шаблон IDisposable (отработанные объекты уничтожаются автоматически), все вызовы методов явные.
Идея реализации, вкратце, следующая. Для каждого COM-объекта автоматизации прописывается отдельный интерфейс. В интерфейс включаются все методы и свойства, которые необходимо использовать у этого COM-объекта. Обратим внимание -- только те, которые необходимо использовать, а вовсе не все, реализуемые COM-объектом.
Каждый COM-объект автоматизации «заворачивается» в класс COMWrapper, унаследованный от RealProxy. RealProxy -- это стандартный класс, позволяющий организовать перехват вызовов методов. При создании COM-объекта создаетётся экземпляр COMWrapper и указывается требуемый интерфейс. Среда динамически генерирует прокси-объект, реализующий этот интерфейс. С этим прокси-объектом в дальнейшем и нужно работаетть как с объектом автоматизации. Вызов любого метода прокси-объетка перехватывается и транслируется в вызов метода Invoke класса RealProxy, перекрытый в классе COMWrapper. Здесь его можно обработать как угодно. В реализации по умолчанию, вызовы свойств транслируются в вызовы соответствующих методов get_ и set_, создаваемых .NET, возвращаемые объекты автоматизации автоматически заворачиваются в COMWrapper и прочее.
В оригинальной статье приведен пример использования данной методики для Microsoft Outlook. Сам код подобной реализации из статьи можно загрузить по ссылке в конце этого материала.
5. Модификация приложения Windows Forms: прочие возможности Microsoft Excel
Богатства возможностей по управлению запущенным приложением потрясающе. Практически, всё, что можно сделать в автономно запущенном приложении доступно и из приложения на C#. Программист может достаточно легко выполнить то или иное действие из приложения, если создаст макрос для этого действия, а, затем, «переведёт» код VBA в коды C#.
Для нашего приложения, третья группа элементов продемонстрирует широкие возможности по работе в Excel и документами.
Объекты, которыми оперирует COM-сервер Excel, несколько десятков. Будем рассматривать лишь основные, которые непосредственно требуются для обмена информацией приложения и сервера. Все объекты имеют иерархическую структуру. Сам сервер -- объект Application или приложение Excel, может содержать одну или более книг, ссылки на которые содержит свойство Workbooks. Книги -- объекты Workbook, могут содержать одну или более страниц, ссылки на которые содержит свойство Worksheets или (и) диаграмм -- свойство Charts. Страницы -- Worksheet, содержать объекты ячейки или группы ячеек, ссылки на которые становятся доступными через объект Range. Ниже в иерархии: строки, столбцы... Аналогично и для объекта Chart серии линий, легенды...
Обратим внимание на то, что, интерфейс C# вместо понятия ячейки использует объекты Range (выбранная ячейка или группа ячеек). Отметим также группу объектов ActiveCell, ActiveChart и ActiveSheet, относящихся к активному окну (расположенному поверх других). Они, по набору свойств и методов, полностью аналогичны объектам Range, Chart и Sheet и, в ряде случаев, просто облегчают получение ссылки.
Немного обособленно от этой иерархической структуры объектов находится свойство Windows объекта Excel.Application, предназначенное для управления окнами сервера Excel. Свойство Windows содержит набор объектов Window, которые имеют, в свою очередь, набор свойств и методов для управления размерами, видом, масштабом и упорядочиванием открытых окон, отображением заголовков, цветами и прочее. Эти же возможности доступны и для свойств и методов объекта Excel.Application - ActiveWindow (ссылка на активное окно).
Все эти объекты принято определять глобально для того, чтобы обеспечить доступ к ним из любой функции проекта.
Вторым в иерархии объектов Excel.Application является объект Workbook. Информация об объектах Workbook хранится в виде ссылок на открытые рабочие книги в свойстве Workbooks. Книга в приложение может быть добавлена только через добавление ссылки в совокупность Workbooks, а ссылка на открытую книгу может быть получена различным образом (по имени, номеру, как ссылка на активную книгу).
Начнём с создания рабочих книг:
Создание двух рабочих книг из 3-х и 5-ти листов (на примере нашего приложения):
Excel.Application ObjExcel;
public LWP13Main()
{
InitializeComponent();
ObjExcel = new Excel.Application();
ObjExcel.Visible = true;
ObjExcel.SheetsInNewWorkbook = 3;
ObjExcel.Workbooks.Add(Type.Missing);
ObjExcel.SheetsInNewWorkbook = 5;
ObjExcel.Workbooks.Add(Type.Missing);
}
Свойство SheetsInNewWorkbook возвращает или устанавливает количество листов, автоматически помещаемых Excel в новые рабочие книги.
В качестве параметра методу Add можно передать имя шаблона рабочей книги, однако, в этом случае мы привязываемся к пути, по которому инсталлированы приложения Microsoft Office. В примере использован другой способ: Type -- класс декларации типов, Type.Missing -- отсутствие значения. Некоторые методы Excel принимают необязательные параметры, которые не поддерживаются в C#. Для решения этой проблемы в коде на C# требуется передавать поле Type.Missing вместо каждого необязательного параметра, который является ссылочным типом (reference type). Кроме того, (этого нет в документации) при задании в методе ADD чисел от 1 до 7 будет создана книга с одним листом (1, 6), диаграмма (2), макрос (3, 4) и книга с четырьмя листами (5).
Из других свойств отметим свойство TemplatesPath. С его помощью, зная имя файла шаблона, можно напрямую задавать имя шаблона (правда, в этом нет необходимости, если мы не хотим использовать, например, свой собственный шаблон). Свойство StartupPath возвращает путь к папке, которая содержит надстройки, выполняемые при запуске Excel и, хотя свойство для отображения информации нам ничего не дает, все же порой бывает необходимо найти имя файла настроек и удалить его для того, чтобы приложение работало только с собственными настройками.
Книги могут быть не только добавлены, но и закрыты. Следующие вызовы закрывают все или конкретную рабочую книгу:
ObjExcel.Workbooks.Close();
ObjExcel.Windows[1].Close(false, Type.Missing, Type.Missing);
Подробнее:
ObjExcel.Windows[1].Close(
SaveChanges, // Если в книге нет никаких изменений в документе, то параметр игнорируется.
// Иначе, если есть изменения, но есть ссылки на закрываемую книгу
// в других открытых окнах - этот параметр также игнорируется.
// При отсутствии ссылок и наличии изменений - этот параметр
// определяет, должны ли быть сохранены изменения.
// При true и определенном параметре Filename - изменения
// сохраняются, иначе запрашиваетcя имя файла. При false сохранения
// нет. Если Type.Missing - вызывается диалоговое окно Save As
Filename, // Имя файла
RouteWorkbook // Если файл не должен быть перенаправлен другому получателю
// этот параметр игнорируется. Иначе при true файл направляется
// следующему получателю. При false пересылки нет
);
Теперь о сохранении документов:
Документы Excel можно сохранить программно и обычным для Excel способом. В любом случае перед выходом из Excel необходимо вызвать метод Quit. Если свойство Excel.Application.DisplayAlerts имеет значение true, Excel предложит сохранить несохранённые данные, если после старта в документ были внесены какие либо изменения. Excel автоматически не возвращает это свойство в значение по умолчанию, поэтому его рекомендуется возвращать в исходное состояние.
Excel.Workbook ObjWorkBook;
Excel.Workbooks ObjWorkBooks;
public LWP13Main()
{
...
// Запрашивать сохранение
ObjExcel.DisplayAlerts = true;
// Получаем набор ссылок на объекты Workbook (на созданные книги)
ObjWorkBooks = ObjExcel.Workbooks;
// Получаем ссылку на книгу 1 - нумерация от 1
ObjWorkBook = ObjWorkBooks[1];
// Ссылку можно получить и так, но тогда надо знать имена книг,
// причём, после сохранения - знать расширение файла
// ObjWorkBook = ObjWorkBooks["Book 1"];
// Запроса на сохранение для книги не должно быть
ObjWorkBook.Saved = true;
// Используем свойство Count, число Workbook в Workbooks
if (ObjWorkBooks.Count > 1)
{
ObjWorkBook = ObjWorkBooks[2];
// Запрос на сохранение книги 2 должен быть
ObjWorkBook.Saved = false;
}
}
Теперь, если выйти на конкретную книгу, как показано в примере, приведенном выше, и присвоить свойству Saved объекта Workbook значение true, Excel согласно документации не должен предлагать сохранение независимо от того, были или нет изменения в данной книге.
Для получения формата открываемого документа и задания формата сохраняемого служит свойство Excel.Application.DefaultSaveFormat. Свойство имеет много значений типа XlFileFormat (какие могут быть легко, посмотреть в диалоговом окне «Сохранение документа» в поле «Тип файла», открыв Excel и выбрав пункт меню «Файл» -> «Сохранить как»).
Например:
ObjExcel.DefaultSaveFormat = Excel.XlFileFormat.xlHtml;
В окне диалога сохранения файла будет установлен тип файла «Веб-страница».
Для сохранения документов можно использовать методы Excel.Workbook.Save и SaveAs. Метод Save сохраняет рабочую книгу в папке по умолчанию (выбирается в настройках Excel: «Файл» ->» Параметры «-> «Сохранение» -> «Расположение файлов по умолчанию») с именами, присваиваемыми документу по умолчанию («Книга1.xls», «Книга2.xls» ...) или в директорию и с именем под которым документ уже был сохранён.
Пример сохранения «по умолчанию»:
// Устанавливаем формат
ObjExcel.DefaultSaveFormat = Excel.XlFileFormat.xlExcel9795;
// Будем спрашивать разрешение на запись поверх существующего документа
ObjExcel.DisplayAlerts = true;
ObjWorkBook = ObjWorkBooks[1];
// Сохраняем книгу 1
ObjWorkBook.Save();
ObjWorkBook = ObjWorkBooks[2];
// Сохраняем книгу 2
ObjWorkBook.Save();
При значении свойства DisplayAlerts = true Excel будет спрашивать: записать ли сохраняемый документ поверх существующего, при значении false: не будет спрашивать.
Метод SaveAs позволяет сохранить документ с указанием имени, формата файла, пароля, режим доступа и прочее. Данный метод, как и метод Save, присваивает свойству Saved значение true.
ObjWorkBook.SaveAs(
Filename, // Имя сохраняемого файла
FileFormat, // Формат сохраняемого файла
Password, // Пароль доступа к файлу до 15 символов
WriteResPassword, // Пароль на доступ на запись
ReadOnlyRecommended, // При true режим только для чтения
CreateBackup, // Создать резервную копию файла при true
AccessMode, // Режим доступа к рабочей книге
ConflictResolution, // Способ разрешения конфликтов
AddToMru, // При true сохраненный документ добавляется
// в список ранее открытых файлов
TextCodePage, // Кодовая страница
TextVisualLayout, // Направление размещения текста
Local // Идентификатор Excel.Application
);
Для доступа к книге используются значение AccessMode xlShared -- общая рабочая книга, xlExclusive -- монопольный доступ или xlNoChange -- запрет изменения режима доступа.
Параметр ConflictResolution -- способ разрешения конфликтов при одновременном внесении несколькими пользователями изменений в один документ - может иметь значения: xlUserResolution -- отображение диалогового окна разрешения конфликтов (параметр по умолчанию), xlLocalSessionChanges -- принятие изменений, внесенных пользователем или xlOtherSessionChanges -- принятие изменений, внесенных другими пользователями. О применении SaveAs будет написано в рабочем коде приложения ниже.
Также, для сохранения документа может быть использован метод SaveCopyAs, который сохраняет копию рабочей книги в файле.
Метод SaveCopyAs не производит преобразование документа и, поэтому, например вместо Веб-страницы Book1.html сохранит копию *.xlsx (Excel 2007 и выше) документа (изменит только расширение).
И наконец, об открытии документов:
Для открытия существующего документа основным методом является метод Open набора Excel.Workbooks. Для открытия текстовых файлов как рабочих книг, баз данных, файлов в формате *.xml, используются методы OpenText, OpenDatabase или OpenXml.
ObjExcel.Workbooks.Open(@"C:\Документ.html",
Type.Missing, Type.Missing, Type.Missing, Type.Missing,
Type.Missing, Type.Missing, Type.Missing, Type.Missing,
Type.Missing, Type.Missing, Type.Missing, Type.Missing,
Type.Missing, Type.Missing);
ObjExcel.Workbooks.Open(@"C:\Документ.xlsx",
Type.Missing, Type.Missing, Type.Missing, Type.Missing,
Type.Missing, Type.Missing, Type.Missing, Type.Missing,
Type.Missing, Type.Missing, Type.Missing, Type.Missing,
Type.Missing, Type.Missing);
Параметров как видим очень много. Метод Open и его свойства таковы:
ObjWorkBooks.Open(
FileName, // Имя открываемого файла
UpdateLinks, // Способ обновления ссылок в файле
ReadOnly, // При значении true открытие только для чтения
Format, // Определение формата символа разделителя
Password, // Пароль доступа к файлу до 15 символов
WriteResPassword, // Пароль на сохранение файла
IgnoreReadOnlyRecommended, // При значении true отключается вывод
// запроса на работу без внесения изменений
Origin, // Тип текстового файла
Delimiter, // Разделитель при Format = 6
Editable, // Используется только для надстроек Excel 4.0
Notify, // При значении true имя файла добавляется в
// список нотификации файлов
Converter, // Используется для передачи индекса конвертера файла
// используемого для открытия файла
AddToMRU, // При true имя файла добавляется в список
// открытых файлов
Local, // Языковые параметры загрузки (true или false)
CorruptLoad // Режим загрузки файла (всего 3 возможных)
);
UpdateLinks -- позволяет задать способ обновления ссылок в файле. Если данный параметр не задан, то выдается запрос на указание метода обновления. Значения: 0 -- не обновлять ссылки; 1 -- обновлять внешние ссылки; 2 -- обновлять только удаленные ссылки; 3 -- обновлять все ссылки.
Format -- при работе с текстовыми файлами определяет символ разделителя для полей, заносимых в различные ячейки документа. Значения параметра: 1 -- символ табуляции; 2 -- запятая; 3 -- пробел; 4 - точка с запятой; 5 -- нет разделителя; 6 -- другой символ, определённый в параметре Delimiter.
Теперь перейдём к нашему приложению. Для начала подготовим третий блок элементов управления на форме.
Рис. 5. 1. Модифицированная форма приложения и расстановка третьей группы элементов
Здесь 7 кнопок и один GroupBox.
GroupBox:
(Name): |
GB_Other |
|
Text: |
Прочие возможности работы с Excel |
Button:
(Name): |
B_Create |
|
Text: |
Сформировать готовый документ с графиком |
|
Size: |
312; 23 |
Button:
(Name): |
B_Other |
|
Text: |
Другие листы |
|
Size: |
100; 23 |
Button:
(Name): |
B_Action |
|
Text: |
Выполнить различные действия |
|
Size: |
206; 23 |
Button:
(Name): |
B_Unfreeze |
|
Text: |
Разморозить |
|
Size: |
100; 23 |
Button:
(Name): |
B_Merge |
|
Text: |
Объединение |
|
Size: |
100; 23 |
Button:
(Name): |
B_Exit |
|
Text: |
Выгрузить все открытые приложением экземпляры Excel |
|
Size: |
312; 23 |
Button:
(Name): |
B_AutoFill |
|
Text: |
Автозаполнение |
|
Size: |
100; 23 |
Начнём с самой первой кнопки (B_Create). Нажатие кнопки вызывает окно Excel, далее создаётся книга с тремя листами, в ней формируются данные о продажах для некоей фирмы, после чего приложение через Excel спрашивает, для скольких кварталов за год вывести данные о продажах. После выбора числа кварталов (от четырёх до одного), Excel строит график (на основе случайных данных для каждого сотрудника фирмы), перемещает этот график на основной (первый) лист и сохраняет документ под двумя паролями в директории с приложением (Новый документ.xslx). Два пароля: первый пароль на доступ к документу («123»), второй на изменение данных («321»).
Для работы кода нам потребуется следующее. Найдём в LWP13Main.cs строчки:
public partial class LWP13Main : Form
{
Excel.Application ObjExcel1;
Excel.Workbook ObjWorkBook1;
Excel.Worksheet ObjWorkSheet1;
Добавим после (с заделом на будущую функциональность):
//
Excel.Application ObjExcel3;
//
Excel.Application ObjExcel4;
Excel.Workbook ObjWorkBook4;
Excel.Workbooks ObjWorkBooks4;
Excel.Worksheet ObjWorkSheet4;
Excel.Sheets ObjSheets4;
Excel.Range ObjRange4;
//
Excel.Application ObjExcel5;
Excel.Workbook ObjWorkBook5;
Excel.Workbooks ObjWorkBooks5;
Excel.Worksheet ObjWorkSheet5;
Excel.Sheets ObjSheets5;
Excel.Range ObjRange5;
//
Excel.Application ObjExcel6;
Excel.Workbook ObjWorkBook6;
Excel.Workbooks ObjWorkBooks6;
Excel.Worksheet ObjWorkSheet6;
Excel.Sheets ObjSheets6;
Excel.Range ObjRange6;
//
Excel.Application ObjExcel7;
Excel.Workbook ObjWorkBook7;
Excel.Workbooks ObjWorkBooks7;
Excel.Worksheet ObjWorkSheet7;
Excel.Sheets ObjSheets7;
Excel.Range ObjRange7;
Код достаточно хорошо прокомментирован, событие Click нажатия кнопки B_Create таково:
private void B_Create_Click(object sender, EventArgs e)
{
B_Create.Enabled = false;
B_Other.Enabled = true;
B_Merge.Enabled = true;
Excel._Workbook ObjWorkBook3;
Excel._Worksheet ObjWorkSheet3;
Excel.Range ObjRange3;
try
{
ObjExcel3 = new Excel.Application();
ObjExcel3.Visible = true;
// Задаём число листов в новом документе (Книге)
ObjExcel3.SheetsInNewWorkbook = 3;
ObjWorkBook3 = (Excel._Workbook)(ObjExcel3.Workbooks.Add(Type.Missing));
ObjWorkSheet3 = (Excel._Worksheet)ObjWorkBook3.ActiveSheet;
// Заполняем заголовочные ячейки
ObjWorkSheet3.Cells[1, 1] = "Имя";
ObjWorkSheet3.Cells[1, 2] = "Фамилия";
ObjWorkSheet3.Cells[1, 3] = "Полное имя";
ObjWorkSheet3.Cells[1, 4] = "Продажи";
// Форматируем A1:D1 как "жирный", вертикальное положение: по центру
ObjWorkSheet3.get_Range("A1", "D1").Font.Bold = true;
ObjWorkSheet3.get_Range("A1", "D1").VerticalAlignment = Excel.XlVAlign.xlVAlignCenter;
// Создаём массив для заполнения ячеек данными (имена и фамилии)
string[,] saNames = new string[5, 2];
saNames[0, 0] = "Иван";
saNames[0, 1] = "Иванов";
saNames[1, 0] = "Антон";
saNames[1, 1] = "Антонов";
saNames[2, 0] = "Пётр";
saNames[2, 1] = "Петров";
saNames[3, 0] = "Андрей";
saNames[3, 1] = "Андреев";
saNames[4, 0] = "Кейв";
saNames[4, 1] = "Джонсон";
// Заполняем A2:B6 из массива ("Имя" и "Фамилия").
ObjWorkSheet3.get_Range("A2", "B6").Value2 = saNames;
// Заполняем C2:C6 по формуле (=A2 & " " & B2).
ObjRange3 = ObjWorkSheet3.get_Range("C2", "C6");
ObjRange3.Formula = "=A2 & \" \" & B2";
// Заполняем D2:D6 по формлуе (=RAND()*100000) и применяем формат
ObjRange3 = ObjWorkSheet3.get_Range("D2", "D6");
ObjRange3.Formula = "=RAND()*1000";
ObjRange3.NumberFormat = "0.00р";
// Автозаполнение A:D.
ObjRange3 = ObjWorkSheet3.get_Range("A1", "D1");
ObjRange3.EntireColumn.AutoFit();
// Манипулируем с переменным числом столбцов для квартальных
// данных продаж (вызываем метод DisplayQuarterlySales).
// Для построение графика будет использован ChartWizard
DisplayQuarterlySales(ObjWorkSheet3);
// Делаем Excel видимым и передаём управления пользователю
ObjExcel3.Visible = true;
ObjExcel3.UserControl = true;
}
catch (Exception ex)
{
String errorMessage;
errorMessage = "Ошибка: ";
errorMessage = String.Concat(errorMessage, ex.Message);
errorMessage = String.Concat(errorMessage, "\nЛиния: ");
errorMessage = String.Concat(errorMessage, ex.Source);
MessageBox.Show(errorMessage, "Автоматизация Microsoft Office Excel (C#) :: Ошибка построения диаграммы");
}
ObjExcel3.Quit();
}
private void DisplayQuarterlySales(Excel._Worksheet ObjWorkSheet3)
{
Excel._Workbook ObjWorkBook3;
Excel.Series ObjSeries3;
Excel.Range ObjResizeRange3;
Excel._Chart ObjChart3;
String sMsg;
int iNumQtrs = 4;
// Определяем, сколько кварталов частей для отображения данных
for (iNumQtrs = 4; iNumQtrs >= 2; iNumQtrs--)
{
sMsg = "Ввод данных с продаж за ";
sMsg = String.Concat(sMsg, iNumQtrs);
sMsg = String.Concat(sMsg, " квартала(-л)?");
DialogResult iRet = MessageBox.Show(sMsg, "Сколько кварталов учитывать?", MessageBoxButtons.YesNo);
if (iRet == DialogResult.Yes) break;
}
sMsg = "Вывод данных за ";
sMsg = String.Concat(sMsg, iNumQtrs);
sMsg = String.Concat(sMsg, " квартала(-л)");
MessageBox.Show(sMsg, "Данные о продажах за кварталы");
// Начиная с E1, заполнить заголовки (и далее по количество столбцов выбранных столбцов)
ObjResizeRange3 = ObjWorkSheet3.get_Range("E1", "E1").get_Resize(Missing.Value, iNumQtrs);
ObjResizeRange3.Formula = "=\"К\" & COLUMN()-4 & CHAR(10) & \"(квартал)\"";
// Меняем ориентацию текста (38) и параметр поворота текста (true)
ObjResizeRange3.Orientation = 38;
ObjResizeRange3.WrapText = true;
// Заполняем заголовки (верхнюю ячейку столбца) начиная с E1 жёлтым цветом
ObjResizeRange3.Interior.ColorIndex = 36;
// Заполняем E2:E6 формулами (случайное число до 100) и меняем формат отображения (рубли)
ObjResizeRange3 = ObjWorkSheet3.get_Range("E2", "E6").get_Resize(Missing.Value, iNumQtrs);
ObjResizeRange3.Formula = "=RAND()*100";
ObjResizeRange3.NumberFormat = "0.00р";
// Применяем к E1:E6 чёрные границы ячеек
ObjResizeRange3 = ObjWorkSheet3.get_Range("E1", "E6").get_Resize(Missing.Value, iNumQtrs);
ObjResizeRange3.Borders.Weight = Excel.XlBorderWeight.xlThin;
// Для всех ячеек ниже E1 формируем сумму, под числом рисуем двойную черту
ObjResizeRange3 = ObjWorkSheet3.get_Range("E8", "E8").get_Resize(Missing.Value, iNumQtrs);
ObjResizeRange3.Formula = "=SUM(E2:E6)";
ObjResizeRange3.Borders.get_Item(Excel.XlBordersIndex.xlEdgeBottom).LineStyle = Excel.XlLineStyle.xlDouble;
ObjResizeRange3.Borders.get_Item(Excel.XlBordersIndex.xlEdgeBottom).Weight = Excel.XlBorderWeight.xlThick;
// Создаём график для выбранных данных
ObjWorkBook3 = (Excel._Workbook)ObjWorkSheet3.Parent;
ObjChart3 = (Excel._Chart)ObjWorkBook3.Charts.Add(Missing.Value, Missing.Value, Missing.Value, Missing.Value);
// Используем "Мастер диаграмм" чтобы создать новый график на основе выбранных данных
ObjResizeRange3 = ObjWorkSheet3.get_Range("E2:E6", Missing.Value).get_Resize(Missing.Value, iNumQtrs);
// Делаем график объёмной
ObjChart3.ChartWizard(Missing.Value, Excel.XlChartType.xl3DColumn, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value);
// Меняем подписи срава (по вертикали) на "Полное имя"
ObjSeries3 = (Excel.Series)ObjChart3.SeriesCollection(1);
// В цикле пробегаем по каждому элементу подписи по вертикали справа
for (int iRet = 1; iRet <= 5; iRet++)
{
ObjSeries3 = (Excel.Series)ObjChart3.SeriesCollection(iRet);
ObjSeries3.Name = ObjWorkSheet3.get_Range("C" + (iRet + 1), "C" + (iRet + 1)).Value2;
}
ObjChart3.Location(Excel.XlChartLocation.xlLocationAsObject, ObjWorkSheet3.Name);
// Перемещаем график так, чтобы он не закрывал покрыть данные
ObjResizeRange3 = (Excel.Range)ObjWorkSheet3.Rows.get_Item(10, Missing.Value);
ObjWorkSheet3.Shapes.Item("Chart 1").Top = (float)(double)ObjResizeRange3.Top;
ObjResizeRange3 = (Excel.Range)ObjWorkSheet3.Columns.get_Item(2, Missing.Value);
ObjWorkSheet3.Shapes.Item("Chart 1").Left = (float)(double)ObjResizeRange3.Left;
// Сохраняем документ и устанавливаем статус документа "сохранён"
ObjWorkBook3.Saved = true;
// Не будем спрашивать разрешение на запись поверх существующего документа
ObjExcel3.DisplayAlerts = false;
// Сохраняем документ в папке с приложением
ObjWorkBook3.SaveAs(
Environment.CurrentDirectory + "\\Новый документ", // Имя файла (object FileFormat)
ObjExcel3.DefaultSaveFormat, // Формат файла
"123", // Пароль (object Password)
"321", // Повтор пароля (object WriteResPassword)
Type.Missing, // (object ReadOnlyRecommended)
Type.Missing, // (object object CreateBackup)
Excel.XlSaveAsAccessMode.xlNoChange,// (object XlSaveAsAccessMode AccessMode)
Type.Missing, // (object ConflictResolution)
Type.Missing, // (object AddToMru)
Type.Missing, // (object TextCodepage)
Type.Missing, // (object TextVisualLayout)
Type.Missing); // (object Local)
System.Threading.Thread.Sleep(1000);
}
После нажатия кнопки и совершения действия в Excel, код принудительно закрывает Excel:
ObjExcel3.Quit();
Это сделано с целью недопущения «размножения» процессов Excel в памяти ПК. Так как наше приложение в процессе работы будет создавать несколько самостоятельных объектов-приложений Excel (для каждого действия своя копия). Если закрыть окно Excel вручную, связь с объектом из приложения для окна будет утеряна, а процесс останется в памяти даже после закрытия формы нашего приложения. Если такое всё-таки случилось, можно воспользоваться следующим кодом (снять комментарии с кода):
private void LWP13Main_FormClosing(object sender, FormClosingEventArgs e)
{
// Выгружает все (!) процессы EXCEL.EXE из памяти
//foreach (System.Diagnostics.Process currentProcess in System.Diagnostics.Process.GetProcessesByName("EXCEL.EXE"))currentProcess.Kill();
}
Это событие «закрытия формы» возникающее во время завершения работы формы, до полного высвобождения ресурсов. Код события выгружает все процессы EXCEL.EXE из памяти. Вернее «убивает».
Событие Click кнопки B_Exit:
private void B_Exit_Click(object sender, EventArgs e)
{
// Выходим из всех открытых приложением окон Excel
try
{
B_Open.Enabled = true;
ObjExcel1.Quit();
}
catch { }
try
{
B_Create.Enabled = true;
B_Other.Enabled = false;
B_Merge.Enabled = false;
ObjExcel3.Quit();
}
catch { }
try
{
ObjExcel4.Quit();
}
catch { }
try
{
ObjExcel5.Quit();
}
catch { }
try
{
B_Unfreeze.Enabled = false;
ObjExcel6.Quit();
}
catch { }
try
{
B_AutoFill.Enabled = true;
ObjExcel7.Quit();
}
catch { }
}
Кнопка B_Other делают следующее. Открывает ранее сохранённый документ («Новый документ»), вносит в ячейку А7 первого листа значение «10,5», в ячейку А1 второго листа слово «Лист 2» (форматированное), и заполняет третий лист. Затем сохраняет всё и закрывает документ и Excel. Код события Click:
private void B_Other_Click(object sender, EventArgs e)
{
B_Other.Enabled = false;
int n, m;
ObjExcel4 = new Excel.Application();
ObjExcel4.Visible = true;
// Получаем набор ссылок на объекты Workbook
ObjWorkBooks4 = ObjExcel4.Workbooks;
// Открываем книгу и получаем на нее ссылку
ObjWorkBook4 = ObjExcel4.Workbooks.Open(Environment.CurrentDirectory + "\\Новый документ", Type.Missing, Type.Missing, Type.Missing, "123", "321", Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing);
// Если бы открыли несколько книг, то получили ссылку так
// ObjWorkBook4 = ObjWorkBooks4[1];
// Получаем массив ссылок на листы выбранной книги
ObjSheets4 = ObjWorkBook4.Worksheets;
// Получаем ссылку на лист 1
ObjWorkSheet4 = (Excel.Worksheet)ObjSheets4.get_Item(1);
// Выбираем ячейку для вывода A7
ObjRange4 = ObjWorkSheet4.get_Range("A7", "A7");
// Выводим число
ObjRange4.Value2 = 10.5;
// Выбираем лист 2
ObjWorkSheet4 = (Excel.Worksheet)ObjSheets4.get_Item(2);
// При выборе одной ячейки можно не указывать вторую границу
ObjRange4 = ObjWorkSheet4.get_Range("A1", Type.Missing);
// Выводим значение текстовую строку
ObjRange4.Value2 = "Лист 2";
ObjRange4.Font.Size = 20;
ObjRange4.Font.Italic = true;
ObjRange4.Font.Bold = true;
// Выбираем лист 3
ObjWorkSheet4 = (Excel.Worksheet)ObjSheets4.get_Item(3);
// Делаем третий лист активным
ObjWorkSheet4.Activate();
// Вывод в ячейки используя номер строки и столбца Cells[строка, столбец]
for(m = 1; m < 20; m++)
{
for(n = 1; n < 15; n++)
{
ObjRange4 = (Excel.Range)ObjWorkSheet4.Cells[m, n];
// Выводим координаты ячеек
ObjRange4.Value2 = m.ToString() + " " + n.ToString();
}
}
// Сохраняем результат
ObjWorkBooks4 = ObjExcel4.Workbooks;
ObjWorkBook4 = ObjWorkBooks4[1];
ObjWorkBook4.Save();
System.Threading.Thread.Sleep(1000);
ObjExcel4.Quit();
}
Кнопка B_Merge также работает с тем же самым документом. Нажатие кнопки: загрузка документа, объединение ячеек второго листа, заполнение тёмно-красным цветом и изменение границы объединённой ячейки (красный цвет, толщина), затем сохранение и выход из Excel.
private void B_Merge_Click(object sender, EventArgs e)
{
B_Merge.Enabled = false;
ObjExcel7 = new Excel.Application();
ObjExcel7.Visible = true;
// Получаем набор ссылок на объекты Workbook
ObjWorkBooks7 = ObjExcel7.Workbooks;
// Открываем книгу и получаем на нее ссылку
ObjWorkBook7 = ObjExcel7.Workbooks.Open(Environment.CurrentDirectory + "\\Новый документ", Type.Missing, Type.Missing, Type.Missing, "123", "321", Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing);
// Если бы открыли несколько книг, то получили ссылку так
// ObjWorkBook7 = ObjWorkBooks7[1];
// Получаем массив ссылок на листы выбранной книги
ObjSheets7 = ObjWorkBook7.Worksheets;
// Получаем ссылку на лист 2
ObjWorkSheet7 = (Excel.Worksheet)ObjSheets7.get_Item(2);
// Делаем первый лист активным (другим способом)
//ObjWorkSheet7.Activate();
iMySheetActivate(2);
ObjRange7 = ObjWorkSheet7.get_Range("B2", "D7");
// Объединяем ячейки
ObjRange7.Merge(Type.Missing);
// Устанавливаем цвет обводки
ObjRange7.Borders.ColorIndex = 3;
// Устанавливаем стиль и толщину линии
ObjRange7.Borders.LineStyle = Excel.XlLineStyle.xlContinuous;
ObjRange7.Borders.Weight = Excel.XlBorderWeight.xlThick;
// Сделаем заливку
ObjRange7.Interior.ColorIndex = 30;
ObjRange7.Interior.PatternColorIndex = Excel.Constants.xlAutomatic;
// Сохраняем результат
ObjWorkBooks7 = ObjExcel7.Workbooks;
ObjWorkBook7 = ObjWorkBooks7[1];
ObjWorkBook7.Save();
System.Threading.Thread.Sleep(1000);
ObjExcel7.Quit();
}
private int iMySheetActivate(int viNumSheet)
{
try
{
Excel.Worksheet sheet = (Excel.Worksheet)ObjWorkBook7.Sheets[viNumSheet];
Excel.DocEvents_Event sheetEvents = (Excel.DocEvents_Event)sheet;
Excel._Worksheet _sheet = (Excel._Worksheet)sheet;
sheetEvents.Activate += new Excel.DocEvents_ActivateEventHandler(sheetEvents_Activate);
_sheet.Activate();
}
catch (Exception)
{
return 1;
}
return 0;
}
public void sheetEvents_Activate()
{
// Пусто!
}
Зачем использовать метод iMySheetActive вместо:
//ObjWorkSheet7.Activate();
Сняв комментарии со строчки получим предупреждение:
«Неоднозначность между методом
"Microsoft.Office.Interop.Excel._Worksheet.Activate()" и
"Microsoft.Office.Interop.Excel.DocEvents_Event.Activate", который методом не является. Используйте группу методов.»
Эта двусмысленность в использовании одноимённых свойства и метода объявленных в интерфейсе _Worksheet и интерфейсе DocEvents. Оба эти интерфейса наследует класс Worksheet. И, хотя использование метода Activate не приводит к двусмысленности в выполнении кода, для тех, кто привык писать «чистый код» этот «глюк» лучше устранить. Устранение можно выполнить через события Excel.
Работа кнопки B_AutoFill: загружается заранее подготовленный документ («Пример автозапонения») и на основе данных из документа производит автоматическое заполнение ячеек, затем сохраняет как новый документ: Автозаполнение.xlsx и закрывает Excel. Код события Click кнопки B_AutoFill:
private void B_AutoFill_Click(object sender, EventArgs e)
{
B_AutoFill.Enabled = false;
ObjExcel5 = new Excel.Application();
ObjExcel5.Visible = true;
ObjExcel5.UserControl = true;
ObjWorkBooks5 = ObjExcel5.Workbooks;
ObjWorkBook5 = ObjExcel5.Workbooks.Open(Environment.CurrentDirectory + "\\Пример автозаполнения", Type.Missing, Type.Missing, Type.Missing, "123", "321", Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing);
ObjSheets5 = ObjWorkBook5.Worksheets;
ObjWorkSheet5 = (Excel.Worksheet)ObjSheets5.get_Item(1);
// Делаем первый лист активным
ObjWorkSheet5.Activate();
ObjRange5 = ObjWorkSheet5.get_Range("B1", "B1");
ObjRange5.Value2 = "1";
ObjRange5 = ObjWorkSheet5.get_Range("B2", "B2");
ObjRange5.Value2 = "3";
Excel.Range ObjRange51 = ObjExcel5.get_Range("B1:B2", Type.Missing);
Excel.Range ObjRange52 = ObjExcel5.get_Range("B1:B15", Type.Missing);
ObjRange51.AutoFill(ObjRange52, Excel.XlAutoFillType.xlFillSeries);
ObjRange51 = ObjExcel5.get_Range("C1", Type.Missing);
ObjRange52 = ObjExcel5.get_Range("C1:C15", Type.Missing);
ObjRange51.AutoFill(ObjRange52, Excel.XlAutoFillType.xlFillYears);
ObjRange51 = ObjExcel5.get_Range("D1", Type.Missing);
ObjRange52 = ObjExcel5.get_Range("D1:D15", Type.Missing);
ObjRange51.AutoFill(ObjRange52, Excel.XlAutoFillType.xlFillMonths);
ObjRange51 = ObjExcel5.get_Range("E1", Type.Missing);
ObjRange52 = ObjExcel5.get_Range("E1:E15", Type.Missing);
ObjRange51.AutoFill(ObjRange52, Excel.XlAutoFillType.xlFillDefault);
ObjRange51 = ObjExcel5.get_Range("F1", Type.Missing);
ObjRange52 = ObjExcel5.get_Range("F1:F15", Type.Missing);
ObjRange51.AutoFill(ObjRange52, Excel.XlAutoFillType.xlFillWeekdays);
ObjRange51 = ObjExcel5.get_Range("G1", Type.Missing);
ObjRange52 = ObjExcel5.get_Range("G1:G15", Type.Missing);
ObjRange51.AutoFill(ObjRange52, Excel.XlAutoFillType.xlFillDays);
ObjRange51 = ObjExcel5.get_Range("H1", Type.Missing);
ObjRange52 = ObjExcel5.get_Range("H1:H15", Type.Missing);
ObjRange51.AutoFill(ObjRange52, Excel.XlAutoFillType.xlFillDays);
ObjRange51 = ObjExcel5.get_Range("I1:I2", Type.Missing);
ObjRange52 = ObjExcel5.get_Range("I1:I15", Type.Missing);
ObjRange51.AutoFill(ObjRange52, Excel.XlAutoFillType.xlFillSeries);
// Сохраняем результат
ObjWorkBooks5 = ObjExcel5.Workbooks;
ObjWorkBook5 = ObjWorkBooks5[1];
ObjWorkBook5.Saved = true;
// Не будем спрашивать разрешение на запись поверх существующего документа
ObjExcel5.DisplayAlerts = false;
ObjWorkBook5.SaveAs(
Environment.CurrentDirectory + "\\Автозаполнение", ObjExcel5.DefaultSaveFormat, Type.Missing,
Type.Missing, Type.Missing, Type.Missing, Excel.XlSaveAsAccessMode.xlNoChange, Type.Missing,
Type.Missing, Type.Missing, Type.Missing, Type.Missing);
System.Threading.Thread.Sleep(1000);
ObjExcel5.Quit();
}
Исходный документ выглядит так:
Рис. 5.2. Исходный документ «Пример автозаполнения» (Файл типа Лист Microsoft Excel, разрешение *.xlsx)
Ячейка C1 исходного документа имеет тип «Дата». Остальные: «Общий». Сам файл в архиве также можно загрузить по ссылке в конце этого материала.
Наконец две оставшиеся кнопки. Первая (B_Action) выполняет достаточно много разнообразных действий с выводом результата либо через MessageBox либо непосредственно в приложении. Например, изменяет размер окна до 50%, выключает строку формул, отключает возможность редактирования ячеек напрямую, выводит список всех недавно открытых документов и прочее. Также после нажатия, окно Excel будет заморожено (нельзя закрыть и совершить любые действия с окном и содержимым). Для «размораживания» введена кнопка B_Unfreeze. Весь код прокомментирован. Событие Click для кнопки B_Action:
private void B_Action_Click(object sender, EventArgs e)
{
B_Other.Enabled = false;
B_Unfreeze.Enabled = true;
// Создаём книги для примеров. Для некоторых примеров нам понадобятся
// несколько книг, для других будет достаточно одной. Для приводимых ниже
// примеров может понадобиться не только объекты книг, но и объекты
// листов и ячеек
ObjExcel6 = new Excel.Application();
ObjExcel6.Visible = true;
ObjExcel6.UserControl = true;
ObjExcel6.SheetsInNewWorkbook = 2;
ObjExcel6.Workbooks.Add(Type.Missing);
ObjExcel6.SheetsInNewWorkbook = 3;
ObjExcel6.Workbooks.Add(Type.Missing);
ObjWorkBooks6 = ObjExcel6.Workbooks;
// Получаем ссылку на объект: Книга1 - номерация от 1
Подобные документы
Создание круговой диаграммы в табличном процессоре Microsoft Office Excel. Построение графиков математических функций. Назначение и алгоритм построение диаграммы с помощью Мастера диаграмм. Типы диаграмм в Excel. Метки строк и столбцов диаграммы.
лабораторная работа [1,6 M], добавлен 15.11.2010История использования механических и полуавтоматических средств для арифметических операций. Работа с табличным процессором Microsoft Excel. Поиск и замена данных в таблице Microsoft Access. Сортировка записей в запросе, его создание с помощью мастера.
контрольная работа [22,8 K], добавлен 13.01.2010Формирование практических навыков организации вычислений в рабочем документе табличного редактора Microsoft Excel, использования относительных, абсолютных и смешанных ссылок. Создание формул, построение диаграмм и графиков на основе табличных данных.
практическая работа [565,7 K], добавлен 20.01.2014Оформление "Пояснительной записки". Рисование в графическом редакторе "Paint". Создание рисунка. Создание таблицы в Microsoft Excel. Расчёт данных при помощи мастера функций Microsoft Excel. Создание гистограммы, круговой диаграммы, итогового файла.
автореферат [1,6 M], добавлен 08.06.2008Организации данных в таблице для документирования и графического представления информации при помощи программы Microsoft Excel. Создание и оформление исходных таблиц. Расчеты в таблицах, сортировка и фильтрация данных. Построение нестандартных диаграмм.
реферат [3,6 M], добавлен 27.12.2013Состав пакета Microsoft Office System. Обзор основных возможностей Microsoft Office. Анализ и выработка согласованной финансовой политики на предприятии в MS Excel. Разработка базы данных при помощи Microsoft Access. Создание простейшей Web-страницы.
курсовая работа [1,4 M], добавлен 18.01.2012Microsoft Office как семейство программных продуктов Microsoft, его возможности и функции. Решение пользовательских задач с помощью встроенных функций Excel, создание базы данных. Формирование блок-схемы алгоритма с использованием Microsoft Visio.
контрольная работа [1,4 M], добавлен 28.01.2014Основные функции и методы работы в табличном процессоре Microsoft Excel. Создание и редактирование простейших таблиц и диаграмм. Характеристика встроенных функций программы. Использование формул и правил введения, их комбинирование и редактирование.
курсовая работа [2,2 M], добавлен 08.06.2014Поиск значений показателя "количество абонентов оператора Мегафон" в сети Интернет с помощью различных поисковых систем; их сравнительный анализ. Формирование навыков работы с приложением Microsoft Word; работа с электронными таблицами в Microsoft Excel.
курсовая работа [3,9 M], добавлен 12.05.2011Правила работы с текстовым редактором Microsoft Word, оценка его возможностей и перспектив развития. Ввод текста и закономерности работы с таблицами. Создание документа "Рекламный лист". Особенности работы с табличным редактором MS Excel, создание диаграм
методичка [6,4 M], добавлен 15.02.2011