Провайдеры данных
Для работы с Excel 2003 (.Xls) можно использовать провайдер Microsoft Jet OLE DB 4.0.
SELECT * FROM OPENROWSET(
'Microsoft.Jet.OLEDB.4.0',
'Excel 12.0;Database=d:tmpTimeSheets.xlsx;HDR=YES;IMEX=1',
'SELECT * FROM [Sheet1$]');
Для работы с Excel 2007 (.Xlsx) — Microsoft ACE OLEDB 12.0.
SELECT * FROM OPENROWSET (
'Microsoft.ACE.OLEDB.12.0',
'Excel 12.0;Database=d:tmpTimeSheets.xlsx;HDR=YES;IMEX=1',
'SELECT * FROM [Sheet1$]');
В Windows 10 открыть настройки источников данных ODBC можно написав «Источники данных ODBC» или через Панель управления Администрирование.
Extended Properties
HDR=YES|NO
. HDR=YES означает, что первую строку листа, следует рассматривать как заголовки колонок. Т.о. значение из первой строки можно использовать как имена полей в sql запросах (любых: select, insert, update, delete).IMEX=1|3
. 1 — открыть соединение для чтения. 3 — для записи.
Создание Linked Server в Sql Server для доступа к Excel
EXEC sp_addLinkedServer
@server= N'XLSX_2010',
@srvproduct = N'Excel',
@provider = N'Microsoft.ACE.OLEDB.12.0',
@datasrc = N'd:tmpTimeSheets.xlsx',
@provstr = N'Excel 12.0; HDR=Yes';
GO
После создания связанного сервера можно будет просмотреть имена доступных листов.
Затем, чтобы обратиться к сервису:
SELECT * FROM OPENQUERY (XLSX_2010, 'Select * from [Sheet1$]')
или
SELECT * FROM [XLSX_2010]...[Лист1$]
Обращение к лиcтам, диапазонам, полям
Для обращения к листу из SQL запроса нужно использовать имя листа, например: [Sheet1$]
или [Лист1$]
. Обращение к диапазону: [Sheet1$A16:F16]
.
Вставка данных в произвольное место
Примеры указания диапазона при вставке строк (insert
)
- [table1$B4:E20]
- [table1$S4:U]
- [table1$F:G]
При вставке должны выполняться следующие условия:
- Первая строчка указанного диапазона дожна входить в диапазон ячеек с данными. Чтобы создать на листе диапазон с данными достаточно в углах некоторого прямоугольного диапазона (в левом верхнем и правом нижнем) вписать значение (C4:I7 на скриншоте). Т.е. сама первая строчка указанного в
insert
диапазона данные содержать не обязана, достаточно, чтобы она просто входила в такой диапазон. Иначе возникнет ошибка"This table contains cells that are outside the range of cells defined in this spreadsheet"
- Хвост диапазона должен содержать пустые строки (хотя бы одну).
Пример: Дан лист, где заполнены только 2 ячейки: C4, I7. После выполнения команды INSERT INTO [table1$E6:G] VALUES(2, 'FF','2014-01-03')
результат будет как на скриншоте. Поясним: строка E6:G6 является первой строкой диапазона для вставки. Она входит в заполненный диапазон C4:I7. Поэтому данные были вставлены на следующей пустой строке — 8. Из этого примера становится ясно, что через OleDb нельзя работать с несколькими независимыми диапазонами на одном листе, используя вставку (update
будет работать).
Ошибки
System.Data.OleDb.OleDbException (0x80004005): Operation must use an updateable query
. Соединение открыто для чтение, при этом происходит попытка внести изменения (выполнить insert, update или delete). Решение: открыть соединение для записи, установив свойство провайдера в строке соединения IMEX=3 (см. выше).System.Data.OleDb.OleDbException (0x80004005): "This table contains cells that are outside the range of cells defined in this spreadsheet"
. Такая ошибка возникает при подпытке обновить (update
) или вставить (insert
) значения в диапазоне, в котором отсутствуют данные на листе.- Если нужно произвести запись в определенные ячейки инструкцией update, то
Ссылки
- https://www.codeproject.com/Tips/705470/Read-and-Write-Excel-Documents-Using-OLEDB
- https://stackoverflow.com/questions/36987636/cannot-create-an-instance-of-ole-db-provider-microsoft-jet-oledb-4-0-for-linked
- https://stackoverflow.com/questions/26267224/the-ole-db-provider-microsoft-ace-oledb-12-0-for-linked-server-null
- http://www.ashishblog.com/importexport-excel-xlsx-or-xls-file-into-sql-server/
- https://yoursandmyideas.com/2011/02/05/how-to-read-or-write-excel-file-using-ace-oledb-data-provider/
- https://stackoverflow.com/questions/46373895/how-to-open-a-huge-excel-file-efficiently Несколько способов открыть большой Excel файл, в т.ч. с помощью OleDb.
Содержание
- Как прочитать Excel с помощью OleDB (C#)
- Определение строки подключения
- Строка подключения для Excel 2007 и более новых версий
- Строка подключения для более ранних версий
- Как сделать SQL запрос из таблицы Excel
- How to use Excel with SQL Server linked servers and distributed queries
- Summary
- More Information
- Querying an Excel data source on a linked server
- Using SQL Server Management Studio or Enterprise Manager to configure an Excel data source as a linked server
- Using a stored procedure to configure an Excel data source as a linked server
- Using SQL-DMO to configure an Excel data source as a linked server
- Using SMO to configure an Excel data source as a linked server
- Querying an Excel data source on a linked server
- Querying an Excel data source by using distributed queries
- References
- maestrow / 1-post.md
- Импорт данных из Excel в Microsoft SQL Server на языке T-SQL
- Введение
- Импорт данных из Excel 2003 (файл xls) в Microsoft SQL Server x86
- Шаг 1 – Проверяем наличие провайдера Microsoft.Jet.OLEDB.4.0 на SQL Server
- Шаг 2 – Предоставление прав пользователю на временный каталог
- Шаг 3 – Включаем распределенные запросы на SQL Server
- Шаг 4 – Выполняем SQL запрос, обращение к файлу Excel
- Импорт данных из Excel 2007 и выше (файл xlsx) в Microsoft SQL Server x86
- Шаг 1 – Проверяем наличие провайдера Microsoft.ACE.OLEDB.12.0 на SQL Server
- Шаг 2 – Установка провайдера Microsoft.ACE.OLEDB.12.0 (32-bit)
- Шаг 3 – Предоставление прав пользователю на временный каталог
- Шаг 4 – Включаем распределенные запросы на SQL Server
- Шаг 5 – Настройка провайдера Microsoft.ACE.OLEDB.12.0
- Шаг 6 – Выполняем SQL запрос, обращение к файлу Excel
- Импорт данных из Excel (любые файлы) в Microsoft SQL Server x64
- Шаг 1 – Проверяем наличие провайдера Microsoft.ACE.OLEDB.12.0 на SQL Server
- Шаг 2 – Установка провайдера Microsoft.ACE.OLEDB.12.0 (64-bit)
- Шаг 3 – Включаем распределенные запросы на SQL Server
- Шаг 4 – Настройка провайдера Microsoft.ACE.OLEDB.12.0
- Шаг 5 – Выполняем SQL запрос, обращение к файлу Excel
- Подведение итогов
Как прочитать Excel с помощью OleDB (C#)
В этой статье опишу как прочитать Excel с помощью OleDB.
Иногда бывает нужно вытянуть таблицу из Excel документа, записать в DataTable для последующей обработки.
Не всегда это удобно делать с помощью циклов, поэтому будем считывать таблицы, содержащиеся в документе и запрашивать из них данные с помощью SQL запросов.
Определение строки подключения
Для разных версий Excel будут свои строки подключения.
Строка подключения для Excel 2007 и более новых версий
Для работы с данными версиями необходимо установить Microsoft Access Database Engine 2010 Redistributable.
Так же C# может выбрасывать исключения по поводу недостающих драйверов. В этом случае необходимо скачать соответствующие драйверы с сайта Microsoft.
Строка подключения для более ранних версий
Строка подключения для Excel версии 2003 может иметь такой вид:
Provider=Microsoft.Jet.OLEDB.4.0;Data Source=<0>;Extended Properties=’Excel 8.0;HDR=Yes’
Если C# выбросит исключение, скачайте недостающий драйвер, Visual Studio подскажет, какой.
Как сделать SQL запрос из таблицы Excel
Для выполнения SQL запроса нужно найти таблицу в документе и выполнить к ней запрос:
На этом шаге мы имеем считанные данные из Excel документа в DataTable.
После обработки данных можно сохранить данные в другой документ или оформить сводную таблицу.
Так же можете посмотреть, как работать со сводными таблицами в Excel с помощью C# и редактора VBA, встроенного в Excel.
Источник
How to use Excel with SQL Server linked servers and distributed queries
Summary
Microsoft SQL Server supports connections to other OLE DB data sources on a persistent or an ad hoc basis. The persistent connection is known as a linked server; an ad hoc connection that is made for the sake of a single query is known as a distributed query.
Microsoft Excel workbooks are one type of OLE DB data source that you can query through SQL Server in this manner. This article describes the syntax that is necessary to configure an Excel data source as a linked server, as well as the syntax that is necessary to use a distributed query that queries an Excel data source.
More Information
Querying an Excel data source on a linked server
You can use SQL Server Management Studio or Enterprise Manager, a system stored procedure, SQL-DMO (Distributed Management Objects), or SMO (SQL Server Management Objects) to configure an Excel data source as a SQL Server linked server. (SMO are only available for Microsoft SQL Server 2005.) In all of these cases, you must always set the following four properties:
The name that you want to use for the linked server.
The OLE DB Provider that is to be used for the connection.
The data source or complete path and file name for the Excel workbook.
The provider string, which identifies the target as an Excel workbook. By default, the Jet Provider expects an Access database.
The system stored procedure sp_addlinkedserver also expects the @srvproduct property, which can be any string value.
Note If you are using SQL Server 2005, you must specify a value that is not empty for the Product name property in SQL Server Management Studio or for the @srvproduct property in the stored procedure for an Excel data source.
Using SQL Server Management Studio or Enterprise Manager to configure an Excel data source as a linked server
SQL Server Management Studio (SQL Server 2005)
In SQL Server Management Studio, expand Server Objects in Object Explorer.
Right-click Linked Servers, and then click New linked server.
In the left pane, select the General page, and then follow these steps:
In the first text box, type any name for the linked server.
Select the Other data source option.
In the Provider list, click Microsoft Jet 4.0 OLE DB Provider.
In the Product name box, type Excel for the name of the OLE DB data source.
In the Data source box, type the full path and file name of the Excel file.
In the Provider string box, type Excel 8.0 for an Excel 2002, Excel 2000, or Excel 97 workbook.
Click OK to create the new linked server.
Note In SQL Server Management Studio, you cannot expand the new linked server name to view the list of objects that the server contains.
Enterprise Manager (SQL Server 2000)
In Enterprise Manager, click to expand the Security folder.
Right-click Linked Servers, and then click New linked server.
On the General tab, follow these steps:
In the first text box, type any name for the linked server.
In the Server type box, click Other data source.
In the Provider name list, click Microsoft Jet 4.0 OLE DB Provider.
In the Data source box, type the full path and file name of the Excel file.
In the Provider string box, type Excel 8.0 for an Excel 2002, Excel 2000, or Excel 97 workbook.
Click OK to create the new linked server.
Click to expand the new linked server name to expand the list of objects that it contains.
Under the new linked server name, click Tables. Notice that your worksheets and named ranges appear in the right pane.
Using a stored procedure to configure an Excel data source as a linked server
You can also use the system stored procedure sp_addlinkedserver to configure an Excel data source as a linked server:
As noted above, this stored procedure requires an additional, arbitrary string value for the @srvproduct argument, which appears as «Product name» in the Enterprise Manager and SQL Server Management Studio configuration. The @location and @catalog arguments are not used.
Using SQL-DMO to configure an Excel data source as a linked server
You can use SQL Distributed Management Objects to configure an Excel data source as a linked server programmatically from Microsoft Visual Basic or another programming language. You must supply the same four arguments that are required in the Enterprise Manager and SQL Server Management Studio configuration.
Using SMO to configure an Excel data source as a linked server
In SQL Server 2005, you can use SQL Server Management Objects (SMO) to configure an Excel data source as a linked server programmatically. To do this, you can use Microsoft Visual Basic .NET or another programming language. You must supply the arguments that are required in the SQL Server Management Studio configuration. The SMO object model extends and supersedes the Distributed Management Objects (SQL-DMO) object model. Because SMO is compatible with SQL Server version 7.0, SQL Server 2000, and SQL Server 2005, you can also use SMO for configuration of SQL Server 2000.
Querying an Excel data source on a linked server
After you configure an Excel data source as a linked server, you can easily query its data from Query Analyzer or another client application. For example, to retrieve the rows of data that are stored in Sheet1 of your Excel file, the following code uses the linked server that you configured by using SQL-DMO:
You can also use OPENQUERY to query the Excel linked server in a «passthrough» manner, as follows:
The first argument that OPENQUERY expects is the linked server name. Delimiters are required for worksheet names, as shown above.
You can also obtain a list of all the tables that are available on the Excel linked server by using the following query:
Querying an Excel data source by using distributed queries
You can use SQL Server distributed queries and the OPENDATASOURCE or OPENROWSET function to query infrequently accessed Excel data sources on an ad hoc basis.
Note If you are using SQL Server 2005, make sure that you have enabled the Ad Hoc Distributed Queries option by using SQL Server Surface Area Configuration, as in the following example:
Note that OPENROWSET uses an uncommon syntax for the second («Provider String») argument:
The syntax that an ActiveX Data Objects (ADO) developer may expect to use for the second («Provider String») argument with OPENROWSET:
This syntax raises the following error from the Jet Provider:
Could not find installable ISAM.
Note This error also occurs if you enter DataSource instead of Data Source. For example, the following argument is incorrect:
References
Because SQL Server linked servers and distributed queries use the OLE DB Provider, the general guidelines and cautions about using ADO with Excel apply here.
For more information, click the following article number to view the article in the Microsoft Knowledge Base:
257819 How to use ADO with Excel data from Visual Basic or VBA
For more information about SQL Server Management Objects, visit the following Microsoft Developer Network (MSDN) Web site:
Источник
maestrow / 1-post.md
Для работы с Excel 2003 (.Xls) можно использовать провайдер Microsoft Jet OLE DB 4.0.
Для работы с Excel 2007 (.Xlsx) — Microsoft ACE OLEDB 12.0.
В Windows 10 открыть настройки источников данных ODBC можно написав «Источники данных ODBC» или через Панель управления Администрирование.
- HDR=YES|NO . HDR=YES означает, что первую строку листа, следует рассматривать как заголовки колонок. Т.о. значение из первой строки можно использовать как имена полей в sql запросах (любых: select, insert, update, delete).
- IMEX=1|3 . 1 — открыть соединение для чтения. 3 — для записи.
Создание Linked Server в Sql Server для доступа к Excel
После создания связанного сервера можно будет просмотреть имена доступных листов.
Затем, чтобы обратиться к сервису:
SELECT * FROM OPENQUERY (XLSX_2010, ‘Select * from [Sheet1$]’) или SELECT * FROM [XLSX_2010]. [Лист1$]
Обращение к лиcтам, диапазонам, полям
Для обращения к листу из SQL запроса нужно использовать имя листа, например: [Sheet1$] или [Лист1$] . Обращение к диапазону: [Sheet1$A16:F16] .
Вставка данных в произвольное место
Примеры указания диапазона при вставке строк ( insert )
При вставке должны выполняться следующие условия:
- Первая строчка указанного диапазона дожна входить в диапазон ячеек с данными. Чтобы создать на листе диапазон с данными достаточно в углах некоторого прямоугольного диапазона (в левом верхнем и правом нижнем) вписать значение (C4:I7 на скриншоте). Т.е. сама первая строчка указанного в insert диапазона данные содержать не обязана, достаточно, чтобы она просто входила в такой диапазон. Иначе возникнет ошибка «This table contains cells that are outside the range of cells defined in this spreadsheet»
- Хвост диапазона должен содержать пустые строки (хотя бы одну).
Пример: Дан лист, где заполнены только 2 ячейки: C4, I7. После выполнения команды INSERT INTO [table1$E6:G] VALUES(2, ‘FF’,’2014-01-03′) результат будет как на скриншоте. Поясним: строка E6:G6 является первой строкой диапазона для вставки. Она входит в заполненный диапазон C4:I7. Поэтому данные были вставлены на следующей пустой строке — 8. Из этого примера становится ясно, что через OleDb нельзя работать с несколькими независимыми диапазонами на одном листе, используя вставку ( update будет работать).
Источник
Импорт данных из Excel в Microsoft SQL Server на языке T-SQL
Microsoft SQL Server позволяет встроенными средствами языка T-SQL в SQL запросе импортировать данные из файла Excel в базу данных. Сегодня я подробно расскажу, как это делается, какие условия необходимо выполнить, чтобы эта операция проходила успешно, расскажу про особенности импорта для самых распространённых случаев конфигураций SQL сервера и приведу конкретный порядок действий и практические примеры.
Начну я с того, что импортировать данные из Excel в Microsoft SQL Server можно с помощью «Распределенных запросов» и с помощью «Связанных серверов». Это, скорей всего, Вы уже знаете, так как я уже не раз писал об этом (ссылки на соответствующие материалы указаны чуть выше).
Обратиться к файлу Excel и импортировать данные в Microsoft SQL Server можно с помощью T-SQL инструкций OPENDATASOURCE, OPENROWSET или OPENQUERY.
Однако в вышеупомянутых статьях я упустил несколько важных моментов, одним из которых является то, что у всех конфигурация SQL сервера разная, за счет чего у многих возникают различные проблемы и появляются ошибки во время выполнения распределенных запросов и обращений к связанным серверам. Также я описывал способ загрузки данных из Excel, который на сегодняшний день уже устарел, поэтому сегодня я постараюсь дать Вам немного больше информации о том, как импортировать данные из файла Excel в Microsoft SQL Server на языке T-SQL.
Введение
Итак, как я уже сказал, очень важную роль здесь играет конфигурация SQL сервера, в частности, какая версия сервера установлена, x86 или x64.
Если говорить о последних версиях Microsoft SQL Server 2016-2019, то они только x64 и устанавливаются на 64-разрядные версии Windows.
Исходя из этого я разделю статью на несколько частей, в каждой из которых я расскажу про особенности импорта данных из Excel для самых распространённых случаев конфигураций и приведу конкретный порядок действий.
Для того чтобы быстро узнать, какая версия SQL Server установлена у Вас на компьютере, можете выполнить простой SQL запрос
Обращение к файлу Excel и, соответственно, импорт данных в Microsoft SQL Server происходит с помощью специальных провайдеров (поставщиков). Для работы с Excel в Microsoft SQL Server обычно используются:
Во всех примерах ниже я буду посылать простой запрос SELECT на выборку данных из Excel файла, для того чтобы проверить доступ к данным в файле Excel. Чтобы осуществить импорт данных (загрузить данные в БД), Вы можете использовать любой удобный для Вас способ, например, конструкцию SELECT INTO или INSERT INTO.
Дополнительно рекомендовано закрывать файл Excel во время обращения к нему в распределенных запросах, а также указывать путь к файлу без пробелов (хотя современный SQL сервер умеет работать с пробелами).
Импорт данных из Excel 2003 (файл xls) в Microsoft SQL Server x86
Шаг 1 – Проверяем наличие провайдера Microsoft.Jet.OLEDB.4.0 на SQL Server
Первое, с чего нам нужно начать, это проверить, зарегистрирован ли провайдер Microsoft.Jet.OLEDB.4.0 на SQL Server, так как в данном случае необходимо использовать именно этот провайдер. Это можно сделать с помощью следующей SQL инструкции
В результирующем наборе данных должна присутствовать строка с Microsoft.Jet.OLEDB.4.0. Если такого провайдера нет, то скорей всего в системе нет установленного Excel 2003 и, соответственно, его нужно установить.
Шаг 2 – Предоставление прав пользователю на временный каталог
Особенностью распределённых запросов и работы со связанным серверами Excel в x86 версиях SQL Server является то, что независимо от имени какой учетной записи посылается SQL запрос к Excel, эта учетная запись должна иметь права на запись во временный каталог той учетной записи, под которой работает сама служба SQL Server.Так как поставщик OLE DB создает временный файл во время запроса во временном каталоге SQL Server, используя учетные данные пользователя, выполняющего запрос.
Таким образом, если служба SQL Server работает от имени или локальной, или сетевой службы, необходимо дать соответствующие права на временный каталог этих служб всем пользователям, которые будут посылать распределенные запросы и обращаться к связанному серверу Excel (если сервер работает от имени пользователя, который посылает SQL запросы, то такие права давать не требуется, они у него уже есть).
Это можно сделать с помощью встроенной утилиты командной строки icacls.
Например, для локальной службы команда будет выглядеть следующим образом.
Для сетевой службы
Вместо UserName укажите имя пользователя, который посылает запрос.
Шаг 3 – Включаем распределенные запросы на SQL Server
По умолчанию возможность использования распределённых запросов, в частности функций OPENDATASOURCE и OPENROWSET, в Microsoft SQL Server запрещена, поэтому данную возможность нужно сначала включить.
Она включается с помощью системной хранимой процедуры sp_configure, которая отвечает за системные параметры сервера. Нам необходимо параметру Ad Hoc Distributed Queries присвоить значение 1, для этого выполняем следующую SQL инструкцию.
Шаг 4 – Выполняем SQL запрос, обращение к файлу Excel
Ниже я приведу несколько вариантов обращения к файлу Excel (TestExcel.xls).
OPENROWSET
OPENDATASOURCE
Linked Server
Импорт данных из Excel 2007 и выше (файл xlsx) в Microsoft SQL Server x86
Шаг 1 – Проверяем наличие провайдера Microsoft.ACE.OLEDB.12.0 на SQL Server
Точно так же, как и в предыдущем примере, сначала проверяем, установлен ли у нас необходимый нам провайдер, в данном случае нам нужен Microsoft.ACE.OLEDB.12.0.
Шаг 2 – Установка провайдера Microsoft.ACE.OLEDB.12.0 (32-bit)
Если провайдера нет, то его необходимо установить.
Вот ссылка на скачивание провайдера
Выберите и скачайте файл, соответствующий архитектуре x86 (т.е. в названии без x64).
Шаг 3 – Предоставление прав пользователю на временный каталог
В данном случае также даем права на временный каталог локальной или сетевой службы всем пользователям, которые будут посылать SQL запросы к файлу Excel.
Используем все ту же утилиту командной строки icacls.
Для локальной службы
Вместо UserName укажите имя пользователя, который посылает запрос.
Шаг 4 – Включаем распределенные запросы на SQL Server
Включаем возможность использования OPENDATASOURCE и OPENROWSET на Microsoft SQL Server, повторюсь, что по умолчанию данная возможность отключена.
Шаг 5 – Настройка провайдера Microsoft.ACE.OLEDB.12.0
В данном случае дополнительно потребуется настроить провайдер Microsoft.ACE.OLEDB.12.0. Для этого включим следующие параметры провайдера (для отключения укажите 0 вместо 1).
Если не включать данные параметры, то, скорей всего, появится ошибка примерно следующего содержания
«Сообщение 7399, уровень 16, состояние 1, строка 25
Поставщик OLE DB «Microsoft.ACE.OLEDB.12.0» для связанного сервера «(null)» сообщил об ошибке. Поставщик не предоставил данных об ошибке.
Сообщение 7330, уровень 16, состояние 2, строка 25
Не удалось получить строку от поставщика OLE DB «Microsoft.ACE.OLEDB.12.0» для связанного сервера «(null)».»
Шаг 6 – Выполняем SQL запрос, обращение к файлу Excel
Примеры обращения к файлу Excel (TestExcel.xlsx).
OPENROWSET
OPENDATASOURCE
Linked Server
Импорт данных из Excel (любые файлы) в Microsoft SQL Server x64
Шаг 1 – Проверяем наличие провайдера Microsoft.ACE.OLEDB.12.0 на SQL Server
В данном случае мы также используем провайдер Microsoft.ACE.OLEDB.12.0, сначала проверяем, зарегистрирован ли он на сервере.
Шаг 2 – Установка провайдера Microsoft.ACE.OLEDB.12.0 (64-bit)
В случае, если провайдер не установлен, его необходимо скачать и установить.
Скачиваем файл x64.
Шаг 3 – Включаем распределенные запросы на SQL Server
Необходимость включения возможности использования распределенных запросов (OPENDATASOURCE и OPENROWSET) на Microsoft SQL Server x64 также есть, поэтому сначала включаем ее, выполнив точно такую же инструкцию.
Шаг 4 – Настройка провайдера Microsoft.ACE.OLEDB.12.0
В этом случае, скорей всего, настройка провайдера не потребуется, поэтому сначала сразу пробуем выполнить SQL запросы (обратиться к данным в Excel), и если возникает ошибка (все с тем же сообщением 7399 и 7330), то пробуем включить параметры AllowInProcess и DynamicParameters (для отключения укажите 0 вместо 1).
Шаг 5 – Выполняем SQL запрос, обращение к файлу Excel
Здесь используются точно такие же параметры в SQL запросах, что и в предыдущем примере. Для удобства продублирую их еще раз.
Примеры обращения к файлу Excel (TestExcel.xlsx).
OPENROWSET
OPENDATASOURCE
Linked Server
Подведение итогов
Ну и в заключение я сгруппирую действия, которые необходимо выполнять в зависимости от выпуска SQL Server (x68 или x64) и версии файла Excel (xls или xlsx), в одну таблицу, для Вашего удобства.
Действие / Настройка | Импорт Excel 2003 (файл xls) в SQL Server x86 | Импорт Excel 2007 (файл xlsx) в SQL Server x86 | Импорт Excel (любые файлы) в SQL Server x64 |
Установка Excel 2003 | Да | Нет | Нет |
Установка провайдера Microsoft.ACE.OLEDB.12.0 | Нет | Да (x86) | Да (x64) |
Предоставление прав на временный каталог служб (если SQL сервер работает от имени служб) | Да | Да | Нет |
Настройка провайдера Microsoft.ACE.OLEDB.12.0 | Нет | Да | Нет (по необходимости) |
Параметры подключения в SQL запросах | Microsoft.Jet. OLEDB.4.0 и Excel 8.0 | Microsoft.ACE. OLEDB.12.0 и Excel 12.0 | Microsoft.ACE. OLEDB.12.0 и Excel 12.0 |
Включение распределённых запросов на SQL Server | Да | Да | Да |
Заметка! Для комплексного изучения языка T-SQL рекомендую посмотреть мои видеокурсы по T-SQL, в которых используется последовательная методика обучения и рассматриваются все конструкции языка SQL и T-SQL.
На сегодня это все, удачи Вам в освоении языка T-SQL!
Источник
- Remove From My Forums
-
Question
-
Hi all,
I’m trying to connect to an excel 2010 file with a table called «MyTable». I am trying to connect and fill a dataset with an OleDbDataAdapter, and a select statement to try to get the information straight out of «MyTable». I only want to select information
off Sheet1 if it is in MyTable, and MyTable does not start at A1. I have tried this code in vb.net (using vb express 2010):Dim connectionStringTemplate As String = «Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0};Extended Properties=»»Excel 12.0;HDR=Yes;IMEX=1″»»
Dim connectionString As String = String.Format(connectionStringTemplate, OpenFileDialog1.FileName)
Dim conn As OleDbConnection = New OleDbConnection(connectionString)
Try
Using conn
conn.Open()
Dim schemaTable As DataTable = conn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, Nothing)
Dim firstSheetName As String = CType(schemaTable.Rows(0).Item(«TABLE_NAME»), String)
‘Dim MyCommand As OleDbDataAdapter = New OleDbDataAdapter(«select * from [Sheet1$]», conn)
‘Dim MyCommand As OleDbDataAdapter = New OleDbDataAdapter(«select * from [Sheet1!MyTable]», conn)
‘Dim MyCommand As OleDbDataAdapter = New OleDbDataAdapter(«select * from [Sheet1$MyTable]», conn)
‘Dim MyCommand As OleDbDataAdapter = New OleDbDataAdapter(«select * from [MyTable]», conn)
‘Dim MyCommand As OleDbDataAdapter = New OleDbDataAdapter(«select * from MyTable», conn)
‘Dim MyCommand As OleDbDataAdapter = New OleDbDataAdapter(«select * from MyTable$», conn)
‘Dim MyCommand As OleDbDataAdapter = New OleDbDataAdapter(«select * from [MyTable$]», conn)
‘Dim MyCommand As OleDbDataAdapter = New OleDbDataAdapter(«select * from Sheet1![MyTable]», conn)
‘Dim MyCommand As OleDbDataAdapter = New OleDbDataAdapter(«select * from Sheet1$[MyTable]», conn)
‘Dim MyCommand As OleDbDataAdapter = New OleDbDataAdapter(«select * from [Sheet1$MyTable]», conn)
‘Dim MyCommand As OleDbDataAdapter = New OleDbDataAdapter(«select * from [Sheet1!A2:A3]», conn)
Dim MyCommand As OleDbDataAdapter = New OleDbDataAdapter(«select * from [{MyTable}]», conn)
MyCommand.Fill(ds)
End Using
Catch ex As Exception
MsgBox(ex.ToString)
End TryHas anybody had a similar problem, or know of a solution?
Thanks.
Answers
-
OLEDB provider is well suited your needs if you have simple, uniform structured data in your excel sheet. The only way to access data of excel object is to provide a range I.e. what you
are doing it by writing SELECT * FROM [Sheet1$B3:G10].can i have a select statement from an Excel Table object?
Yes but not through the name of the Table Object. It only allows you to access data if you know the range of the table object otherwise it assume from First Cell from the sheet.
If you want to access the data from excel sheet based on Table object, you have few options like using
Open XML SdkOr using office interop.
OR using any one of the above API you can find out the Range of a Table Object and using OLEDB you can select the rows.
Lingaraj Mishra
-
Marked as answer by
Tuesday, February 21, 2012 1:46 PM
-
Marked as answer by
Microsoft SQL Server позволяет встроенными средствами языка T-SQL в SQL запросе импортировать данные из файла Excel в базу данных. Сегодня я подробно расскажу, как это делается, какие условия необходимо выполнить, чтобы эта операция проходила успешно, расскажу про особенности импорта для самых распространённых случаев конфигураций SQL сервера и приведу конкретный порядок действий и практические примеры.
Начну я с того, что импортировать данные из Excel в Microsoft SQL Server можно с помощью «Распределенных запросов» и с помощью «Связанных серверов». Это, скорей всего, Вы уже знаете, так как я уже не раз писал об этом (ссылки на соответствующие материалы указаны чуть выше).
Обратиться к файлу Excel и импортировать данные в Microsoft SQL Server можно с помощью T-SQL инструкций OPENDATASOURCE, OPENROWSET или OPENQUERY.
Однако в вышеупомянутых статьях я упустил несколько важных моментов, одним из которых является то, что у всех конфигурация SQL сервера разная, за счет чего у многих возникают различные проблемы и появляются ошибки во время выполнения распределенных запросов и обращений к связанным серверам. Также я описывал способ загрузки данных из Excel, который на сегодняшний день уже устарел, поэтому сегодня я постараюсь дать Вам немного больше информации о том, как импортировать данные из файла Excel в Microsoft SQL Server на языке T-SQL.
Содержание
- Введение
- Импорт данных из Excel 2003 (файл xls) в Microsoft SQL Server x86
- Шаг 1 – Проверяем наличие провайдера Microsoft.Jet.OLEDB.4.0 на SQL Server
- Шаг 2 – Предоставление прав пользователю на временный каталог
- Шаг 3 – Включаем распределенные запросы на SQL Server
- Шаг 4 – Выполняем SQL запрос, обращение к файлу Excel
- Импорт данных из Excel 2007 и выше (файл xlsx) в Microsoft SQL Server x86
- Шаг 1 – Проверяем наличие провайдера Microsoft.ACE.OLEDB.12.0 на SQL Server
- Шаг 2 – Установка провайдера Microsoft.ACE.OLEDB.12.0 (32-bit)
- Шаг 3 – Предоставление прав пользователю на временный каталог
- Шаг 4 – Включаем распределенные запросы на SQL Server
- Шаг 5 – Настройка провайдера Microsoft.ACE.OLEDB.12.0
- Шаг 6 – Выполняем SQL запрос, обращение к файлу Excel
- Импорт данных из Excel (любые файлы) в Microsoft SQL Server x64
- Шаг 1 – Проверяем наличие провайдера Microsoft.ACE.OLEDB.12.0 на SQL Server
- Шаг 2 – Установка провайдера Microsoft.ACE.OLEDB.12.0 (64-bit)
- Шаг 3 – Включаем распределенные запросы на SQL Server
- Шаг 4 – Настройка провайдера Microsoft.ACE.OLEDB.12.0
- Шаг 5 – Выполняем SQL запрос, обращение к файлу Excel
- Подведение итогов
Введение
Итак, как я уже сказал, очень важную роль здесь играет конфигурация SQL сервера, в частности, какая версия сервера установлена, x86 или x64.
Если говорить о последних версиях Microsoft SQL Server 2016-2019, то они только x64 и устанавливаются на 64-разрядные версии Windows.
Исходя из этого я разделю статью на несколько частей, в каждой из которых я расскажу про особенности импорта данных из Excel для самых распространённых случаев конфигураций и приведу конкретный порядок действий.
Для того чтобы быстро узнать, какая версия SQL Server установлена у Вас на компьютере, можете выполнить простой SQL запрос
SELECT @@VERSION;
Обращение к файлу Excel и, соответственно, импорт данных в Microsoft SQL Server происходит с помощью специальных провайдеров (поставщиков). Для работы с Excel в Microsoft SQL Server обычно используются:
- Jet.OLEDB.4.0
- ACE.OLEDB.12.0
Во всех примерах ниже я буду посылать простой запрос SELECT на выборку данных из Excel файла, для того чтобы проверить доступ к данным в файле Excel. Чтобы осуществить импорт данных (загрузить данные в БД), Вы можете использовать любой удобный для Вас способ, например, конструкцию SELECT INTO или INSERT INTO.
Дополнительно рекомендовано закрывать файл Excel во время обращения к нему в распределенных запросах, а также указывать путь к файлу без пробелов (хотя современный SQL сервер умеет работать с пробелами).
Импорт данных из Excel 2003 (файл xls) в Microsoft SQL Server x86
Шаг 1 – Проверяем наличие провайдера Microsoft.Jet.OLEDB.4.0 на SQL Server
Первое, с чего нам нужно начать, это проверить, зарегистрирован ли провайдер Microsoft.Jet.OLEDB.4.0 на SQL Server, так как в данном случае необходимо использовать именно этот провайдер. Это можно сделать с помощью следующей SQL инструкции
EXEC sp_enum_oledb_providers;
В результирующем наборе данных должна присутствовать строка с Microsoft.Jet.OLEDB.4.0. Если такого провайдера нет, то скорей всего в системе нет установленного Excel 2003 и, соответственно, его нужно установить.
Шаг 2 – Предоставление прав пользователю на временный каталог
Особенностью распределённых запросов и работы со связанным серверами Excel в x86 версиях SQL Server является то, что независимо от имени какой учетной записи посылается SQL запрос к Excel, эта учетная запись должна иметь права на запись во временный каталог той учетной записи, под которой работает сама служба SQL Server.Так как поставщик OLE DB создает временный файл во время запроса во временном каталоге SQL Server, используя учетные данные пользователя, выполняющего запрос.
Таким образом, если служба SQL Server работает от имени или локальной, или сетевой службы, необходимо дать соответствующие права на временный каталог этих служб всем пользователям, которые будут посылать распределенные запросы и обращаться к связанному серверу Excel (если сервер работает от имени пользователя, который посылает SQL запросы, то такие права давать не требуется, они у него уже есть).
Это можно сделать с помощью встроенной утилиты командной строки icacls.
Например, для локальной службы команда будет выглядеть следующим образом.
icacls C:WindowsServiceProfilesLocalServiceAppDataLocalTemp /grant UserName:(R,W)
Для сетевой службы
icacls C:WindowsServiceProfilesNetworkServiceAppDataLocalTemp /grant UserName:(R,W)
Вместо UserName укажите имя пользователя, который посылает запрос.
Шаг 3 – Включаем распределенные запросы на SQL Server
По умолчанию возможность использования распределённых запросов, в частности функций OPENDATASOURCE и OPENROWSET, в Microsoft SQL Server запрещена, поэтому данную возможность нужно сначала включить.
Она включается с помощью системной хранимой процедуры sp_configure, которая отвечает за системные параметры сервера. Нам необходимо параметру Ad Hoc Distributed Queries присвоить значение 1, для этого выполняем следующую SQL инструкцию.
sp_configure 'show advanced options', 1; RECONFIGURE; GO sp_configure 'Ad Hoc Distributed Queries', 1; RECONFIGURE; GO
Шаг 4 – Выполняем SQL запрос, обращение к файлу Excel
Ниже я приведу несколько вариантов обращения к файлу Excel (TestExcel.xls).
OPENROWSET
SELECT * FROM OPENROWSET ( 'Microsoft.Jet.OLEDB.4.0', 'Excel 8.0; Database=D:TestExcel.xls', 'SELECT * FROM [Лист1$]' );
OPENDATASOURCE
SELECT * FROM OPENDATASOURCE('Microsoft.Jet.OLEDB.4.0', 'Data Source=D:TestExcel.xls; Extended Properties=Excel 8.0')...[Лист1$];
Linked Server
--Создание связанного сервера EXEC sp_addlinkedserver @server = 'TEST_EXCEL', @srvproduct = 'Excel', @provider = 'Microsoft.Jet.OLEDB.4.0', @datasrc = 'D:TestExcel.xls', @provstr = 'Excel 8.0;IMEX=1;HDR=YES;'; --Настройки безопасности (авторизации) EXEC dbo.sp_addlinkedsrvlogin @rmtsrvname='TEST_EXCEL', @useself= 'False', @locallogin=NULL, @rmtuser=NULL, @rmtpassword=NULL; --Обращение к связанному серверу SELECT * FROM OPENQUERY (TEST_EXCEL, 'SELECT * FROM [Лист1$]'); --или SELECT * FROM TEST_EXCEL...[Лист1$];
Импорт данных из Excel 2007 и выше (файл xlsx) в Microsoft SQL Server x86
Шаг 1 – Проверяем наличие провайдера Microsoft.ACE.OLEDB.12.0 на SQL Server
Точно так же, как и в предыдущем примере, сначала проверяем, установлен ли у нас необходимый нам провайдер, в данном случае нам нужен Microsoft.ACE.OLEDB.12.0.
EXEC sp_enum_oledb_providers;
Шаг 2 – Установка провайдера Microsoft.ACE.OLEDB.12.0 (32-bit)
Если провайдера нет, то его необходимо установить.
Вот ссылка на скачивание провайдера
https://www.microsoft.com/en-us/download/details.aspx?id=13255
Выберите и скачайте файл, соответствующий архитектуре x86 (т.е. в названии без x64).
Шаг 3 – Предоставление прав пользователю на временный каталог
В данном случае также даем права на временный каталог локальной или сетевой службы всем пользователям, которые будут посылать SQL запросы к файлу Excel.
Используем все ту же утилиту командной строки icacls.
Для локальной службы
icacls C:WindowsServiceProfilesLocalServiceAppDataLocalTemp /grant UserName:(R,W)
Для сетевой службы
icacls C:WindowsServiceProfilesNetworkServiceAppDataLocalTemp /grant UserName:(R,W)
Вместо UserName укажите имя пользователя, который посылает запрос.
Шаг 4 – Включаем распределенные запросы на SQL Server
Включаем возможность использования OPENDATASOURCE и OPENROWSET на Microsoft SQL Server, повторюсь, что по умолчанию данная возможность отключена.
sp_configure 'show advanced options', 1; RECONFIGURE; GO sp_configure 'Ad Hoc Distributed Queries', 1; RECONFIGURE; GO
Шаг 5 – Настройка провайдера Microsoft.ACE.OLEDB.12.0
В данном случае дополнительно потребуется настроить провайдер Microsoft.ACE.OLEDB.12.0. Для этого включим следующие параметры провайдера (для отключения укажите 0 вместо 1).
EXEC sp_MSset_oledb_prop N'Microsoft.ACE.OLEDB.12.0', N'AllowInProcess', 1 GO EXEC sp_MSset_oledb_prop N'Microsoft.ACE.OLEDB.12.0', N'DynamicParameters', 1 GO
Если не включать данные параметры, то, скорей всего, появится ошибка примерно следующего содержания
«Сообщение 7399, уровень 16, состояние 1, строка 25
Поставщик OLE DB «Microsoft.ACE.OLEDB.12.0» для связанного сервера «(null)» сообщил об ошибке. Поставщик не предоставил данных об ошибке.
Сообщение 7330, уровень 16, состояние 2, строка 25
Не удалось получить строку от поставщика OLE DB «Microsoft.ACE.OLEDB.12.0» для связанного сервера «(null)».»
Шаг 6 – Выполняем SQL запрос, обращение к файлу Excel
Примеры обращения к файлу Excel (TestExcel.xlsx).
OPENROWSET
SELECT * FROM OPENROWSET ( 'Microsoft.ACE.OLEDB.12.0', 'Excel 12.0; Database=D:TestExcel.xlsx', 'SELECT * FROM [Лист1$]' );
OPENDATASOURCE
SELECT * FROM OPENDATASOURCE('Microsoft.ACE.OLEDB.12.0', 'Data Source=D:TestExcel.xlsx; Extended Properties=Excel 12.0')...[Лист1$];
Linked Server
--Создание связанного сервера EXEC sp_addlinkedserver @server = 'TEST_EXCEL', @srvproduct = 'Excel', @provider = 'Microsoft.ACE.OLEDB.12.0', @datasrc = 'D:TestExcel.xlsx', @provstr = 'Excel 12.0;IMEX=1;HDR=YES;'; --Настройки безопасности (авторизации) EXEC dbo.sp_addlinkedsrvlogin @rmtsrvname='TEST_EXCEL', @useself= 'False', @locallogin=NULL, @rmtuser=NULL, @rmtpassword=NULL; --Обращение к связанному серверу SELECT * FROM OPENQUERY (TEST_EXCEL, 'SELECT * FROM [Лист1$]'); --или SELECT * FROM TEST_EXCEL...[Лист1$];
Шаг 1 – Проверяем наличие провайдера Microsoft.ACE.OLEDB.12.0 на SQL Server
В данном случае мы также используем провайдер Microsoft.ACE.OLEDB.12.0, сначала проверяем, зарегистрирован ли он на сервере.
EXEC sp_enum_oledb_providers;
Шаг 2 – Установка провайдера Microsoft.ACE.OLEDB.12.0 (64-bit)
В случае, если провайдер не установлен, его необходимо скачать и установить.
https://www.microsoft.com/en-us/download/details.aspx?id=13255
Скачиваем файл x64.
Шаг 3 – Включаем распределенные запросы на SQL Server
Необходимость включения возможности использования распределенных запросов (OPENDATASOURCE и OPENROWSET) на Microsoft SQL Server x64 также есть, поэтому сначала включаем ее, выполнив точно такую же инструкцию.
sp_configure 'show advanced options', 1; RECONFIGURE; GO sp_configure 'Ad Hoc Distributed Queries', 1; RECONFIGURE; GO
Шаг 4 – Настройка провайдера Microsoft.ACE.OLEDB.12.0
В этом случае, скорей всего, настройка провайдера не потребуется, поэтому сначала сразу пробуем выполнить SQL запросы (обратиться к данным в Excel), и если возникает ошибка (все с тем же сообщением 7399 и 7330), то пробуем включить параметры AllowInProcess и DynamicParameters (для отключения укажите 0 вместо 1).
EXEC sp_MSset_oledb_prop N'Microsoft.ACE.OLEDB.12.0', N'AllowInProcess', 1 GO EXEC sp_MSset_oledb_prop N'Microsoft.ACE.OLEDB.12.0', N'DynamicParameters', 1 GO
Шаг 5 – Выполняем SQL запрос, обращение к файлу Excel
Здесь используются точно такие же параметры в SQL запросах, что и в предыдущем примере. Для удобства продублирую их еще раз.
Примеры обращения к файлу Excel (TestExcel.xlsx).
OPENROWSET
SELECT * FROM OPENROWSET ( 'Microsoft.ACE.OLEDB.12.0', 'Excel 12.0; Database=D:TestExcel.xlsx', 'SELECT * FROM [Лист1$]' );
OPENDATASOURCE
SELECT * FROM OPENDATASOURCE('Microsoft.ACE.OLEDB.12.0', 'Data Source=D:TestExcel.xlsx; Extended Properties=Excel 12.0')...[Лист1$];
Linked Server
--Создание связанного сервера EXEC sp_addlinkedserver @server = 'TEST_EXCEL', @srvproduct = 'Excel', @provider = 'Microsoft.ACE.OLEDB.12.0', @datasrc = 'D:TestExcel.xlsx', @provstr = 'Excel 12.0;IMEX=1;HDR=YES;'; --Настройки безопасности (авторизации) EXEC dbo.sp_addlinkedsrvlogin @rmtsrvname='TEST_EXCEL', @useself= 'False', @locallogin=NULL, @rmtuser=NULL, @rmtpassword=NULL; --Обращение к связанному серверу SELECT * FROM OPENQUERY (TEST_EXCEL, 'SELECT * FROM [Лист1$]'); --или SELECT * FROM TEST_EXCEL...[Лист1$];
Подведение итогов
Ну и в заключение я сгруппирую действия, которые необходимо выполнять в зависимости от выпуска SQL Server (x68 или x64) и версии файла Excel (xls или xlsx), в одну таблицу, для Вашего удобства.
Действие / Настройка | Импорт Excel 2003 (файл xls) в SQL Server x86 | Импорт Excel 2007 (файл xlsx) в SQL Server x86 | Импорт Excel (любые файлы) в SQL Server x64 |
Установка Excel 2003 | Да | Нет | Нет |
Установка провайдера Microsoft.ACE.OLEDB.12.0 | Нет | Да (x86) | Да (x64) |
Предоставление прав на временный каталог служб (если SQL сервер работает от имени служб) | Да | Да | Нет |
Настройка провайдера Microsoft.ACE.OLEDB.12.0 | Нет | Да | Нет (по необходимости) |
Параметры подключения в SQL запросах | Microsoft.Jet. OLEDB.4.0 и Excel 8.0 | Microsoft.ACE. OLEDB.12.0 и Excel 12.0 | Microsoft.ACE. OLEDB.12.0 и Excel 12.0 |
Включение распределённых запросов на SQL Server | Да | Да | Да |
Заметка! Для комплексного изучения языка T-SQL рекомендую посмотреть мои видеокурсы по T-SQL, в которых используется последовательная методика обучения и рассматриваются все конструкции языка SQL и T-SQL.
На сегодня это все, удачи Вам в освоении языка T-SQL!
В этой статье опишу как прочитать Excel с помощью OleDB.
Иногда бывает нужно вытянуть таблицу из Excel документа, записать в DataTable для последующей обработки.
Не всегда это удобно делать с помощью циклов, поэтому будем считывать таблицы, содержащиеся в документе и запрашивать из них данные с помощью SQL запросов.
Определение строки подключения
Для разных версий Excel будут свои строки подключения.
Строка подключения для Excel 2007 и более новых версий
//Можно использовать, если количество строк менее 65536 Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0};Extended Properties='Excel 8.0;HDR=Yes' //Если строк больше 65536 Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0}; Extended Properties="Excel 12.0 Xml;HDR=YES";
Для работы с данными версиями необходимо установить Microsoft Access Database Engine 2010 Redistributable.
Так же C# может выбрасывать исключения по поводу недостающих драйверов. В этом случае необходимо скачать соответствующие драйверы с сайта Microsoft.
Строка подключения для более ранних версий
Строка подключения для Excel версии 2003 может иметь такой вид:
Provider=Microsoft.Jet.OLEDB.4.0;Data Source={0};Extended Properties='Excel 8.0;HDR=Yes'
Если C# выбросит исключение, скачайте недостающий драйвер, Visual Studio подскажет, какой.
Как сделать SQL запрос из таблицы Excel
Для выполнения SQL запроса нужно найти таблицу в документе и выполнить к ней запрос:
//Объявляем OleDB соединение using(OleDbConnection conn = new OleDbConnection(conStr)) { //Открываем подключение conn.Open(); //Запрашиваем таблицы DataTable schemaTable = conn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, new object[] { null, null, null, "TABLE" }); DataRow schemaRow = schemaTable.Rows[0]; //Получаеи имя таблицы string sheet = schemaRow["TABLE_NAME"].ToString(); //Объявляем команду OleDbCommand com = conn.CreateCommand(); //Создаем SQL запрос com.CommandText = "SELECT * FROM [" + sheet + "]"; //Выполняем SQL запрос OleDbDataReader reader = com.ExecuteReader(); //Записываем результат в DataTable DataTable table = new DataTable(); table.Load(reader); //Выводим DataTable в таблицу на форму (если нужно) gridControl1.DataSource = table; }
На этом шаге мы имеем считанные данные из Excel документа в DataTable.
После обработки данных можно сохранить данные в другой документ или оформить сводную таблицу.
Как работать с Excel с помощью C# обсуждалось ранее.
Так же можете посмотреть, как работать со сводными таблицами в Excel с помощью C# и редактора VBA, встроенного в Excel.
Просмотрено:
7 446
Несколько примеров работы из MS SQL Server с таблицами формата Excel(.xls,.xlsx):
1)С
использованием функции OPENROWSET или с OPENDATASOURCE:
SELECT * FROM OPENROWSET(‘MSDASQL’,
‘Driver={Microsoft Excel Driver (*.xls)};
DBQ=[C:gr_otchet.xls]’, ‘SELECT * FROM [Sheet1$A8:D10000]’
Пример для OPENDATASOURCE
из BOL:
SELECT * FROM OPENDATASOURCE(‘Microsoft.Jet.OLEDB.4.0’,
‘Data
Source=C:DataFolderDocumentsTestExcel.xls;Extended Properties=EXCEL 5.0’)…[Sheet1$] ;
Одна из
распространенных проблем, это отсутствие
драйверов под х64 платформу, или установка х32 битных под х64 систему. Например,
драйверов Microsoft.Jet.OleDB нет 64 битных,в этом случае можно использовать другие драйвера, к примеру
Microsoft.ACE.OLEDB.12.0.
Не забудьте только про
Примечание из BOL:
Функция
OPENROWSET или OPENDATASOURCE может быть использована
для доступа к удаленным данным из источников данных OLE DB только в том случае,
если для заданного поставщика параметр реестра DisallowAdhocAccess явно
установлен в 0 и включен параметр Ad Hoc Distributed Queries расширенной
настройки. Если эти параметры не установлены, поведение по умолчанию запрещает
нерегламентированный доступ.
Если параметр
Ad Hoc Distributed Queries выключен, то об будет информационное сообщение. Включение
параметра осуществляется через хранимую процедуру sp_configure.
sp_configure ‘Ad Hoc Distributed Queries‘, 1;
RECONFIGURE;
GO
2) Второй спосб через Linkedserver
и ODBC драйвер.
1-ый способ
хорошо, когда необходимо использовать разово, для частого и широко
использования лучше использовать технологию связанного сервера(Linked Server)
Для этого
необходимо установить на сервере MS SQL Server ODBC драйвер а для Excel, затем создать источник
данных( Администрирование ->Источники данных)
Указывает имя источника данных
,версию Excel и сам
файл.
Сохраняем источник.
После этого создаем связанный
сервер LinkedServed (связанный
сервер):
Указываем имя нашего связанного сервера и имя созданного нами
раннего ODBC источника.
Сохраняем.
Теперь можно выполнять запросы к
нашему связанному серверу, к примеру:
select * from openquery(excel,‘select * from [sheet1$]’) – получение всех данныз из экселя
select * from openquery(excel,‘select * from
[Sheet1$A10:D2]’) – получение данных диапозона $A10:D2
select * from openquery(excel,‘select * from
[Sheet1$A10:D]’) – получение данных диапозона с A10:D до
конца файла.
3) Еще одни,
способ, когда необходим импорт разово, то можно использовать «SQL Server Import and Export Wizard»:
Выделяем БД, правая кнопка, Задачи, Выбираем пункт Импорт
или Экспорт:
Выбираем источник данных, наш
файл Excel, версию Excel-я. :
Выбираем куда
копировать данные, указываем таблицу назначение .
После этого
можно пакет запустить немедленно или его сохранить для дальнейшего
использования.
4) Кстати, 4 способ, это как раз создание пакета SSIS в Microsoft Visual Studio, результатом которого
так же будет пакет, похожий на то, что было создано в варианте 3
Делается он
просто
Выбирается Элемент потока
управления
Затем выбирается источник и
сервер назначения:
В источнике соединений создается
новое соединение с нашим файлом Excel,
в Назначение указываем наш MS SQL Server, указываем таблицу,
сопоставляем столбцы:
После этого сохраняем пакет, и
его запускаем.
Пакет создали и должен работать.
Удачи .