There are many articles about writing code to import an Excel file, but this is a manual/shortcut version:
If you don’t need to import your Excel file programmatically using code, you can do it very quickly using the menu in SQL Server Management Studio (SSMS).
The quickest way to get your Excel file into SQL is by using the import wizard:
-
Open SSMS (SQL Server Management Studio) and connect to the database where you want to import your file into.
-
Import Data: in SSMS in Object Explorer under ‘Databases’, right-click the destination database, and select Tasks, Import Data. An import wizard will pop up (you can usually just click Next on the first screen).
-
The next window is ‘Choose a Data Source‘. Select Excel:
-
In the ‘Data Source’ dropdown list, select Microsoft Excel (this option should appear automatically if you have Excel installed).
-
Click the ‘Browse’ button to select the path to the Excel file you want to import.
-
Select the version of the Excel file (97-2003 is usually fine for files with a .XLS extension, or use 2007 for newer files with a .XLSX extension)
-
Tick the ‘First Row has headers’ checkbox if your Excel file contains headers.
-
Click Next.
- On the ‘Choose a Destination‘ screen, select destination database:
-
Select the ‘Server name’, Authentication (typically your sql username & password) and select a Database as destination. Click Next.
- On the ‘Specify Table Copy or Query‘ window:
- For simplicity just select ‘Copy data from one or more tables or views’, click Next.
-
‘Select Source Tables:‘ choose the worksheet(s) from your Excel file and specify a destination table for each worksheet. If you don’t have a table yet the wizard will very kindly create a new table that matches all the columns from your spreadsheet. Click Next.
-
Click Finish.
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!
Introduction
In this article, I am going to explain to you how to import Excel sheet data to SQL server database table with examples. Here we will be using SQL Server 2019 or you can use SQL Server 2008 or above. In my current project, I am using this concept for data migration.
This concept is used for transferring data from source (Excel sheet) to destination (SQL Server). We can import a bulk amount of excel data into SQL database without using any coding.
There are two ways to import data from excel to SQL Server database. First, if you want to import all excel file data with header names in a new table. Secondly, if you want to append excel data in exiting table data without header names.
Prerequisites
SQL Server 2019 or you can use SQL server 2008 or above version.
Read my previous articles, using the below links,
- How To Install SQL Server 2019
- How To Install SQL Server Management Studio 2019
- Getting Started With SQL Server 2019
Import All Excel Data With Header Names In a New Table
Step 1
Here, I have created a sample Excel data that contains employees detail data with six columns.
Step 2
Connect To SQL Server Management Studio 2019 (SSMS) and create a database
Open your SQL Server and use the following script to create the “chittadb” Database.
Create database chittadb
Now, select the script query then press F5 or click on Execute button to execute the above script.
You should see a message, “Command(s) completed successfully.” Means your new database is created.
Database “Chittadb” created.
Step 3
Expand the database where you want to import the data. Here I want to import the data to “Chittadb” database. The database has no table now.
Right click your destination database ->Select Tasks -> Import Data
Step 4
An Import wizard pop up will open «Welcome to SQL Server Import and Export Wizard” and Click Next.
Step 5
- Now, Select Microsoft Excel as your data source from the dropdown list.
- Click the ‘Browse’ button to select the path to the Excel data file you want to import.
- Select the version of the excel file (2007-2010). Is usually fine for files with a .XLS extension, or use newer files with a .XLSX extension)
- Tick the ‘First Row has column names’ checkbox, if your excel file contains headers.
- Click next.
Step 6
On the ‘Choose a Destination’ Screen, select destination database” SQL Server Native Client 11.0” from the dropdown, select database “chittadb”, also you can use Windows Authentication or Use SQL Server Authentication; here I am using Windows Authentication and click Next.
Step 7
Select the Radio button “Copy data from one or more tables or views”.
This step will copy the data from the data source, click next and continue.
Step 8
We can specify the table name in the following wizard. So change the destination section name «[dbo].[Sheet1$]» as «[dbo].[Tbl_Employee]» and click Next.
If you want to preview your data, Click the preview button.
Step 9
Save and Run package. Check Run immediately from checkbox and Click Next or Finish button you can get Complete the Wizard page.
Step 10
Click finish.
Step 11
The execution was successful and Click Close button.
Step 12
Now, check database “Chittadb” and verify.
The following Output contains Id, EmpId, Name, Location, Gender and Designation as the column name and “Tbl_Employee” table also created under database “Chittadb”. Now all excel data is imported to “Tbl_Employee” table.
Conclusion
In this article, we learned how to Import Excel data into SQL Server 2019. Post your valuable feedback in the comments section. I hope this article will be useful.
Время на прочтение
6 мин
Количество просмотров 105K
Введение
Здравствуй, $habrauser!
Бывает так, что вам нужно импортировать файл Excel в базу MySQL, но готового решения нигде нет. Вот и я, когда меня попросил друг поискать легкий способ импорта, сперва решил
загуглить
поискать решение. Увы, запрос php excel to mysql не дал ничего конкретного, или же описанные способы были довольно таки не удобны. Тогда же я решил найти библиотеку для работы с Excel на PHP, и мне попалась PHPExcel. Но опять же меня ждало разочарование, запрос phpexcel to mysql не дал ничего путного (я ленивый пользователь и дальше 1й страницы не хожу). В итоге я решил создать свой
велосипед
скрипт, которым и хочу поделиться с вами.
Начало
Итак, библиотеку я нашел, скачал и начал разбираться. Для начала нужно было подключить библиотеку и создать подключение к базе, что совсем не сложно:
require_once "PHPExcel.php";
$connection = new mysqli("localhost", "user", "pass", "base");
$connection->set_charset("utf8");
Далее нужно открыть файл Excel для чтения:
$PHPExcel_file = PHPExcel_IOFactory::load("./file.xlsx");
После открытия файла, нам нужно перебрать все листы в нем и каждый добавить в базу MySQL (можно и 1 конкретный, но об этом позже):
foreach ($PHPExcel_file->getWorksheetIterator() as $worksheet) {
// ...
}
Ну а теперь самое интересное…
Перебор и добавление
Мы будем исходить из того, что таблицы у нас нет (или есть, но с другими данными) и ее нужно создать. Для этого нам нужно получить имена для столбцов (в соответствии с просьбой друга, имена могут находиться в 1 строчке таблицы):
// Строка для названий столбцов таблицы MySQL
$columns_str = "";
// Количество столбцов на листе Excel
$columns_count = PHPExcel_Cell::columnIndexFromString($worksheet->getHighestColumn());
// Перебираем столбцы листа Excel и генерируем строку с именами через запятую
for ($column = 0; $column < $columns_count; $column++) {
$columns_str .= ($columns_name_on1line ? "column" . $column : $worksheet->getCellByColumnAndRow($column, 1)->getCalculatedValue()) . ",";
}
// Обрезаем строку, убирая запятую в конце
$columns_str = substr($columns_str, 0, -1);
Далее удаляем таблицу из базы, если она существовала, и создаем новую:
$connection->query("DROP TABLE IF EXISTS exceltable");
$connection->query("CREATE TABLE exceltable (" . str_replace(",", " TEXT NOT NULL,", $columns_str) . " TEXT NOT NULL)");
Как видно из кода, значения будут иметь тип TEXT. Теперь приступаем собственно к перебору ячеек и добавления их в базу. Конечно, такой алгоритм не сложно найти на просторах Stack Overflow, однако было замечено, что происходить ошибка при попытки чтения объединенных ячеек (точнее несоответствие количества столбцов и значений в запросе). Это я и решил учесть:
// Количество строк на листе Excel
$rows_count = $worksheet->getHighestRow();
// Перебираем строки листа Excel
for ($row = 1; $row <= $rows_count; $row++) {
// Строка со значениями всех столбцов в строке листа Excel
$value_str = "";
// Перебираем столбцы листа Excel
for ($column = 0; $column < $columns_count; $column++) {
// Строка со значением объединенных ячеек листа Excel
$merged_value = "";
// Ячейка листа Excel
$cell = $worksheet->getCellByColumnAndRow($column, $row);
// Перебираем массив объединенных ячеек листа Excel
foreach ($worksheet->getMergeCells() as $mergedCells) {
// Если текущая ячейка - объединенная,
if ($cell->isInRange($mergedCells)) {
// то вычисляем значение первой объединенной ячейки, и используем её в качестве значения
// текущей ячейки
$merged_value = $worksheet->getCell(explode(":", $mergedCells)[0])->getCalculatedValue();
break;
}
}
// Проверяем, что ячейка не объединенная: если нет, то берем ее значение, иначе значение первой
// объединенной ячейки
$value_str .= "'" . (strlen($merged_value) == 0 ? $cell->getCalculatedValue() : $merged_value) . "',";
}
// Обрезаем строку, убирая запятую в конце
$value_str = substr($value_str, 0, -1);
// Добавляем строку в таблицу MySQL
$connection->query("INSERT INTO exceltable (" . $columns_str . ") VALUES (" . $value_str . ")");
}
Все дело в функцию!
Конечно, данный скрипт был бы гораздо удобнее, если бы все объединить в функцию. Поэтому итоговый результат получается такой:
Функция excel2mysql
// Подключаем библиотеку
require_once "PHPExcel.php";
// Функция преобразования листа Excel в таблицу MySQL, с учетом объединенных строк и столбцов.
// Значения берутся уже вычисленными. Параметры:
// $worksheet - лист Excel
// $connection - соединение с MySQL (mysqli)
// $table_name - имя таблицы MySQL
// $columns_name_line - строка с именами столбцов таблицы MySQL (0 - имена типа column + n)
function excel2mysql($worksheet, $connection, $table_name, $columns_name_line = 0) {
// Проверяем соединение с MySQL
if (!$connection->connect_error) {
// Строка для названий столбцов таблицы MySQL
$columns_str = "";
// Количество столбцов на листе Excel
$columns_count = PHPExcel_Cell::columnIndexFromString($worksheet->getHighestColumn());
// Перебираем столбцы листа Excel и генерируем строку с именами через запятую
for ($column = 0; $column < $columns_count; $column++) {
$columns_str .= ($columns_name_line == 0 ? "column" . $column : $worksheet->getCellByColumnAndRow($column, $columns_name_line)->getCalculatedValue()) . ",";
}
// Обрезаем строку, убирая запятую в конце
$columns_str = substr($columns_str, 0, -1);
// Удаляем таблицу MySQL, если она существовала
if ($connection->query("DROP TABLE IF EXISTS " . $table_name)) {
// Создаем таблицу MySQL
if ($connection->query("CREATE TABLE " . $table_name . " (" . str_replace(",", " TEXT NOT NULL,", $columns_str) . " TEXT NOT NULL)")) {
// Количество строк на листе Excel
$rows_count = $worksheet->getHighestRow();
// Перебираем строки листа Excel
for ($row = $columns_name_line + 1; $row <= $rows_count; $row++) {
// Строка со значениями всех столбцов в строке листа Excel
$value_str = "";
// Перебираем столбцы листа Excel
for ($column = 0; $column < $columns_count; $column++) {
// Строка со значением объединенных ячеек листа Excel
$merged_value = "";
// Ячейка листа Excel
$cell = $worksheet->getCellByColumnAndRow($column, $row);
// Перебираем массив объединенных ячеек листа Excel
foreach ($worksheet->getMergeCells() as $mergedCells) {
// Если текущая ячейка - объединенная,
if ($cell->isInRange($mergedCells)) {
// то вычисляем значение первой объединенной ячейки, и используем её в качестве значения
// текущей ячейки
$merged_value = $worksheet->getCell(explode(":", $mergedCells)[0])->getCalculatedValue();
break;
}
}
// Проверяем, что ячейка не объединенная: если нет, то берем ее значение, иначе значение первой
// объединенной ячейки
$value_str .= "'" . (strlen($merged_value) == 0 ? $cell->getCalculatedValue() : $merged_value) . "',";
}
// Обрезаем строку, убирая запятую в конце
$value_str = substr($value_str, 0, -1);
// Добавляем строку в таблицу MySQL
$connection->query("INSERT INTO " . $table_name . " (" . $columns_str . ") VALUES (" . $value_str . ")");
}
} else {
return false;
}
} else {
return false;
}
} else {
return false;
}
return true;
}
// Соединение с базой MySQL
$connection = new mysqli("localhost", "user", "pass", "base");
// Выбираем кодировку UTF-8
$connection->set_charset("utf8");
// Загружаем файл Excel
$PHPExcel_file = PHPExcel_IOFactory::load("./file.xlsx");
// Преобразуем первый лист Excel в таблицу MySQL
$PHPExcel_file->setActiveSheetIndex(0);
echo excel2mysql($PHPExcel_file->getActiveSheet(), $connection, "excel2mysql0", 1) ? "OKn" : "FAILn";
// Перебираем все листы Excel и преобразуем в таблицу MySQL
foreach ($PHPExcel_file->getWorksheetIterator() as $index => $worksheet) {
echo excel2mysql($worksheet, $connection, "excel2mysql" . ($index != 0 ? $index : ""), 1) ? "OKn" : "FAILn";
}
Заключение
Что ж, надеюсь данная статья поможет вам. Ну, или, если вы захотите
изобрести свой велосипед, но только с моторчиком
написать свой скрипт, эта статья поможет вам начать.
P.S.
Это моя первая, и думаю, не последняя статья. Поэтому жду ваших советов и поправок, как тут принято, в комментариях.
Update
Вижу, все-таки, мне удалось создать небольшую дискуссию, но не все понимают, почему было сделано именно так. Постараюсь объяснить.
Во-первых: с этим должен был работать пожилой человек, которому будет трудновато объяснить как сохранить файл в CSV, при этом не потеряв данные (а такое исключать нельзя, к тому же у них свой формат на файл XLS, который приходит сверху) и, тем более, как это импортировать через phpMyAdmin (который, кстати, с версии 3.4.5 не поддерживает XLS/XLSX, советую посмотреть почему) или подобное. Так что это не подходит.
Во-вторых: все это должно быть расположено на хостинге, и установка модулей как на сервер, так и для локальных программ не подходит (к тому же там Linux, а не Windows, как некоторые подумали).
В-третьих: это дело проводится раз в полгода, однако от безделья я решил написать такую функцию, способную обобщить импорт (вдруг кому нужно).
Теперь о хорошем: переписал данную функцию в класс, исправил кое-что и добавил возможность экспорта из MySQL в Excel. Забрать можно отсюда.
Извините, что не ответил в комментариях, решил что в самой статье будет уместние.
- Use the
LOAD DATA
Statement to Import Data - Method 2: Use
Sqlizer.io
to Import Data - Method 3: Import Data Using
phpMyAdmin
- Conclusions
This article will teach how to import an excel file into a MySQL database using Workbench, Command-Line Prompt, and phpMyAdmin. This tutorial will take you through a step-by-step guide of the top 3 easiest ways to import excel files into the MySQL databases.
Use the LOAD DATA
Statement to Import Data
Using the LOAD DATA
statement in MySQL Workbench, you must have an empty table in your MySQL database.
We have already created a table named tb_students
. This table has id
, firstname
, lastname
, gender
, and city
as column names.
We will convert our file type from .xlsx
to .csv
to import data into the MySQL database. To do this, open your excel file that has the data.
Click on File->Save As
. Make sure that you have selected CSV (Comma delimited)(*.csv)
and then press the SAVE
.
See the following screenshot.
You now have your data in the *.csv
file. We will use the command below to import data from the .csv
file into the MySQL database (using Workbench).
# MySQL Version 8.0.27
LOAD DATA INFILE
'C:/ProgramData/MySQL/MySQL Server 8.0/Uploads/top 5 easiest ways to import excel file into mysql database.csv'
INTO TABLE tb_students
FIELDS TERMINATED BY ','
ENCLOSED BY '"'
LINES TERMINATED BY 'n'
IGNORE 1 ROWS;
In the above LOAD DATA
statement, the data from the given file will be collected and inserted into the mentioned table. The first row will be ignored (the column names) because we already have them while creating a table in MySQL Workbench.
In this example, the .csv
file’s fields are terminated by a comma. Yours may be terminated by a tab
or single space.
If so, replace the line FIELDS TERMINATED BY ','
with FIELDS TERMINATED BY 't'
or FIELDS TERMINATED BY ' '
respectively. Let’s look at the *.csv
file’s data and then the MySQL data that are given below.
Data in .CSV
File:
Data in MySQL Table:
You can also use the LOAD DATA
statement from Command Line (CMD). We have created a new table named tb_students_cmd
to practice the command line’s LOAD DATA
statement.
Use the LOAD DATA
statement to import data via a command-line prompt.
Let’s read the id
from tb_students_cmd
to confirm that the data is imported. See the following screenshot.
If you see any error about security considerations while using the LOAD DATA
statement, then you may visit this website to see the possible solutions.
Method 2: Use Sqlizer.io
to Import Data
This method is useful if you don’t want to convert your file type from .xlsx
to .csv
. Go to sqlizer.io, follow the instructions as follows (or as per your needs).
Select your excel file and MySQL database type. Tell the sqlizer.io
by checking or unchecking My File has a Header Row
.
Check Use CHECK IF TABLE EXISTS
if you want to. If you want to use the active worksheet, check Use the active worksheet
.
If not, then tell the worksheet name. We are not using it for this tutorial and prefer to tell the worksheet name, students
.
Make sure to tick Convert the whole worksheet
to import the whole data. Otherwise, give it the cell range.
You can write your table name (give it a unique name) in which you want the data to be imported. Then, click on the Convert My File
button.
You will see the following screen. You can either download the queries or copy them to execute wherever you want.
We can see the following screenshot to confirm that the data is imported, and we can read that.
Method 3: Import Data Using phpMyAdmin
If you are using phpMyAdmin
, then you can import data using the following steps (see the given screenshots).
To practice, we have created a new table named tb_students_phpmyadmin
. It has five columns named id
, firstname
, lastname
, gender
, and city
.
Click on the Import
tab and select your *.csv
file. The Format
would be CSV
, but you can select according to requirements.
Provide Format-specific Options
and click on Go
at the bottom-right corner.
You can see that all the records are being imported inserted in the table named tb_students_phpmyadmin
as follows.
Let’s see whether the data is imported or not. And here it is! We have imported data.
Conclusions
Finally, we have concluded that you have to use different methods to import data into MySQL.
We saw two methods for importing data from the .csv
file to MySQL. It includes the LOAD DATA
statement (in workbench and command line) and using phpMyAdmin
.
We used sqlizer.io
to import data from excel files to MySQL, which is very easy to use also.
Иногда бывает проще работать с некоторыми данными в Excel, прежде чем импортировать их в базу данных MySQL.
Иногда бывает проще работать с некоторыми данными в Excel, прежде чем импортировать их в базу данных MySQL.
Для этого сделайте несколько простых шагов.
Короче: экспортируйте файл Excel в CSV и импортируйте CSV в новую таблицу с помощью PHPMyAdmininterface.
Начиная с Excel, в примере ниже один лист, содержащий некоторые данные:
Выберите «Сохранить как», чтобы выбрать другой формат.
Прокрутите вниз до формата CSV (с разделителями-запятыми) (* .csv).
Убедитесь, что некоторые функции будут потеряны — CSV является текстовым форматом, никакие особенности Excel не будут экспортироваться (функции, программы и т. Д.).
Как импортировать Excel в PHPMyAdmin
В PHPMyAdmin перейдите в меню «Импорт».
Найдите файл CSV, который был недавно сохранен, и выберите соответствующий формат:
Посмотрите на другие параметры, которые могут применяться, например, если столбцы имеют имена, проверьте соответствующий параметр «Первая строка файла содержит имена столбцов таблицы» и нажмите «Перейти»
Должно появиться подтверждение импорта, и будут показаны ссылки на полученную базу данных и таблицу.
Теперь можно просмотреть таблицу!
Используя различные параметры, можно также работать со структурой таблицы, ее содержимым или перемещать ее в другую базу данных:
PHPMyAdmin импортировать CSV в MySQL
В PHPMyAdmin импортировать CSV-файл в MySQL довольно просто.
После того, как данные подготовлены в CSV, следуйте структуре таблицы, откройте таблицу в PHPMyAdmin, перейдите на вкладку import, найдите файл CSV для импорта на ваш компьютер, убедитесь, что формат CSV был выбран в параметре формата файла. и импортируйте файл CSV в MySQL в PHPMyAdmin.
Как импортировать Excel в MySQL PHP MyAdmin
Чтобы импортировать Excel в MySQL PHP MyAdmin, экспортируйте файл Excel в файл CSV. Затем импортируйте его в PHP MyAdmin, используя опцию файла данных CSV.
При импорте файла в MySQL из Excel прокрутите вниз до параметров «Формат» и выберите файл CSV. Это позволит преобразовать Excel в MySQL в PHP MyAdmin без необходимости что-либо программировать и просто с помощью графического интерфейса пользователя.
Узнайте, как импортировать данные Excel в базу данных MySQL
Создание базы данных в DirectAdmin
Если на вашем веб-сервере еще нет базы данных, независимо от используемого программного обеспечения для управления сервером, такого как cPanel или DirectAdmin, вам сначала необходимо создать базу данных, прежде чем вы сможете импортировать в нее какие-либо данные.
Просто перейдите на панель управления веб-пользователем и найдите экран управления MySQL. Там вы должны иметь возможность создать как базу данных, так и пользователя, который может получить доступ к этой базе данных — и то, и другое необходимо для того, чтобы иметь функциональную базу данных для вашего веб-сайта! Просто создайте его и используйте имя пользователя и пароль, выберите для подключения к базе данных и импорта экспорта, CSV или Excel в свою базу данных.
Часто Задаваемые Вопросы
- Как импортировать файл Excel в PhpMyAdmin?
- В PhpmyAdmin перейдите в меню «Импорт», выберите соответствующий формат: ищите другие варианты, которые могут применяться, и нажмите «Go». Затем появится подтверждение импорта, а также ссылки на полученную базу данных и таблицу.
Закончите Excel 2019 для начинающих в видео
Задача. У вас есть файл Excel – и вы хотите, чтобы эти данные были помещены в таблицу. Я покажу вам, как это делается, и мы задокументируем каждый шаг с большим количеством иллюстраций.
Прочитав этот пост, вы будете готовы с уверенностью импортировать данные в существующую таблицу из Excel. Хотите создать новую таблицу из Excel? Мы тоже можем это сделать.
В нашем примере я буду использовать таблицу HR.EMPLOYEES
для создания XLS-файла для нашего импорта. Мы будем использовать этот файл Excel для заполнения пустой копии таблицы EMPLOYEES
в другой схеме.
Шаг 0: Пустая таблица Oracle и ваш файл Excel
У вас есть таблица Oracle и один или несколько файлов Excel.
Шаг 1: Выбираем «Импорт данных» по правому щелчку мыши
Шаг 2: Выберите свой входной файл (XLSX) и проверьте данные
Когда вы выберете файл, мы захватим первые 100 строк для просмотра ниже. Этот «Предел строк предварительного просмотра» определяет, сколько строк вы можете использовать для проверки ИМПОРТА по мере прохождения мастера. Вы можете увеличить его, но это потребует больше ресурсов, так что не сходите с ума.
Кроме того, есть ли в вашем файле Excel заголовки столбцов? Хотим ли мы рассматривать их как строку к таблице? Скорее всего, нет. Если вы снимите флажок «Заголовок», имена столбцов станут новой строкой в вашей таблице – и, вероятно, не будут вставлены.
Иногда ваш файл Excel имеет несколько заголовков, или вам может потребоваться импортировать только определенное подмножество электронной таблицы. Используйте опцию «Пропустить строки», чтобы получить правильные данные.
Шаг 3: Создайте сценарий или импортируйте автоматически
alt+tab
туда и обратно от Excel до SQL Developer.
Для этого упражнения будет использоваться метод «Вставки» (Insert). Каждая строка, обработанная в файле Excel, приведет к выполнению инструкции INSERT
в таблице, в которую мы импортируем.
Если вы выберете «Вставить скрипт», мастер завершит работу скриптом ВСТАВКИ на вашем листе SQL. Это хорошая альтернатива, если вы хотите настроить SQL, или если вам нужно отладить/посмотреть, почему метод «Insert» не работает.
Шаг 4: Выберите столбцы Excel для импорта
У вас может быть файл Excel со 100 столбцами, но ваша таблица имеет только 30. Здесь вы даете команду SQL Developer, какие столбцы должны использоваться для импорта. Вы также можете изменить порядок столбцов, что может сделать следующий шаг немного проще.
Шаг 5: Сопоставьте столбцы Excel со столбцами таблицы
Если вы не обращаете внимания и просто позволяете Мастеру импорта делать всё по умолчанию, то сейчас самое время проснуться. Есть большая вероятность, что порядок столбцов файла Excel не будет соответствовать определению вашей таблицы. На этом шаге вы указываете SQL Developer-у, какие столбцы в электронной таблице совпадают с какими столбцами в таблице Oracle.
А помните, как мы установили это окно предварительного просмотра на 100 строк? Мы внимательно изучаем данные, ищем проблемы, пытаясь вписать их в столбец вашей таблицы. Если мы обнаружим проблему, мы пометим столбцы этими «предупреждающими» символами.
Я загрязнил свой файл Excel некоторыми намеренно ошибочными значениями, которые, как я знаю, не будут «подходить». Когда эти строки будут обнаружены в мастере, база данных их отклонит, но остальные строки будут введены.
Давайте на секунду поговорим о форматах даты и времени.
О TIMESTAMP
тоже. В файле Excel у вас, вероятно, будут некоторые поля даты и времени, которые вы хотите переместить в столбцы формата DATE
или TIMESTAMP
. SQL Developer обрабатывает эти значения как строки – и ВАМ нужно сообщить SQL Developer формат DATE
или TIMESTAMP
, чтобы иметь возможность их преобразовать.
Давайте посмотрим на HIREDATE.
HIRE_DATE
– если только вы не храните ДАТЫ в VARCHAR2
, — и если вы делаете это, то делаете это НЕПРАВИЛЬНО. Всегда храните ДАТЫ в формате DATE
!
Видите выпадающий селектор «Формат» (Format)? SQL Developer по умолчанию установил строку формата ДАТЫ в ‘DD-MON-RR
’ – мы пытаемся угадать это на основе строк, которые мы рассматриваем в этом окне предварительного просмотра 100.
Если мы ошиблись в догадках или не смогли разобраться, вам нужно будет ввести это самостоятельно. Документы Oracle могут помочь вам определить правильную модель формата ДАТЫ. Если вы видите небольшое предупреждающее изображение рядом со значениями даты на панели данных, возможно, у вас неправильный формат.
Шаг 6: Проверьте свои настройки и ВПЕРЕД!
Нажмите на кнопку «Готово» (Finish).
Если Мастер столкнется с какими-либо проблемами при выполнении вставок, вы увидите следующее:
Я собираюсь сказать «Да», чтобы игнорировать все ошибки. Но если вам нужна КАЖДАЯ отдельная строка – вам нужно сказать «Отмена», чтобы начать все сначала. Затем вы можете либо исправить свои данные в файле Excel, либо внести изменения в свою таблицу, чтобы данные соответствовали/работали.
Нажав ‘Да», мы доберемся до конца нашей истории и наших данных!
Шаг 7: Посмотрите, Что сработало, а Что нет
Во-первых, есть ли плохие новости?
Если были строки, отклоненные базой данных, мы увидим их сейчас.
INSERT
, которые мы пытались запустить, но не сработали. Вы можете изменить их вручную, чтобы исправить несколько записей. Но если у вас тысячи забракованных строк – лучше разобраться в файле (в источнике импорта).
Теперь давайте посмотрим на наши новые табличные данные!
Обратите внимание на панель «Журнал» (Log). Там можно увиеть файл, с которым мы работали, и сколько времени потребовалось для загрузки данных.
Всё! Можно выдохнуть свободно. Импорт из файла Excel в таблицу базы данных Oracle завершен. В шапке статьи вы можете посмотреть видео инструкцию — копию этого мануала на английском языке.