Загрузка данных из Excel в MySQL с помощью PHP
Не так давно появилась задача – загрузить данные из Ecxel файла в базу сайта, и реализовать механизм так, чтобы быстро можно было обновлять эти данные, т.е. загружать новый файл. Решил попробовать парсер Excel-файлов phpExcelReader, но сколько не бился с ним, получал ошибку типа “… is not readable”. Поэтому решил использовать библиотеку PHPExcel.
Загружать будем прайс-лист:
Артикул | Наименование | Количество | Цена | Валюта | Единица |
123456 | Апельсин | 20 | 50000 | руб | килограмм |
123457 | Мандарин | 20 | 54000 | руб | килограмм |
123458 | Яблоко | 50 | 23500 | руб | килограмм |
В таблицу со структурой:
id | article | name |
quantity |
price |
currency |
unit |
Скачав архив с библиотекой и открыв его вы увидите несколько папок и файлов – это описание и примеры использования библиотеки. Нам понадобится папка “Classes” – распаковываем архив и загружаем её, например, в корень сайта.
Файл excel можно загрузить в нужную папку на сервере, например uploads, через ftp сервер или создать страницу загрузки с <input type=
"file"
name=
"upload_file"
. Для меня конечно второй вариант был в приоритете (как реализовать загрузку файла на сервер я писал в статье «Отправка формы и файлов через Ajax»).
Итак, предположим, что форму загрузки мы сделали, библиотеку подключили, начнем писать скрипт обработки файла и загрузки в базу данных.
include 'db_conn.php'; // подключаемся к базе данных $loadfile = $_POST['file_name']; // получаем имя загруженного файла require_once $_SERVER['DOCUMENT_ROOT']."/Classes/PHPExcel/IOFactory.php"; // подключаем класс для доступа к файлу $objPHPExcel = PHPExcel_IOFactory::load($_SERVER['DOCUMENT_ROOT']."/uploads/".$loadfile); foreach ($objPHPExcel->getWorksheetIterator() as $worksheet) // цикл обходит страницы файла { $highestRow = $worksheet->getHighestRow(); // получаем количество строк $highestColumn = $worksheet->getHighestColumn(); // а так можно получить количество колонок for ($row = 1; $row <= $highestRow; ++ $row) // обходим все строки { $cell1 = $worksheet->getCellByColumnAndRow(0, $row); //артикул $cell2 = $worksheet->getCellByColumnAndRow(1, $row); //наименование $cell3 = $worksheet->getCellByColumnAndRow(2, $row); //количество $cell4 = $worksheet->getCellByColumnAndRow(3, $row); //цена $cell5 = $worksheet->getCellByColumnAndRow(4, $row); //валюта $cell6 = $worksheet->getCellByColumnAndRow(5, $row); //единица измерения $sql = "INSERT INTO `price` (`article`,`name`,`quantity`,`price`,`currency`,`unit`) VALUES ('$cell1','$cell2','$cell3','$cell4','$cell5','$cell6')"; $query = mysql_query($sql) or die('Ошибка чтения записи: '.mysql_error()); } }
В принципе, второй цикл можно усовершенствовать, используя количество колонок, но у меня файл всегда будет стандартный, поэтому не вижу в этом смысла.
На CyberForum.ru нашел перевод документации к PHPExcel, который сделал SrgKord скачать можно тут: Документация разработчика PHPExcel (RUS).7z
Самый адекватный урок, ни чего лишнего!
>>но сколько не бился с ним, получал ошибку типа «… is not readable»
phpExcelReader чувствителен к кодировке, в моем случае я кинул в папку со скриптом .htaccess с php_value mbstring.internal_encoding windows-1251 и заработало. Кому то еще помогает php_value mbstring.func_overload 2.
Всем удачи =)
Задача: excel файл с google docs, конвертирую в нужный формат и заливаю на сайт вордпресс через плагин алл импорт в карточку товара. Практически срабатывает, но не погружает изображения (указаны ссылкой на гугл фото). Я так понимаю что система не работает так необходимор указывать изображения на прямую (предварительно залив их на сайт). Но мало ли – есть возможность это реализовать (загрузка изображений из екселя через ссылку на гугл фото)? Или в какую сторону копать?
Не совсем правильно обращаться к полям как getCellByColumnAndRow(0, $row); тем более что создатель прайса может добавить новую колонку и тогда где 1, 2, 3 уже не ясно.
В работе с гугл таблицами “asimlqt/php-google-spreadsheet-client”: “3.0.*” все строки возвращаются в виде ассоциативного массива где ключи это значениеиз первой строки. Получаются массивы вида:
[
‘id’ => 1
‘name’ => name
….
]
Второй момент когда записей 100 000. Тогда может не хватить памяти, времени для вставки всех значений, что тогда? Всё заново запускать?
Без использования библиотек, excel прайс сохраняем в csv, бьем по указанному разделителю и все, проще и быстрее, в общем виде:
$file_name = isset($argv[1]) ? $argv[1] : ‘for_test.csv’; // имя файла csv
$col = isset($argv[2]) ? $argv[2] : 2; //количество столбцов в таблице
$file = explode(“;”, file_get_contents($file_name)); // разделитель ;
for ( $f = 0; $f < count($file) – $col + 1; $f++){
if ($f < $col) {
continue;
}
for ( $ff = 0; $ff < $col; $ff++){
$file[$ff] // Пишем в БД
}
$f += $col – 1;
}