За последние 24 часа нас посетили 101739 программистов и 6357 роботов. Сейчас ищут 1442 программиста ...

Вывод прайса excel с поиском

Тема в разделе "PHP для новичков", создана пользователем lom54, 19 сен 2016.

Метки:
  1. lom54

    lom54 Новичок

    С нами с:
    19 сен 2016
    Сообщения:
    4
    Симпатии:
    0
    Привет, многоуважаемые программисты!:)
    Имею небольшой опыт программирования на php,
    есть задача: отображать загруженный прайс лист (.xls) в браузере с поиском по нему.

    Поиск по принципу:
    Пользователь вводит: samsung и нажимает поиск, вместо полного прайс листа ему выводит результаты поиска в виде выборки из таблицы:
    Аккумулятор Samsung-5235 9999руб
    Телефон Samsung-5222 9999руб
    Телевизор Samsung-112 9999руб

    Вывод:
    Должна быть такого плана (см.рис), то есть вывод картинок не обязателен, все максимально просто, обычная html таблица с данными из экселя.
    [​IMG]


    Предполагаю, что поиск можно реализовать при помощи preg_match и регулярок, но как быть с выводом прайс листа? Буду благодарен за любую помощь, советы, рекомендации. За помощь готов заплатить в разумных пределах, бюджет очень скромный:) Заранее спасибо!!!
     
  2. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.213
    Симпатии:
    1.711
    Адрес:
    Молдова, г.Кишинёв
    Когда загружают файл, ты его с помощью PHPExcel прочитай и загрузи в базу, потом напиши скрипт который будет искать в базе, через LIKE оператор в MySQL, этого достаточно.
    Перенести может в раздел free-lance или будешь сам пытаться по нашим подсказкам делать?
     
    lom54 нравится это.
  3. lom54

    lom54 Новичок

    С нами с:
    19 сен 2016
    Сообщения:
    4
    Симпатии:
    0
    Спасибо. Попытаюсь самостоятельно, опыт бесценный. Если вдруг возникнут вопросы по ходу реализации, то задам их здесь.
     
  4. lom54

    lom54 Новичок

    С нами с:
    19 сен 2016
    Сообщения:
    4
    Симпатии:
    0
    Функцию дернул с хабра
    PHP:
    1. // Подключаем библиотеку
    2.     require_once 'Classes/PHPExcel.php';
    3.  
    4.     // Функция преобразования листа Excel в таблицу MySQL, с учетом объединенных строк и столбцов.
    5.     // Значения берутся уже вычисленными. Параметры:
    6.     //     $worksheet - лист Excel
    7.     //     $connection - соединение с MySQL (mysqli)
    8.     //     $table_name - имя таблицы MySQL
    9.     //     $columns_name_line - строка с именами столбцов таблицы MySQL (0 - имена типа column + n)
    10.     function excel2mysql($worksheet, $connection, $table_name, $columns_name_line = 0) {
    11.       // Проверяем соединение с MySQL
    12.       if (!$connection->connect_error) {
    13.         // Строка для названий столбцов таблицы MySQL
    14.         $columns_str = "";
    15.         // Количество столбцов на листе Excel
    16.         $columns_count = PHPExcel_Cell::columnIndexFromString($worksheet->getHighestColumn());
    17.  
    18.         // Перебираем столбцы листа Excel и генерируем строку с именами через запятую
    19.         for ($column = 0; $column < $columns_count; $column++) {
    20.           $columns_str .= ($columns_name_line == 0 ? "column" . $column : $worksheet->getCellByColumnAndRow($column, $columns_name_line)->getCalculatedValue()) . ",";
    21.         }
    22.  
    23.         // Обрезаем строку, убирая запятую в конце
    24.         $columns_str = substr($columns_str, 0, -1);
    25.  
    26.         // Удаляем таблицу MySQL, если она существовала
    27.         if ($connection->query("DROP TABLE IF EXISTS " . $table_name)) {
    28.           // Создаем таблицу MySQL
    29.           if ($connection->query("CREATE TABLE " . $table_name . " (" . str_replace(",", " TEXT NOT NULL,", $columns_str) . " TEXT NOT NULL)")) {
    30.             // Количество строк на листе Excel
    31.             $rows_count = $worksheet->getHighestRow();
    32.  
    33.             // Перебираем строки листа Excel
    34.             for ($row = $columns_name_line + 1; $row <= $rows_count; $row++) {
    35.               // Строка со значениями всех столбцов в строке листа Excel
    36.               $value_str = "";
    37.  
    38.               // Перебираем столбцы листа Excel
    39.               for ($column = 0; $column < $columns_count; $column++) {
    40.                 // Строка со значением объединенных ячеек листа Excel
    41.                 $merged_value = "";
    42.                 // Ячейка листа Excel
    43.                 $cell = $worksheet->getCellByColumnAndRow($column, $row);
    44.  
    45.                 // Перебираем массив объединенных ячеек листа Excel
    46.                 foreach ($worksheet->getMergeCells() as $mergedCells) {
    47.                   // Если текущая ячейка - объединенная,
    48.                   if ($cell->isInRange($mergedCells)) {
    49.                     // то вычисляем значение первой объединенной ячейки, и используем её в качестве значения
    50.                     // текущей ячейки
    51.                     $merged_value = $worksheet->getCell(explode(":", $mergedCells)[0])->getCalculatedValue();
    52.                     break;
    53.                   }
    54.                 }
    55.  
    56.                 // Проверяем, что ячейка не объединенная: если нет, то берем ее значение, иначе значение первой
    57.                 // объединенной ячейки
    58.                 $value_str .= "'" . (strlen($merged_value) == 0 ? $cell->getCalculatedValue() : $merged_value) . "',";
    59.               }
    60.  
    61.               // Обрезаем строку, убирая запятую в конце
    62.               $value_str = substr($value_str, 0, -1);
    63.  
    64.               // Добавляем строку в таблицу MySQL
    65.               $connection->query("INSERT INTO " . $table_name . " (" . $columns_str . ") VALUES (" . $value_str . ")");
    66.             }
    67.           } else {
    68.             return false;
    69.           }
    70.         } else {
    71.           return false;
    72.         }
    73.       } else {
    74.         return false;
    75.       }
    76.  
    77.       return true;
    78.     }
    79.  
    80.     // Соединение с базой MySQL
    81.     $connection = new mysqli("localhost", "root", "", "tomka");
    82.     // Выбираем кодировку UTF-8
    83.     $connection->set_charset("utf8");
    84.  
    85.     // Загружаем файл Excel
    86.     $PHPExcel_file = PHPExcel_IOFactory::load("./file.xlsx");
    87.  
    88.     // Преобразуем первый лист Excel в таблицу MySQL
    89.     $PHPExcel_file->setActiveSheetIndex(0);
    90.     echo excel2mysql($PHPExcel_file->getActiveSheet(), $connection, "excel2mysql0", 1) ? "OK\n" : "FAIL\n";
    91.  
    92.     // Перебираем все листы Excel и преобразуем в таблицу MySQL
    93.     foreach ($PHPExcel_file->getWorksheetIterator() as $index => $worksheet) {
    94.       echo excel2mysql($worksheet, $connection, "excel2mysql" . ($index != 0 ? $index : ""), 1) ? "OK\n" : "FAIL\n";
    95.     }
    Загрузил в базу данных данные из прайса. Теперь нужно вывести в виде таблицы, поможете? Предполагаю, что надо циклом пробегаться и в <td> <tr> раскидывать значения, но как точно сделать это я не знаю. Табица получилась такого вида.
    [​IMG]
    Заранее спасибо
     
  5. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.870
    Симпатии:
    955
    Тогда что твоя тема делает в разделе для профи, если ты не знаешь каким алгоритмом таблицу вывести? Унесу в новички?
     
  6. lom54

    lom54 Новичок

    С нами с:
    19 сен 2016
    Сообщения:
    4
    Симпатии:
    0
    Размещал исходя из целей, а не из моих навыков. По моему мнению вывести таблицу xlsx и сделать поиск по ней новичку не под силу.
     
  7. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.870
    Симпатии:
    955
    Раздел по скилу спрашивающего, а не отвечающих. Скил у тебя на профи не тянет. А задачу ты перед собой ставишь добротную. Это похвально. Но тема уезжает в новички.
     
  8. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.129
    Симпатии:
    1.223
    Адрес:
    там-сям
    Советую попробовать js-компоненту datatables. Он может искать/фильтровать, сортировать по клику на колонке и многое другое. Может работать как с единовременно загруженными данными, так и запрашивать серверный API — на выбор.