Всем привет. Иногда, для работы с БД, требуется перенос данных из файла в базу данных. Я столкнулся с такой проблемой, когда мне нужно было перенести данные из Excel файла в базу данных. Есть несколько способов решения этой проблемы, сегодня мы с вами решим ее с помощью библиотеки PHPExcel. Я в качестве примера буду использовать PostgreSQL, но здесь так же можно использовать и другие СУБД. Я вам покажу код который можно отредактировать, чтобы подключиться к MySQL, MariaDB и так далее.
И так, суть работы такая. Есть Excel файл, который нужно перевести в формат csv(это можно сделать в настройках сохранение файла). После этого мы достаем данные из этого файла, обрабатываем их и вставляем в базу данных.
Для вашего случая скрипт, может отличаться, поэтому вам нужно будет его изменить самостоятельно. Так же вы можете написать в нашей группе https://vk.com/prog_time на стене и вам обязательно помогут.
Скажу сразу, данный код не подойдет для вас, если:
- У вас очень большая база, больше 10 000 записей. Если у вас большая база, то процесс будет очень долгим и может выдать ошибку.
- Если вам необходима постоянная загрузка строк в реальном времени. Скорость работы этого скрипта, хромает и большая нагрузка может его тормозить.
Почему тогда я его показываю:
- Это готовый код, который вы можете просто скопировать и вставить к себе.
- Здесь необходимо только изменить путь к вашему файлу в параметре функции.
- С помощью этого кода, вы можете потренироваться в работе с библиотекой PHPExcel)))
Для того чтобы все работало, необходимо скачать библиотеку PHPExcel — https://github.com/PHPOffice/PHPExcel
Вот так выглядит скрипт. Данный скрипт написан на PHP. Сейчас мы с вами его построчно разберем.
//СКРИПТ КОТОРЫЙ ПЕРЕВОДИТ ЗНАЧЕНИЯ ИЗ EXCEL В МАССИВ
set_time_limit(7200);
ini_set("memory_limit", "3000M");
function parse_excel_file( $filename ){
// путь к библиотеки от корня сайта
require_once $_SERVER['DOCUMENT_ROOT'].'/PHPExcel-1.8/Classes/PHPExcel.php';
$result = array();
// получаем тип файла (xls, xlsx), чтобы правильно его обработать
$file_type = PHPExcel_IOFactory::identify( $filename );
// создаем объект для чтения
$objReader = PHPExcel_IOFactory::createReader( $file_type );
$objPHPExcel = $objReader->load( $filename ); // загружаем данные файла
$result = $objPHPExcel->getActiveSheet()->toArray(); // выгружаем данные
return $result;
}
$res = parse_excel_file($_SERVER['DOCUMENT_ROOT'].'\files\list_of_expired_passports.csv' );
$arr_result = count($res); //ПОДСЧИТЫВАЕТ СКОЛЬКО ЗНАЧЕНИЙ В МАССИВЕ
for ($i=0; $i<$arr_result; $i++) {
$arr = [implode(',', $res[$i])];
//print_r($arr);
$arr_str = implode('', $arr);
$connect_string = "host=localhost port=5432 dbname=postgres user=postgres password=";
$dbconnect = pg_connect($connect_string);
$query = "INSERT INTO test_db (id, pasport) VALUES ($i, '$arr_str') ";
$result = pg_query($dbconnect, $query);
pg_close($dbconnect);
}
set_time_limit(7200); — эта строка задает время, после которого скрипт перестанет работать. Это сделано для того чтобы скрипт в случае зависания смог самостоятельно окончить свою работу, по истечению указанного времени. Здесь я указываю число, равное 2 часам.
ini_set("memory_limit", "3000M"); — эта строка задет лимит оперативной памяти, который может быть задействован на работу скрипта.
Эти две функции не обязательны, но и не мешаю работе компьютера. Вы можете не бояться за оперативную память, ведь если файл не большого размера, то работа скрипта будет быстрой и не нагрузит систему.
Далее идет функция parse_excel_file, которая подключает библиотеку PHPExcel и обрабатывает файл который указан в ее параметре $filename.
В этой функции в первой строке находится следующий код
require_once $_SERVER['DOCUMENT_ROOT'].'/PHPExcel-1.8/Classes/PHPExcel.php';
Этот код указывает путь к папке в которой находятся файлы библиотеки. $_SERVER['DOCUMENT_ROOT']. — эта часть строки передает данные пути до файла домена, то есть в моем случае(я использую локальный хостинг OpenServer) это D:\OSPanel\domains\.
$result = array(); — здесь создается переменная и в неё записывается массив.
Здесь $file_type = PHPExcel_IOFactory::identify( $filename ); функция указывает тип файла, который передается. То есть если вы распечатаете эту функцию через var_dump(), то вы увидите строку CSV, это наш формат.
Далее идут строки, в которых подключается код из класса указанного на стороне библиотеки. Это нам не особо интересно, так как мы тут не можем не чего изменить.
А вот последняя строка в этой функции куда интереснее, здесь с помощью встроенных, в библиотеку методов класса, мы преобразуем нашу информацию в массив.
После создания функции, нам необходимо ее передать и записать результат ее выполнения в переменную, которую я назвал $res. Это мы делаем с помощью этой строки$res = parse_excel_file($_SERVER['DOCUMENT_ROOT'].'\files\list_of_expired_passports.csv' );. В качестве параметра мы передаем путь к нашему Excel файлу ($_SERVER[‘DOCUMENT_ROOT’].’\files\list_of_expired_passports.csv’ ).
Здесь мы сделаем небольшую паузу и посмотрим что у нас получилось. Если мы попробуем просмотреть, с помощью var_dump переменную $res, то мы увидим массив в котором находится много других массивов.
Я столкнулся с этим кодом, когда у меня был запрос на перенос в базу паспортов. Через запятую были записаны серия и номер (1234,174517). И когда я прогнал файл через этот код, то у меня на этой стадии получился вот такой массив — Array{Array{[0]=>»1234″[1]=>»174517″},Array{и так далее}}.
И так теперь давайте пойдем далее.
Следующая строка $arr_result = count($res); подсчитывает сколько элементов в $res.
И вот мы подошли к самому интересному… цикл for.
Здесь, в скобках мы передаем следующие условия работы цикла $i=0; $i<$arr_result; $i++.
$arr = [implode(',', $res[$i])] — здесь я создал переменную в которой преобразовал массив, а точнее значения в нем. До этого момента массив выглядел вот так Array{Array{[0]=>»1234″[1]=>»174517″}…}, а теперь массив выглядит так Array{Array{[0]=>»1234,174517″}.
$arr_str = implode('', $arr); — эта строка преобразует массив в строку. Теперь у нас на этом моменте получается, что есть строка вот такого вида 1234,174517. Я бы мог занести данные из массива в базу данных, как они есть, но мне нужно было чтобы они имели тип строки, чтобы в дальнейшем было удобнее их обрезать.
Следующие строки могут отличаться от ваших, в зависимости от того, какой базой данных вы пользуетесь. В данном случае здесь используется база PostgreSQL. По сути здесь простые функции подключения и работы с базой данных, которые вы легко сможете найти для своей базы данных.
Если у вас появились трудности с этой задачей, вы можете задать свой вопрос в нашей группе https://vk.com/prog_time , где вам обязательно ответят.
Если использовать, как и я PostgreSQL, то эта строчка $connect_string = "host=localhost port=5432 dbname=postgres user=postgres password="передает параметры для подключения к базе. Здесь вписываются следующие данные: сервер для подключения — localhost, порт — 5432, имя базы, которое вы предварительно создали — postgres, имя пользователя, у меня оно такое же как и у базы — postgres, пароль, у меня без пароля.
$dbconnect = pg_connect($connect_string) — здесь происходит подключение к базе, по параметрам которые были указанны выше.
$query = "INSERT INTO test_db (id, pasport) VALUES ($i, '$arr_str')" — в переменную query я записываю, запрос о внесение изменений в базу. Данные будут вноситься в таблицу test_db. В столбцы id и pasport будут вноситься данные из переменных i и arr_str.
$result = pg_query($dbconnect, $query) — эта строка производит передачу данных в базу данных.

