Еще по теме:
1. Тема: Выгрузка с форматированием: задать диапазон выгружаемых данных
2. Тема: Пример записи / чтения с Microsoft Excel в VB
Способы передачи данных с Visual Basic в Excel
Источник: MSDN
В данной статье рассматриваются способы передачи данных в Microsoft Excel из приложения Microsoft Visual Basic. В статье также представлены преимущества и недостатки каждого из способов, что позволяет пользователю выбрать наиболее подходящий способ для конкретной ситуации.
Дополнительная информация
Чаще всего для передачи данных в книгу Excel используется программирование объектов (автоматизация). Этот способ обладает наибольшим спектром возможностей для указания местоположения данных в книге Excel, а также обеспечивает возможность форматирования книги и настройки различных параметров во время выполнения. Программирование объектов позволяет использовать для передачи данных несколько подходов:
- Передача данных по одной ячейке
- Передача массива данных в диапазон ячеек
- Передача набора записей ADO в диапазон ячеек с помощью способа CopyFromRecordset
- Создание в листе Excel объекта QueryTable, содержащего результаты запроса по источнику данных ODBC или OLEDB
- Передача данных в буфер обмена с последующей вставкой содержимого буфера обмена в лист Excel
Также существуют способы передачи данных в Excel, не требующие программирования объектов. При работе с серверным приложением рекомендуется освободить клиентов от большого объема обрабатываемых данных. Ниже приведены способы передачи данных, не использующие программирование объектов.
- Передача данных в текстовый файл, использующий запятые или знаки табуляции в качестве разделителей, который Excel впоследствии может разобрать на ячейки листа
- Передача данных на лист Excel с помощью ADO
- Передача данных в Excel с помощью динамического обмена данными (DDE)
В следующих разделах приведены дополнительные сведения о каждом решении.
Примечание. При использовании Microsoft Office Excel 2007 для сохранения книги Excel 2007 можно использовать новый формат файла (XSLX). Для этого найдите следующую строку кода в приведенных ниже примерах:
Visual Basic
oBook.SaveAs "C:Book1.xls"
Замените этот код следующей строкой кода:
Visual Basic
oBook.SaveAs "C:Book1.xlsx"
Кроме того, база данных «Борей» не входит в состав Office 2007 по умолчанию. Тем не менее базу данных «Борей» можно загрузить с веб-узла русской версии Microsoft Office Online.
Перенос данных по одной ячейке с помощью автоматизации
Автоматизация позволяет передавать данные на лист Excel по одной ячейке:
Visual Basic | ||
|
Передача данных по одной ячейке является оптимальным способом передачи небольших объемов данных. Этот способ позволяет помещать данные в любом месте рабочей книги и форматировать ячейки во время выполнения. Однако этот способ не рекомендуется применять при передаче больших объемов данных в книгу Excel. Каждый объект Range, получаемый во время выполнения, вызывает запрос к интерфейсу, поэтому такой способ передачи данных может оказаться очень медленным. Кроме того, в Microsoft Windows 95 и Windows 98 существует ограничение на запросы к интерфейсу, составляющее 64 КБ. При превышении лимита в 64 КБ сервер автоматизации (Excel) может перестать отвечать на запросы или может отображаться сообщение о нехватке памяти. Это ограничение для Windows 95 и Windows 98 рассматривается в следующей статье базы знаний Майкрософт:
216400 Автоматизация COM может привести к зависанию клиентского приложения в Win 95/98 (Эта ссылка может указывать на содержимое полностью или частично на английском языке).
Таким образом, передача данных по одной ячейке допустима только для небольших объемов данных. Для передачи больших объемов данных в Excel следует использовать один из способов, описанных ниже.
Примеры сценариев для автоматизации Excel см. в следующей статье базы знаний Майкрософт:
219151 Использование Visual Basic для автоматизации Microsoft Excel
Передача массива данных в диапазон ячеек листа с помощью программирования объектов
Массив данных можно одновременно передать в диапазон ячеек листа:
Visual Basic | ||
|
Передача большого объема данных с помощью массива происходит значительно быстрее, чем передача данных по одной ячейке. Обратите внимание на строку из приведенного выше сценария, которая одновременно передает данные в 300 ячеек листа:
Visual Basic
oSheet.Range("A2").Resize(100, 3).Value = DataArray
Эта строка представляет всего два запроса к интерфейсу (один для объекта Range, возвращаемого методом Range, и один для объекта Range, возвращаемого методом Resize). При этом при передаче данных по одной ячейке потребовалось бы 300 запросов к интерфейсу для объектов Range. Поэтому по возможности рекомендуется выполнять массовый перенос данных, чтобы сократить число запросов к интерфейсу.
Перенос набора записей ADO в диапазон листа с помощью автоматизации
В Excel 2000 появился метод CopyFromRecordset, позволяющий переносить наборы данных ADO (или DAO) в диапазон ячеек листа. Приведенный ниже сценарий является примером автоматизации Excel 2000, Excel 2002 или Office Excel 2003 для переноса содержимого таблицы Orders образца базы данных «Борей» с помощью метода CopyFromRecordset.
Visual Basic | ||
|
Примечание. При использовании версии базы данных «Борей» для Office 2007 необходимо заменить в примере следующую строку кода:
Visual Basic | ||
|
Замените эту строку кода следующей строкой:
Visual Basic | ||
|
В Excel 97 также имеется метод CopyFromRecordset, однако его можно использовать только для набора записей DAO. CopyFromRecordset в Excel 97 не поддерживает ADO.
Дополнительные сведения об использовании ADO и метода CopyFromRecordset см. в следующей статье базы знаний Майкрософт:
246335 Использование программирования объектов для передачи данных из набора записей в Excel
(Эта ссылка может указывать на содержимое полностью или частично на английском языке)
Создание объекта QueryTable с помощью программирования объектов
Объект QueryTable представляет собой таблицу, содержащую данные, возвращенные из внешнего источника. При автоматизации Microsoft Excel для создания объекта QueryTable следует просто указать строку подключения к источнику данных OLEDB или ODBC в строке SQL. Далее Excel генерирует набор записей и вставляет его в указанное местоположение на листе. Использование объекта QueryTables обладает несколькими преимуществами по сравнению с использованием метода CopyFromRecordset:
- Созданием набора записей и его размещением на листе управляет Excel.
- Запрос можно сохранить в объекте QueryTable таким образом, чтобы в дальнейшем его можно было обновить и получить обновленный набор записей.
- При добавлении нового объекта QueryTable к листу можно переместить данные, уже находящиеся в ячейках листа, чтобы свободно разместить новые данные (см. свойство RefreshStyle).
Ниже приводится пример сценария, позволяющего автоматизировать Excel 2000, Excel 2002 или Office Excel 2003 для создания нового объекта QueryTable на листе Excel с данными из базы Northwind:
Visual Basic | ||
|
Использование буфера обмена
Буфер обмена Windows также может использоваться как механизм передачи данных на лист Excel. Чтобы вставить данные в несколько ячеек листа, можно скопировать строку, в которой столбцы разделены знаками табуляции, а строки – символами возврата каретки. В приведенном ниже сценарии показано, как Visual Basic может использовать буфер обмена для передачи данных в Excel:
Visual Basic | ||
|
Создание текстового файла с разделителями, который Excel может разобрать на строки и столбцы
Excel может открывать файлы с разделителями-запятыми и знаками табуляции и разбирать данные по ячейкам. Этим можно воспользоваться при необходимости передачи большого объема данных в лист Excel с минимальным использованием автоматизации. Этот подход рекомендуется для приложений типа клиент-сервер, поскольку текстовый файл может генерироваться серверным приложением. Затем текстовый файл можно открыть с помощью клиентского приложения, при необходимости используя автоматизацию.
Ниже приведен сценарий, иллюстрирующий создание текстового файла с разделителями-запятыми из набора записей ADO:
Visual Basic | ||
|
Примечание. При использовании версии базы данных «Борей» для Office 2007 необходимо заменить в примере следующую строку кода:
Visual Basic | ||
|
Замените эту строку кода следующей строкой:
Visual Basic | ||
|
Если файл имеет расширение CSV, Excel открывает его без отображения мастера импорта текста и по умолчанию принимает, что в файле используются разделители-запятые. Если же файл имеет расширение TXT, Excel автоматически разбирает его, используя в качестве разделителей знаки табуляции.
В приведенном выше примере запуск Excel осуществлялся с помощью оператора Shell, а имя файла использовалось как аргумент командной строки. А в этом примере автоматизация не использовалась. Однако при желании можно применить минимум автоматизации, чтобы открыть текстовый файл и сохранить его в формате книги Excel:
Visual Basic | ||
|
Дополнительные сведения об операциях ввода-вывода файлов из приложения Visual Basic см. в следующей статье базы знаний Майкрософт:
172267 RECEDIT.VBP демонстрирует ввод-вывод файлов в Visual Basic recedit.rar
(Эта ссылка может указывать на содержимое полностью или частично на английском языке)
Передача данных на лист Excel с помощью ADO
С помощью Microsoft Jet OLE DB Provider можно добавлять записи в таблицу существующей книги Excel. «Таблицей» в Excel считается диапазон с заданным именем. Первая строка диапазона содержит заголовки (или имена полей), а все последующие строки – записи. Ниже приведен пример создания книги с пустой таблицей MyTable.
Excel 97, Excel 2000 и Excel 2003
1. Откройте новую книгу Excel.
2. Добавьте следующие заголовки в ячейки A1:B1 листа Sheet1:
A1: FirstName B1: LastName
3. Выровняйте ячейку B1 по правому краю.
4. Выделите A1:B1.
5. В меню Вставка выберите Имя, а затем Присвоить. Введите имя MyTable и нажмите кнопку OK.
6. Сохраните новую книгу как C:Book1.xls и закройте Excel.
Чтобы добавить записи в таблицу MyTable с помощью ADO, понадобится сценарий приблизительно следующего вида:
Visual Basic | ||
|
Excel 2007
1. В Excel 2007 создайте книгу.
2. Добавьте следующие заголовки в ячейки A1:B1 листа «Лист1»:
A1: FirstName B1: LastName
3. Выровняйте ячейку B1 по правому краю.
4. Выделите диапазон A1:B1.
5. На ленте откройте вкладку Формулы и выберите пункт Определить имя. Введите имя MyTable и нажмите кнопку ОК.
6. Сохраните новую книгу как C:Book1.xlsx и закройте Excel.
Чтобы добавить записи в таблицу MyTable с помощью ADO, используйте код, подобный приведенному ниже.
Visual Basic | ||
|
При подобном добавлении записей в таблицу производится форматирование книги. В приведенном выше примере новые поля, добавляемые в столбец B, выравниваются по правому краю. Каждая запись, добавляемая в строку, форматируется так же, как предыдущая.
Обратите внимание на то, что при добавлении в ячейку или ячейки листа запись заменяет любые данные, находившиеся в этих ячейках ранее; другими словами, строки листа не сдвигаются вниз при добавлении новых записей. Это следует иметь в виду при планировании размещения данных на листе.
Примечание. Обновление данных на листе Excel с помощью ADO или DAO невозможно в среде Visual Basic для приложений в Access после установки пакета обновления 2 (SP2) для Office 2003 или обновления для Access 2002, описанного в статье 904018 базы знаний Майкрософт. Однако этот способ можно использовать в среде Visual Basic для приложений в других приложениях Office, например в Word, Excel и Outlook. Дополнительные сведения см. в следующих статьях базы знаний Майкрософт:
904953 Запрещается вносить изменения, добавлять или удалять данные, источником которых являются книги Excel в Office Access 2003 или в Access 2002
904018 Описание обновления для Access 2002: от 18 октября 2005 г.
Дополнительные сведения об использовании ADO для доступа к книгам Excel см. в следующих статьях базы знаний Майкрософт:
195951 Создание запросов и обновление данных Excel с помощью ADO со страниц ASP
(Эта ссылка может указывать на содержимое полностью или частично на английском языке)
Передача данных в Excel с помощью DDE
Наряду с программированием объектов DDE является способом связи с Excel и передачи данных; однако, в противоположность автоматизации и COM, DDE больше не является часто используемым способом связи с другими приложениями и должен использоваться только при отсутствии других решений.
Для передачи данных в Excel с помощью DDE можно воспользоваться одним из следующих способов:
- LinkPoke для вставки данных в указанный диапазон ячеек
. - LinkExecute для отправки команд, которые будет выполнять Excel.
В приведенном ниже примере показано, как установить связь DDE с Excel таким образом, чтобы модно было поместить данные в ячейки листа и выполнить команды. В этом примере для успешного установления связи DDE с файлом LinkTopic Excel|MyBook.xls книга с именем MyBook.xls уже должна быть открыта в запущенном экземпляре Excel.
Примечание. При использовании Excel 2007 для сохранения книг можно использовать новый формат файла (XLSX). Обязательно обновите имя файла в приведенном ниже примере кода.
Примечание. В данном примере Text1 представляет элемент управления Text Box формы Visual Basic:
Visual Basic | ||
|
При использовании метода LinkPoke с Excel необходимо указать диапазон в формате строка-столбец (R1C1) для LinkItem. Если данные вставляются в несколько ячеек, можно использовать строку, в которой столбцы разделены символами табуляции, а строки – символами возврата каретки.
Если метод LinkExecute используется для выполнения команды в Excel, синтаксис команды должен соответствовать языку Excel Macro Language (XLM). Документация по XLM не входит в состав Excel 97 и более поздних версий. Дополнительные сведения о получении документации по XLM см. в следующей статье базы знаний Майкрософт:
143466 Файл Macro97.exe доступен для загрузки. macro97.rar
(Эта ссылка может указывать на содержимое полностью или частично на английском языке)
DDE не является рекомендуемым способом связи с Excel. Программирование объектов предоставляет больше возможностей и обеспечивает лучший доступ к новым функциям Excel.
Все ссылки MSDN по теме:
Автоматизация COM может привести к зависанию клиентского приложения в Win 95/98
Использование Visual Basic для автоматизации Microsoft Excel
Использование программирования объектов для передачи данных из набора записей в Excel
RECEDIT.VBP демонстрирует ввод-вывод файлов в Visual Basic
Запрещается вносить изменения, добавлять или удалять данные, источником которых являются книги Excel в Office Access 2003 или в Access 2002
Описание обновления для Access 2002: от 18 октября 2005 г.
Создание запросов и обновление данных Excel с помощью ADO со страниц ASP (Эта ссылка может указывать на содержимое полностью или частично на английском языке)
Документация по XLM
Данный пример демонстрирует работу с файлами Excel через интерфейс доступа к данным ADO (ActiveX Data Objects). Объекты ADO входят в состав Windows, поэтому через данный интерфейс можно получить информацию из xls-файла даже на компьютере без предустановленного пакета Microsoft Office.
Файл данных (xls) содержит таблицу дней рождений знаменитых людей. Программа на языке vbscript (файл с расширением .vbs) ищет совпадающие с сегодняшней датой дни рождения и вывод на экран информационное сообщение. Для запуска просто кликните дважды на vbs-файле. Данные и программа должны быть предварительно сохранены в одной папке.
''''''''''''''''''''''''''''''''''''''''''''''''''''' ' Пример доступа к файлам Excel через интерфейс ADO ' ' © 2011, ExcelFin.ru ''''''''''''''''''''''''''''''''''''''''''''''''''''' const adOpenStatic = 3 const fileXLS = "birthdays_ADO.xls" const sheetData = "Data" dim globalPath, filenameXLS, copyfilenameXLS, conn, result globalPath = Replace(WScript.ScriptFullName, WScript.ScriptName, "") filenameXLS = globalPath & fileXLS copyfilenameXLS = globalPath & "_temp_" & fileXLS OpenConnection_ HandleData_ CloseConnection_ ShowResult_ ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' sub ShowResult_ WScript.Echo "Сегодня: " & FormatDateTime(Date(), 2) & vbCrLf & "День рождения: " & vbCrLf & result end sub ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' sub HandleData_ dim rsData dim sSQL result = "" sSQL = "SELECT * FROM [" & sheetData & "$A1:B]" & _ " WHERE [Дата] is not null" set rsData = CreateObject("ADODB.Recordset") rsData.Open sSQL, conn, adOpenStatic do while not rsData.EOF if (Month(Date())= Month(rsData.Fields("Дата"))) And _ (Day(Date())= Day(rsData.Fields("Дата"))) then result = result & FormatDateTime(rsData.Fields("Дата"), 2) & " - " & rsData.Fields("Имя") & vbCrLf end if rsData.MoveNext loop rsData.Close set rsData = Nothing if (result = "") then result = "нет данных" end if end sub ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' sub OpenConnection_ Dim fso Set fso = CreateObject("Scripting.FileSystemObject") fso.CopyFile filenameXLS, copyfilenameXLS, true Set fso = nothing set conn = CreateObject("ADODB.Connection") conn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & _ copyfilenameXLS & _ ";Extended Properties=""Excel 8.0;HDR=Yes;IMEX=2"";" end sub sub CloseConnection_ conn.Close set conn = Nothing end sub
В процедуре OpenConnection_ происходит предварительное создание копии файла данных. Это позволяет работать с открытым файлом xls.
В строке SQL таблица данных обозначается именем листа и координатами в формате A1, но последнюю строку диапазона можно не указывать.
»»»»»»»»»»»»»»»»»»»»»»»»»»’
‘ Пример доступа к файлам Excel через интерфейс ADO
‘
‘ © 2011, ExcelFin.ru
»»»»»»»»»»»»»»»»»»»»»»»»»»’
const adOpenStatic = 3
const fileXLS = «birthdays_ADO.xls»
const sheetData = «Data»
dim globalPath, filenameXLS, copyfilenameXLS, conn, result
globalPath = Replace(WScript.ScriptFullName, WScript.ScriptName, «»)
filenameXLS = globalPath & fileXLS
copyfilenameXLS = globalPath & «_temp_» & fileXLS
OpenConnection_
HandleData_
CloseConnection_
ShowResult_
»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»’
sub ShowResult_
WScript.Echo «Сегодня: » & FormatDateTime(Date(), 2) & vbCrLf & «День рождения: » & vbCrLf & result
end sub
»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»’
sub HandleData_
dim rsData
dim sSQL
result = «»
sSQL = «SELECT * FROM [» & sheetData & «$A1:B]» & _
» WHERE [Дата] is not null»
set rsData = CreateObject(«ADODB.Recordset»)
rsData.Open sSQL, conn, adOpenStatic
do while not rsData.EOF
if (Month(Date())= Month(rsData.Fields(«Дата»))) And _
(Day(Date())= Day(rsData.Fields(«Дата»))) then
result = result & FormatDateTime(rsData.Fields(«Дата»), 2) & » — » & rsData.Fields(«Имя») & vbCrLf
end if
rsData.MoveNext
loop
rsData.Close
set rsData = Nothing
if (result = «») then
result = «нет данных»
end if
end sub
»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»’
sub OpenConnection_
Dim fso
Set fso = CreateObject(«Scripting.FileSystemObject»)
fso.CopyFile filenameXLS, copyfilenameXLS, true
Set fso = nothing
set conn = CreateObject(«ADODB.Connection»)
conn.Open «Provider=Microsoft.Jet.OLEDB.4.0;Data Source=» & _
copyfilenameXLS & _
«;Extended Properties=»»Excel 8.0;HDR=Yes;IMEX=2″»;»
end sub
sub CloseConnection_
conn.Close
set conn = Nothing
end sub
Смотри также
» Пересчет отдельных формул в рабочей книге
Типичная проблема при работе с большими или очень большими файлами Excel — это слишком сильное замедление при выполнении любых расчетов….
» Класс сохранения настроек Excel
В данной статье описывается небольшой, но очень удобный класс для сохранения и автоматического восстановления таких параметров…
» Основные принципы оптимизации работы в электронных таблицах
Знание специальных приемов работы в электронных таблицах Excel позволяет в разы сократить время разработки моделей, повысить…
» Надстройки Excel
Те, кто программирует на VBA для Excel, в определенный момент задумываются над распространением своих приложений в качестве независимых…
» Автоматизация в Excel
Создание программного кода для автоматизации определенных процедур открывает практически безграничные возможности по развитию и…
This step-by-step guide describes how to connect to Microsoft Excel, retrieve sheet data, and enable editing of the data using the DBGrid. You’ll also find a list of the most common errors that might appear in the process, plus how to deal with them.
What’s Covered Below:
- Methods for transferring data between Excel and Delphi. How to connect to Excel with ADO (ActiveX Data Objects) and Delphi.
- Creating an Excel spreadsheet editor using Delphi and ADO
- Retrieving the data from Excel. How to reference a table (or range) in an Excel workbook.
- A discussion on Excel field (column) types
- How to modify Excel sheets: edit, add and delete rows.
- Transferring data from a Delphi application to Excel. How to create a worksheet and fill it with custom data from an MS Access database.
How to Connect to Microsoft Excel
Microsoft Excel is a powerful spreadsheet calculator and data analysis tool. Since rows and columns of an Excel worksheet closely relate to the rows and columns of a database table, many developers find it appropriate to transport their data into an Excel workbook for analysis purposes; and retrieve data back to the application afterwards.
The most commonly used approach to data exchange between your application and Excel is Automation. Automation provides a way to read Excel data using the Excel Object Model to dive into the worksheet, extract its data, and display it inside a grid-like component, namely DBGrid or StringGrid.
Automation gives you the greatest flexibility for locating the data in the workbook as well as the ability to format the worksheet and make various settings at run time.
To transfer your data to and from Excel without Automation, you can use other methods such as:
- Write data into a comma-delimited text file, and let Excel parse the file into cells
- Transfer data using DDE (Dynamic Data Exchange)
- Transfer your data to and from a worksheet using ADO
Data Transfer Using ADO
Since Excel is JET OLE DB compliant, you can connect to it with Delphi using ADO (dbGO or AdoExpress) and then retrieve the worksheet’s data into an ADO dataset by issuing an SQL query (just like you would open a dataset against any database table).
In this way, all the methods and features of the ADODataset object are available to process the Excel data. In other words, using the ADO components let you build an application that can use an Excel workbook as the database. Another important fact is that Excel is an out-of-process ActiveX server. ADO runs in-process and saves the overhead of costly out-of-process calls.
When you connect to Excel using ADO, you can only exchange raw data to and from a workbook. An ADO connection cannot be used for sheet formatting or implementing formulas to cells. However, if you transfer your data to a worksheet that is pre-formatted, the format is maintained. After the data is inserted from your application to Excel, you can carry out any conditional formatting using a (pre-recorded) macro in the worksheet.
You can connect to Excel using ADO with the two OLE DB Providers that are a part of MDAC: Microsoft Jet OLE DB Provider or Microsoft OLE DB Provider for ODBC Drivers. We’ll focus on Jet OLE DB Provider, which can be used to access data in Excel workbooks through installable Indexed Sequential Access Method (ISAM) drivers.
Tip: See the Beginners Course to Delphi ADO Database Programming if you’re new to ADO.
The ConnectionString Magic
The ConnectionString property tells ADO how to connect to the datasource. The value used for ConnectionString consists of one or more arguments ADO uses to establish the connection.
In Delphi, the TADOConnection component encapsulates the ADO connection object; it can be shared by multiple ADO dataset (TADOTable, TADOQuery, etc.) components through their Connection properties.
In order to connect to Excel, a valid connection string involves only two additional pieces of information — the full path to the workbook and the Excel file version.
A legitimate connection string could look like this:
ConnectionString := 'Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:MyWorkBooksmyDataBook.xls;Extended Properties=Excel 8.0;';
When connecting to an external database format supported by the Jet, the extended properties for the connection needs to be set. In our case, when connecting to an Excel «database,» extended properties are used to set the Excel file version.
For an Excel95 workbook, this value is «Excel 5.0» (without the quotes); use «Excel 8.0» for Excel 97, Excel 2000, Excel 2002, and ExcelXP.
Important: You must use the Jet 4.0 Provider since Jet 3.5 does not support the ISAM drivers. If you set the Jet Provider to version 3.5, you’ll receive the «Couldn’t find installable ISAM» error.
Another Jet extended property is «HDR=». «HDR=Yes» means that there is a header row in the range, so the Jet will not include the first row of the selection into the dataset. If «HDR=No» is specified, then the provider will include the first row of the range (or named range) into the dataset.
The first row in a range is considered to be the header row by default («HDR=Yes»). Therefore, if you have column heading, you do not need to specify this value. If you do not have column headings, you need to specify «HDR=No».
Now that you’re all set, this is the part where things become interesting since we’re now ready for some code. Let’s see how to create a simple Excel Spreadsheet editor using Delphi and ADO.
Note: You should proceed even if you lack knowledge on ADO and Jet programming. As you’ll see, editing an Excel workbook is as simple as editing data from any standard database.
- Главная
- О сайте
- Главная
- Содержание
Категории
—>
рубрики: ADO | Дата: 28 января, 2014
Несмотря на кажущуюся сложность, читать информацию из файлов Excel с помощью интерфейса ADO очень удобно. И по скорости это гораздо быстрее чем через COM соединение.
Прежде всего сформируем строку подключения
СтрокаСоединения = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=ПутьКФайлу;Extended Properties=""Excel 12.0;HDR=YES"";Persist Security Info=False";
Несколько слов о параметрах строки подключения
Provider=Microsoft.ACE.OLEDB.12.0 — здесь мы выбираем провайдера подключения. Зависит от версии Excel. в данном случае используется провайдер для версии MS Excel 2010;
Data Source=ПутьКФайлу — путь к файлу Excel вида «С:musorMyFile.xlsx»;
Extended Properties=»Excel 12.0;HDR=YES» — дополнительные свойства. Первый параметр (Excel 12.0) зависит от версии Excel. HDR=YES означает что первая строка на листе не будет восприниматься как данные. И в этом случае в момент построения запроса данные находящиеся в первой строке воспринимаются как имена полей, что существенно облегчает жизнь при написании запроса, да и в момент обхода выборки обращаться к значениям выборки через имена гораздо удобней. Причем в этом случае абсолютно неважно в каком порядке расположены колонки в файле. Конечно это накладывает определенные ограничения на содержимое ячеек первой строки. Если в ячейке будет «Фамилия, имя, отчество», мы не сможем выбрать в запросе это поле. А вот если «ФИО» или «ФамилияИмяОтчество», то все отработает корректно.
Подключаемся к файлу
Connection = Новый COMОбъект("ADODB.Connection");
Connection.ConnectionString = СтрокаСоединения;
Попытка
Connection.Open();
Исключение
Сообщить ("Не удалось подключиться к файлу Excel" );
Возврат;
КонецПопытки;
Сформируем текст запроса.
Допустим что в нашем файле на листе «Лист1» есть колонки «ФИО» и «ДатаРождения». Текст запроса будет выглядеть следующим образом (обратите внимание на знак $ после имени листа):
ТекстЗапроса =
"SELECT
| Лист.ФИО AS ФИО,
| Лист.ДатаРождения AS ДатаРождения
|FROM
| [Лист1$] as Лист"
;
Выполняем запрос.
Выборка = Новый COMОбъект("ADODB.Recordset");
Попытка
Выборка.Open(ТекстЗапроса, Connection);
Исключение
Сообщить ("Проблемы с выполнением запроса");
Возврат;
КонецПопытки;
Делаем обход выборки и создаем таблицу значений с прочитанными данными.
Таблица = Новый ТаблицаЗначений;
Таблица.Колонки.Добавить("ФИО", Новый ОписаниеТипов("Строка"));
Таблица.Колонки.Добавить("ДатаРождения", Новый ОписаниеТипов("Строка"));
Пока НЕ Выборка.EOF() Цикл
НоваяСтрока = Таблица.Добавить();
НоваяСтрока.ФИО = СокрЛП(Выборка.Fields.Item("ФИО").Value);
ДатаСтрока = СокрЛП(Выборка.Fields.Item("ДатаРождения").Value);
Выборка.MoveNext();
КонецЦикла;
Выборка.Close();
В 1С:Предприятии для работы с Excel доступна технология ADO. Данная технология позволяет читать, записывать данные в файл. Для использования объектов ADO на компьютере должен быть установлен драйвер баз данных Access Database Engine. Этот драйвер входит в состав программы MS Excell. Его так же можно установить отдельно, скачав инсталлятор (AccessDatabaseEngine.exe) с официального сайта Microsoft.
Чтение Excel файла через ADO
Процедура ПрочитатьExcelФайл() Connection
= ОткрытьExcel(ПутьКФайлу);
МассивЛистов = ПолучитьЛистыExcel(Connection);Для каждого Лист Из МассивЛистов Цикл Recordset
= ПрочитатьЛистExcel(Connection, Лист);
Recordset.MoveFirst();Пока НЕ Recordset.Eof() Цикл Значение1
= Recordset.Fields.Item("ИмяКолонки1").Value;
Значение2 = Recordset.Fields.Item("ИмяКолонки2").Value; Recordset
.MoveNext();КонецЦикла;КонецЦикла; ЗакрытьExcel
(Connection);КонецПроцедуры
Функция ОткрытьExcel(ПутьКФайлу) Файл
= Новый Файл(ПутьКФайлу);
Если Файл.Расширение = ".xls" Тогда
ТипФайла = "";
ИначеЕсли Файл.Расширение = ".xlsx" Тогда
ТипФайла = " Xml";
Иначе
ВызватьИсключение "Не поддерживаемый тип файла " + Файл.Расширение;
КонецЕсли; СonnectionString
= "Provider=Microsoft.ACE.OLEDB.12.0; Data Source=" + ПутьКФайлу +
"; Extended Properties=""Excel 12.0" + ТипФайла + ";HDR=Yes;IMEX=1;"""; Connection
= Новый COMОбъект("ADODB.Connection");
Connection.ConnectionString = СonnectionString;
Connection.ConnectionTimeout = 10;
Connection.CursorLocation = 3;
Connection.Open();
Возврат Connection;КонецФункции
Функция ПолучитьЛистыExcel(Connection) SchemaTables
= 20;
RecordsetTables = Connection.OpenSchema(SchemaTables); МассивЛистов
= Новый Массив();Пока НЕ RecordsetTables.Eof() Цикл
МассивЛистов.Добавить( RecordsetTables.Fields("TABLE_NAME").Value );
RecordsetTables.MoveNext();
КонецЦикла; Возврат МассивЛистов;КонецФункции
Функция ПрочитатьЛистExcel(Connection, Лист) Recordset
= Новый COMОбъект("ADODB.Recordset");
Recordset.ActiveConnection = Connection;
Recordset.LockType = 1;
Recordset.CursorType = 3;
Recordset.Open("SELECT * FROM [" + Лист + "]");
Возврат Recordset; КонецФункции
Процедура ЗакрытьExcel(Connection)Если Connection <> Неопределено ТогдаЕсли Connection.State <> 0 Тогда
Connection.Close();
КонецЕсли; Connection
= Неопределено;КонецЕсли;КонецПроцедуры
Примечание:
ADO по умолчанию определяет тип данных столбца по первым 8 строкам (это настраивается). Если в файле есть текстовая колонка и в этих 8 строках размер текста не превышает 255 символов, то для всей колонки будет назначен текстовый тип ограниченный 255 символами. И если встретится значение больше 255, то строка будет обрезана. Для решения этой проблемы нужно в первой строке этой колонки вручную добавить пробелов к тексту, чтобы его длина стала например 300 символов. Тогда тип всей колонки определится как Memo, текст неограниченной длины.
Запись Excel файла
Чтобы записать в файл Excel можно воспользоваться методами объектов Connection или Recordset.
Но удобнее воспользоваться объектом ТабличныйДокумент встроенного языка, метод Записать(<ИмяФайла>, <ТипФайлаТаблицы>).