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

4 комментария

  1. >>но сколько не бился с ним, получал ошибку типа «… is not readable»

    phpExcelReader чувствителен к кодировке, в моем случае я кинул в папку со скриптом .htaccess с php_value mbstring.internal_encoding windows-1251 и заработало. Кому то еще помогает php_value mbstring.func_overload 2.
    Всем удачи =)

  2. Задача: excel файл с google docs, конвертирую в нужный формат и заливаю на сайт вордпресс через плагин алл импорт в карточку товара. Практически срабатывает, но не погружает изображения (указаны ссылкой на гугл фото). Я так понимаю что система не работает так необходимор указывать изображения на прямую (предварительно залив их на сайт). Но мало ли — есть возможность это реализовать (загрузка изображений из екселя через ссылку на гугл фото)? Или в какую сторону копать?

  3. Не совсем правильно обращаться к полям как getCellByColumnAndRow(0, $row); тем более что создатель прайса может добавить новую колонку и тогда где 1, 2, 3 уже не ясно.
    В работе с гугл таблицами «asimlqt/php-google-spreadsheet-client»: «3.0.*» все строки возвращаются в виде ассоциативного массива где ключи это значениеиз первой строки. Получаются массивы вида:
    [
    ‘id’ => 1
    ‘name’ => name
    ….
    ]

    Второй момент когда записей 100 000. Тогда может не хватить памяти, времени для вставки всех значений, что тогда? Всё заново запускать?

Оставить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *