Как сохранить excel в c

Содержание

REDMOND

Передача данных в книгу Excel с помощью Visual C# 2005 или Visual C# .NET

Версия этой статьи для Microsoft Visual Basic 6,0 приведена в статье 247412.

В этой статье описываются несколько способов переноса данных в Microsoft Excel 2002 из программы Microsoft Visual C# 2005 или Microsoft Visual C# .NET. В этой статье также представлены преимущества и недостатки каждого метода, чтобы вы могли выбрать решение, которое лучше всего подходит для вашей ситуации.

Обзор

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

С помощью автоматизации вы можете использовать различные методы для переноса данных:

  • Перемещение ячейки данных по ячейке.
  • Передача данных в массиве в диапазон ячеек.
  • Перенесите данные из набора записей ADO в диапазон ячеек с помощью метода Копифромрекордсет.
  • Создайте объект QueryTable на листе Excel, который содержит результат запроса в источнике данных ODBC или OLEDB.
  • Перенесите данные в буфер обмена, а затем вставьте содержимое буфера обмена в лист Excel.
    Вы также можете использовать несколько методов, которые не требуют автоматизации для передачи данных в Excel. Если вы используете серверную программу, это может быть хорошим подходом к отходящей обработке данных от клиентов.

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

  • Перенесите данные в текстовый файл с разделителями табуляцией или с разделителями запятыми, который Excel будет впоследствии разбить на ячейки на листе.
  • Перенесите данные на лист с помощью ADO.NET.
  • Передача XML-данных в Excel (версии 2002 и 2003) для предоставления данных, отформатированных и упорядоченных по строкам и столбцам.

В этой статье приводится обсуждение и пример кода для каждого из этих методов. В разделе "Создание полного примера проекта Visual C# 2005 или Visual C# .NET" Далее в этой статье показано, как создать программу Visual C# .NET, которая выполняет каждый из этих методов.

Способ

Использование автоматизации для передачи ячейки данных по ячейкам

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

Передача данных по ячейкам является приемлемым подходом при наличии небольшого количества данных. У вас есть гибкие возможности для размещения данных в любом месте книги, и вы можете форматировать ячейки в зависимости от времени выполнения. Однако не рекомендуется использовать этот подход, если вы используете большое количество данных для передачи в книгу Excel. Каждый объект диапазона, полученный во время выполнения, вызывается запросом к интерфейсу, что означает медленную передачу данных. Кроме того, Microsoft Windows 95, Microsoft Windows 98 и Microsoft Windows Millennium Edition (Me) имеют ограничение до 64 КБ в запросах интерфейса. Если количество запросов интерфейса превышает 64 КБ, сервер автоматизации (Excel) может перестать отвечать на запросы или сообщения об ошибках, указывающие на недостаток памяти.

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

Для получения дополнительных сведений, а также для примера автоматизации Excel с помощью Visual C# .NET щелкните номер статьи ниже, чтобы просмотреть статью в базе знаний Майкрософт:

302084 практическое руководство: Автоматизация Microsoft Excel из Microsoft Visual C# .NET

Использование автоматизации для переноса массива данных в диапазон листа

Вы можете перенести массив данных в диапазон из нескольких ячеек за один раз:

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

Этот код представляет два запроса интерфейса: один для объекта Range, возвращаемого методом Range, и другой для объекта Range, который возвращает метод Resize. В отличие от переноса ячейки данных по ячейке, необходимо запросить интерфейсы 300 для объектов Range. Если это возможно, вы можете воспользоваться преимуществами для массового переноса данных и уменьшения количества запросов к интерфейсу.

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

302096 практическое руководство: Автоматизация Excel с помощью Visual C# .NET для заполнения или получения данных в диапазоне с помощью массивов

Использование автоматизации для переноса набора записей ADO в диапазон листа

Объектные модели для Excel 2000, Excel 2002 и Excel 2003 предоставляют метод Копифромрекордсет для переноса набора записей ADO в диапазон листа. В приведенном ниже коде показано, как автоматизировать Excel для переноса содержимого таблицы Orders в образце базы данных Northwind с помощью метода Копифромрекордсет:

Копифромрекордсет работает только с объектами Recordset ADO. Вы не можете использовать набор данных, созданный с помощью ADO.NET, с помощью метода Копифромрекордсет. Несколько примеров в следующих разделах демонстрируют порядок переноса данных в Excel с помощью ADO.NET.

Использование автоматизации для создания объекта QueryTable на листе

Объект QueryTable представляет таблицу, созданную на основе данных, возвращаемых из внешнего источника данных. При автоматизации Excel можно создать QueryTable, предоставив строку подключения к OLE DB или источнику данных ODBC, а также строку SQL. Excel создает набор записей и вставляет набор записей на лист в указанном расположении. Объекты QueryTable имеют следующие преимущества по сравнению с методом Копифромрекордсет:

  • Excel обрабатывает создание набора записей и его расположение на листе.
  • Вы можете сохранить запрос с помощью объекта QueryTable и обновить его позже, чтобы получить обновленный набор записей.
  • Когда на лист добавляется новый QueryTable, вы можете указать, что данные, которые уже существуют в ячейках листа, будут сдвинуты для обработки новых данных (Дополнительные сведения см. в свойстве Рефрешстиле).

В приведенном ниже коде показано, как автоматизировать Excel 2000, Excel 2002 или Excel 2003 для создания нового QueryTable на листе Excel с помощью данных из учебной базы данных Northwind:

Использование буфера обмена Windows

Вы можете использовать буфер обмена Windows для переноса данных на лист. Чтобы вставить данные в несколько ячеек на листе, можно скопировать строку, в которой столбцы разделяются символами ТАБУЛЯЦИи, а строки — символами возврата каретки. В приведенном ниже коде показано, как Visual C# .NET может использовать буфер обмена Windows для передачи данных в Excel:

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

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

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

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

Передача данных на лист с помощью ADO.NET

С помощью поставщика OLE DB для Microsoft Jet можно добавлять записи в таблицу из существующей книги Excel. Таблица в Excel — это всего лишь диапазон ячеек; диапазон может иметь определенное имя. Как правило, первая строка диапазона содержит заголовки (или имена полей), а все последующие строки в диапазоне содержат записи.

Приведенный ниже код добавляет две новые записи в таблицу в Book7. xls. В этом случае таблицей является Лист1:

При добавлении записей с помощью ADO.NET, как показано в этом примере, сохраняется форматирование книги. Каждая запись, добавляемая в строку, помещает ее в формат перед строкой.

Для получения дополнительных сведений об использовании ADO.NET щелкните номера статей, приведенные ниже, чтобы просмотреть статьи базы знаний Майкрософт:

306636 практическое руководство: подключение к базе данных и выполнение команды с помощью ADO.NET и Visual C# .NET

314145 практическое руководство по заполнению объекта DataSet из базы данных с помощью Visual C# .NET

307587 практическое руководство: обновление базы данных из объекта DataSet с помощью Visual C# .NET

Для получения дополнительных сведений об использовании поставщика OLEDB для Jet с источниками данных Excel щелкните номера статей ниже, чтобы просмотреть статьи базы знаний Майкрософт:

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

257819 практическое руководство: использование ADO с данными Excel из Visual Basic или VBA

Передача XML-данных (Excel 2002 и Excel 2003)

Excel 2002 и 2003 могут открыть любой XML-файл с правильным форматом. XML-файлы можно открыть непосредственно с помощью команды открыть в меню файл или программным путем с помощью методов Open и OpenXML коллекции книги. Если вы создаете XML-файлы для использования в Excel, вы также можете создать таблицы стилей для форматирования данных.

Создание полного примера проекта Visual C# .NET

Создание новой папки с именем К:\ексцелдата. В этом примере программа будет хранить книги Excel в этой папке.

Создайте новую книгу для примера, в который необходимо выполнить запись:

  1. Создайте новую книгу в Excel.
  2. На листе Sheet1 новой книги введите FirstName в ячейке a1 и LastName в ячейке B1.
  3. Выберите a1: B1.
  4. В меню Вставка выберите пункт имя, а затем — команду определить. Введите имя MyTable и нажмите кнопку ОК.
  5. Сохранение книги в виде C:\Exceldata\Book7.xls.
  6. Закройте Excel.

Запустите Microsoft Visual Studio 2005 или Microsoft Visual Studio .NET. В меню Файл выберите пункт Создать и затем пункт Проект. В разделе проекты Visual C# или Visual c# выберите приложение Windows. По умолчанию форма Form1 создана.

Добавьте ссылку на библиотеку объектов Excel и основную сборку взаимодействия ADODB. Для этого выполните следующие действия:

  1. On the Project menu, click Add Reference.
  2. На вкладке Сеть найдите ADODB и нажмите кнопку Выбрать.

Обратите внимание, что в Visual Studio 2005 нет необходимости щелкать кнопку выбрать.
3. На вкладке COM найдите объектная Библиотека Microsoft Excel 10,0 или библиотека объектов Microsoft Excel 11,0, а затем нажмите кнопку Выбрать.

Обратите внимание, что в Visual Studio 2005 нет необходимости щелкать кнопку выбрать.

Примечание Если вы используете Microsoft Excel 2002, а вы еще не сделали это, корпорация Майкрософт рекомендует скачать и установить основные сборки взаимодействия Microsoft Office XP (PIA).

В диалоговом окне Добавление ссылок нажмите кнопку ОК, чтобы принять выбранные параметры.

Добавление элемента управления "поле со списком" и элемента управления "Кнопка" в форму Form1.

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

  1. В представлении конструктора для Form1.cs дважды щелкните элемент Form1.

Обработчик события Load для формы создан и отображается в Form1.cs.
2. В меню Вид выберите конструктор, чтобы переключиться в режим конструктора.
3. Дважды щелкните элемент Button1.

Обработчик события нажатия кнопки создается и отображается в Form1.cs.

В Form1.cs замените приведенный ниже код.

Обратите внимание, что необходимо изменить код в Visual Studio 2005. По умолчанию Visual C# добавляет одну форму в проект при создании проекта Windows Forms. Форма называется Form1. Два файла, представляющие форму, называются Form1.cs и Form1.designer.cs. Вы пишете код в Form1.cs. Файл Form1.designer.cs — это место, в котором конструктор Windows Forms записывает код, который реализует все действия, выполненные путем перетаскивания элементов управления с панели инструментов.

Для получения дополнительных сведений о конструкторе Windows Forms в Visual C# 2005 посетите следующий веб-сайт Microsoft Developer Network (MSDN):

Создание проекта (Visual C#) Примечание Если вы не устанавливали Office в папку по умолчанию (C:\Program Files\Microsoft Office), измените значение константы m_strNorthwind в образце кода, чтобы оно использовало путь установки для Northwind. mdb.

Добавьте следующие директивы using в директивы using в Form1.cs:

Нажмите клавишу F5 для сборки и запуска примера.

Ссылки

Для получения дополнительных сведений посетите следующий веб-сайт Майкрософт:

Как сохранить excel в c

Аннотация: В главе представлены собственные практические наработки автора по выводу информации из приложений, написанных в Visual Studio 2003/2005/2008 на C# в Excel. Все коды отлажены и неоднократно использовались. Вопросы, которые остались не затронуты, были до сих пор не востребованы в практической работе автора.

Автор никому не давал права перепечатывать материал, но он 1:1 или кусками появляется на многих сайтах. Воровство в интернете к сожалению есть!

Введение. Решение и выбор способа связывания

Прежде чем приступить к рассмотрению поставленных вопросов, создадим новый простой проект (Рис.1.) с именем AppWordExcel (или любым другим). Поместим на панели приложения три контрола Button. Свойства Tag контролов установим, соответственно, в значения 1, 2 и 3. Выберем способ "раннего связывания" для сервера автоматизации Excel (см. Параграф 1. этого раздела). При написании кода будем использовать .Net сборки взаимодействия с приложениями Microsoft Office. Напомним, что при использовании импортирования библиотеки типов Com объекта и добавлении ссылки на него в Solutation Explorer (References, вкладка Com), нам сразу становится доступно пространство имен объекта (в данном случае Excel). При использовании .Net сборок взаимодействия с приложениями Microsoft Office нам, после добавления ссылки на Microsoft.Office.Interop.Excel (References, вкладка .Net), потребуется введение алиаса пространства имен Excel:

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

Рис.1. Проект решения AppWordExcel

Создадим обработчик нажатия для кнопки 1 и замкнем на него обработчики нажатия всех кнопок. Запишем следующий, общий для всех примеров, приводимых ниже, код:

В case 1 будем размещать код, в котором выполняется какое-либо действие по старту Excel и выводу информации, в case 2 — дополнительные действия и действия при закрытии приложения, в default — поместим код выхода из приложения.

Параграф 1. Запуск и закрытие Excel из приложения на C#

Объекты, которыми оперирует сервер 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").

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

Следующий код позволяет выполнять запуск Excel и его закрытие при нажатии соответственно кнопок 1 и 2.

Параграф 2. Создание рабочих книг

Вторым в иерархии объектов Excel.Application является объект Workbook. Информация об объектах Workbook хранится в виде ссылок на открытые рабочие книги в свойстве Workbooks. Книга в приложение может быть добавлена только через добавление ссылки в совокупность Workbooks, а ссылка на открытую книгу может быть получена различным образом (по имени, номеру, как ссылка на активную книгу).

Рассмотрим создание двух рабочих книг из 3х и 5ти листов.

Свойство SheetsInNewWorkbook возвращает или устанавливает количество листов, автоматически помещаемых Excel в новые рабочие книги.

В качестве параметра методу Add можно передать имя шаблона рабочей книги, однако, в этом случае мы привязываемся к пути, по которому инсталлированы приложения MicrosoftOffice. В примере использован другой способ: Type — класс декларации типов, Type.Missing — отсутствие значения. Некоторые методы Excel принимают необязательные параметры, которые не поддерживаются в C#. Для решения этой проблемы в коде на C# требуется передавать поле Type.Missing вместо каждого необязательного параметра, который является ссылочным типом (reference type). Кроме того, (этого нет в документации) при задании в методе ADD чисел от 1 до 7 будет создана книга с одним листом (1, 6), диаграмма(2), макрос (3, 4) и книга с четырьмя листами (5).

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

Книги могут быть не только добавлены, но и закрыты. Следующие вызовы закрывают все или конкретную рабочую книгу:

Остановимся более подробно на втором методе. Его параметры:

Параграф 3. Сохранение документов

3.1. Подготовка к сохранению документов

Документы Excel можно сохранить программно и обычным для Excel способом. В любом случае перед выходом из Excel необходимо вызвать метод Quit. Если свойство Excel.Application DisplayAlerts имеет значение true, Excel предложит сохранить несохраненные данные, если после старта в документ были внесены какие либо изменения. Excel автоматически не возвращает это свойство в значение по умолчанию, поэтому его рекомендуется возвращать в исходное состояние.

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

Теперь, если выйти на конкретную книгу, как показано в примере, приведенном ниже, и присвоить свойству Saved объекта Workbook значение true, Excel согласно документации не должен предлагать сохранение независимо от того, были или нет изменения в данной книге (к сожалению, это не всегда работает).

На некоторых вариациях версий Windows и Office запрос на сохранение может все равно присутствовать, хотя мы, и отключаем его в свойстве Saved.

Из примера видно, что кроме Item, у набора Workbooks, как и у всех наборов в Microsoft Office, есть свойство Count, которое возвращает число элементов в наборе (в данном случае — объектов Workbook).

Следующий вопрос, — в каком формате сохранять документ. Для получения формата открываемого документа и задания формата сохраняемого служит свойство Excel.Application DefaultSaveFormat. Свойство имеет много значений типа XlFileFormat (какие могут быть легко посмотреть в диалоговом окне "Сохранение документа" в поле "Тип файла", открыв Excel и выбрав пункт меню "Файл" | "Сохранить как").

Например, в case 1 допишем строчку:

и в окне диалога сохранения файла будет установлен тип файла "Web страница".

3.2. Сохранение документа

Для сохранения документов можно использовать методы Excel.Workbook Save и SaveAs. Метод Save сохраняет рабочую книгу в папке "Мои документы" с именами, присваиваемыми документу по умолчанию ("Книга1.xls", "Книга2.xls" . ) или в директорию и с именем под которым документ уже был сохранен.

Изменим код в case 2, на следующий и продемонстрируем пример сохранения по умолчанию:

При значении свойства DisplayAlerts=true Excel будет спрашивать — записать ли сохраняемый документ поверх существующего, при значении false — нет.

Метод SaveAs позволяет сохранить документ с указанием имени, формата файла, пароля, режим доступа и т. д. Данный метод, как и метод Save, присваивает свойству Saved значение true. Метод SaveAs имеет следующий синтаксис:

Для доступа к книге используются значение AccessMode xlShared — общая рабочая книга, xlExclusive — монопольный доступ или xlNoChange — запрет изменения режима доступа.

Параметр ConflictResolution — способ разрешения конфликтов при одновременном внесении несколькими пользователями изменений в один документ — может иметь значения: xlUserResolution — отображение диалогового окна разрешения конфликтов (параметр по умолчанию), xlLocalSessionChanges — принятие изменений, внесенных пользователем или xlOtherSessionChanges — принятие изменений, внесенных другими пользователями.

Следующий пример сохраняет открытые выше документы в формате .html и .xls, причем большинство параметров для первого документа передаются как не имеющие значения Type.Missing, для второго документа использовано паролирование и запрет изменения режима доступа (Excel.XlSaveAsAccessMode.xlNoChange):

Рис.2. Вызов документа с установленным паролем на доступ и запись

Для сохранения документа может быть использован метод SaveCopyAs, который сохраняет копию рабочей книги в файле. Следующий пример, использующий метод SaveCopyAs полностью аналогичен примеру, использующему метод SaveAs при задании всех параметров как Type.Missing.

Метод SaveAs не производит преобразование документа и, поэтому, приведенный код вместо Web страницы a.html сохранит копию xls документа (изменит только расширение).

Параграф 4. Открытие существующего документа

Для открытия существующего документа основным методом является метод Open набора Excel.Workbooks. Для открытия текстовых файлов как рабочих книг, баз данных, файлов в формате .XML, используются методы OpenText, OpenDatabase или OpenXml. Об использовании методов OpenDatabase и OpenXml речь будет вестись в других темах. В данном параграфе рассмотрим метод Open.

После выполнения предыдущего примера у нас осталось два рабочих файла a.html и a.xls, которые мы и откроем как две рабочие книги в Excel, изменив код в case 1:

Метод Open имеет много параметров. Но, большинство из них, как видно из примера, необязательны. Рассмотрим параметры метода Open:

UpdateLinks — позволяет задать способ обновления ссылок в файле. Если данный параметр не задан, то выдается запрос на указание метода обновления. Значения: 0 — не обновлять ссылки; 1 — обновлять внешние ссылки; 2 — обновлять только удаленные ссылки; 3 — обновлять все ссылки.

Format — при работе с текстовыми файлами определяет символ разделителя для полей, заносимых в различные ячейки документа. Значения параметра: 1 — символ табуляции; 2 — запятая; 3 — пробел; 4 — точка с запятой; 5 — нет разделителя; 6 — другой символ, определенный в параметре Delimiter.

Приведем еще один пример — пример открытия текстового файла с использованием метода OpenText. Метод загружает в Excel текстовый файл как рабочую книгу с одиночным листом и производит его парсинг по ячейкам листа в соответствии с параметрами.

Рассмотрим параметры метода OpenText:

Системный десятичный разделитель

Системный разделитель групп (тысяч)

Из таблицы видно, что для достижения требуемого вида числа необходимо будет после импорта текста изменить формат ячейки (числового формата в 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. (фрагмент слева).

REDMOND

Однако, как и в приложении 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:

События объекта Application:

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 (открыта рабочая книга).

события объекта Workbook:

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

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

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

события объекта Worksheet:

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г.

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

REDMOND

Ссылка на основную публикацию