XLSX, CSV в MySQL с помощью PHP

CSV (Comma-Separated Values — значения, разделённые запятыми) — текстовый формат, предназначенный для представления табличных данных. Каждая строка файла — это одна строка таблицы. Значения отдельных колонок разделяются разделительным символом (delimiter). Под CSV, как правило, понимают набор значений, разделенных какими угодно разделителями, в какой угодно кодировке с какими угодно окончаниями строк.

CSV и PHP.

  • fgetcsv — Читает строку из файла и производит разбор данных CSV. Эта функция принимает во внимание настройки локали. К примеру, если LANG установлена в en_US.UTF-8, то файлы в однобайтовой кодировке будут неправильно прочитаны этой функцией.

Формат файла .xlsx основан на Open XML. Для уменьшения размера файла используется сжатие zip.

Файлы xlsx совместимы и с более старыми версиями Microsoft Office - 2000, XP, 2003. Но для этого необходимо установить специальный компонент.

Поскольку файл XLSX содержит несколько файлов, его нельзя импортировать непосредственно в MySQL. Поэтому рекомендуется преобразовать файл XLSX в CSV, а затем импортировать его в базу данных.

Используется PHP класс SimpleXLSX class 0.7.13 (Official)

  1. скачиваем класс SimpleXLSX
    git clone https://github.com/shuchkin/simplexlsx.git
  2. Код преобразующий xlsx в csv
    <?php
     
    include_once('simplexlsx.class.php');
     
    $file_out='output_file.csv';
     
    $xlsx = SimpleXLSX::parse('input_file.xlsx');
    $fp=fopen($file_out,'w');
    foreach( $xlsx->rows() as $fields ) {
    fputcsv($fp, $fields);
    }
    fclose($fp);
  3. Преобразуем файл XLSX в PHP массив и импортировать его в базу данных, используя расширения PDO PHP. Предварительно очищаем таблицу и после загрузки удаляем строку с названиями столбцов.
    try {
        $etdb = new PDO('mysql:host=' .
                ET_MYSQL_HOST .
                ';dbname=' . ET_MYSQL_DATABASE, ET_MYSQL_USER, ET_MYSQL_PASSWORD);
    } catch (PDOException $e) {
        print "Error!: " . $e->getMessage() . "<br />";
    }
    // Clear Table
    $etdb->query('TRUNCATE TABLE df_garne;');
     
    $xlsx = SimpleXLSX::parse('garne_prices_bags.xlsx');
     
    // Insert rows from xlsx
    $stmt = $etdb->prepare( "INSERT INTO df_garne
    (sku, name, color, price_opt, price_retail, size, type, category, brand, url_to_shop, consist,
    description, fotos, sex)
    VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)");
        $stmt->bindParam( 1, $sku);
        $stmt->bindParam( 2, $name);
        $stmt->bindParam( 3, $color);
        $stmt->bindParam( 4, $price_opt);
        $stmt->bindParam( 5, $price_retail);
        $stmt->bindParam( 6, $size);
        $stmt->bindParam( 7, $type);
        $stmt->bindParam( 8, $category);
        $stmt->bindParam( 9, $brand);
        $stmt->bindParam( 10, $url_to_shop);
        $stmt->bindParam( 11, $consist);
        $stmt->bindParam( 12, $description);
        $stmt->bindParam( 13, $fotos);
        $stmt->bindParam( 14, $sex);
     
     
        foreach ($xlsx->rows() as $fields)
        {
            $sku = $fields[1];
            $name = $fields[2];
            $color = $fields[3];
            $price_opt = $fields[4];
            $price_retail = $fields[5];
            $size = $fields[6];
            $type = $fields[7];
            $category = $fields[8];
            $brand = $fields[9];
            $url_to_shop = $fields[10];
            $consist = $fields[11];
            $description = $fields[12];
            $fotos = $fields[13];
            $sex = $fields[14];
     
            $stmt->execute();
        }
     
    // Delete row with names of field
    $etdb->query("DELETE FROM df_garne WHERE sku='Артикул';");