Загрузка данных из 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;
}