Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 14.04.2014, 11:38   #1
Deme7r
 
Регистрация: 28.03.2014
Сообщений: 4
Хорошо Парсер из excel в MySQL посредством PHP.

Доброго времени суток всем! Поставлена задача скопировать много информации из excel в БД MYSQL. Так как последний раз изучал написание скриптов в PHP в институте, даже основы позабыл. Но, я не отчаялся и принялся за дело.
Нашел доступную из интернета библиотеку тут.
После этого установил все компоненты для корректной отработки отсюда.
Некоторое время пробороздив просторы интернета, нашел некоторую информацию с уже готовыми скриптами. Подправил скрипт немного под себя. Но, естественно ожидать правильной отработки с моими таблицами долго не пришлось. Вот скрипт (напишу пока до той строки, где возникла ошибка, а по продолжению дискуссии буду добавлять ещё):
PHP код:
<?php
    
// Подключаем модуль
    
require_once ".\exceltomysql\excel_mysql.php";

    echo 
"it works";
    
    
// Соединение с базой MySQL
    
$connection = new mysqli("localhost""user""pass""base");
    
    
// Выбираем кодировку UTF-8
    
$connection->set_charset("utf8");

    
// Открываем файл Excel для чтения
    
$PHPExcel_file PHPExcel_IOFactory::load("example.xlsx");
    
    
// После открытия файла, нам нужно перебрать все листы в нем и каждый добавить в базу MySQL (можно и 1 конкретный, но об этом позже)
    
foreach ($PHPExcel_file->getWorksheetIterator() as $worksheet) {
    
// ...
}
// Мы будем исходить из того, что таблицы у нас нет (или есть, но с другими данными) и ее нужно создать. Для этого нам нужно получить имена для столбцов (имена могут находиться в 1 строчке таблицы)
    // Строка для названий столбцов таблицы MySQL
    
$columns_str "";
    
    
// Количество столбцов на листе Excel
    
$columns_count PHPExcel_Cell::columnIndexFromString($worksheet->getHighestColumn());

    
// Перебираем столбцы листа Excel и генерируем строку с именами через запятую
    
for ($column 0$column $columns_count$column++) {
    
$columns_str .= ($columns_names_on1line "column" $column $worksheet->getCellByColumnAndRow($column1)->getCalculatedValue()) . ",";
Ошибка, которая отображается на моем localhost/:
Код:
Notice: Undefined variable: columns_names_on1line in C:\apache\localhost\www\index.php on line 28
И я не могу дать толку, как с ней справиться. Вроде ругается на переменную, но что тут надо дописать? В чем причина ошибки? Добавлял после
Код:
($columns_names_on1line = 0
вместо "?" отрабатывалась пустая страница, но таблица в БД MYSQL так и не была загружена. Может кто подскажет решение? Если что-то написал не понятно, спрашивайте, буду рад пообщаться.
Deme7r вне форума Ответить с цитированием
Старый 14.04.2014, 13:37   #2
ATL
Форумчанин
 
Аватар для ATL
 
Регистрация: 26.01.2007
Сообщений: 278
По умолчанию

$columns_names_on1line не определена и проверку она не проходит.
Можно сделать костыль:

PHP код:
$columns_names_on1line 0;
for (
$column 0$column $columns_count$column++) {
    
$columns_str .= ($columns_names_on1line "column" $column $worksheet->getCellByColumnAndRow($column1)->getCalculatedValue()) . ","
можно от этого непонятно участка избавиться:
PHP код:
for ($column 0$column $columns_count$column++) {
    
$columns_str .= $worksheet->getCellByColumnAndRow($column1)->getCalculatedValue() . ","
ATL вне форума Ответить с цитированием
Старый 14.04.2014, 17:18   #3
Deme7r
 
Регистрация: 28.03.2014
Сообщений: 4
По умолчанию

Я опробовал оба предложенных варианта (подставлял заплатку и убирал часть скрипта). Оставил пока костыль "для полноты ощущений". Страница пуста, а значит отработана, как я понимаю. Захожу в базу, куда должна выгрузиться таблица из excel документа. Ничего нет. Вот оставшаяся часть скрипта:
PHP код:
// Обрезаем строку, убирая запятую в конце
    
$columns_str substr($columns_str0, -1);
    
    
// Далее удаляем таблицу из базы, если она существовала, и создаем новую
    
$connection->query("DROP TABLE IF EXISTS exceltable");
    
$connection->query("CREATE TABLE exceltable (" str_replace(","" TEXT NOT NULL,"$columns_str) . " TEXT NOT NULL)");
    
    
// Количество строк на листе Excel
    
$rows_count $worksheet->getHighestRow();

    
// Перебираем строки листа Excel
    
for ($row 1$row <= $rows_count$row++) {
    
// Строка со значениями всех столбцов в строке листа Excel
    
$value_str "";

    
// Перебираем столбцы листа Excel
    
for ($column 0$column $columns_count$column++) {
        
// Строка со значением объединенных ячеек листа Excel
        
$merged_value "";
        
// Ячейка листа Excel
        
$cell $worksheet->getCellByColumnAndRow($column$row);

        
// Перебираем массив объединенных ячеек листа Excel
        
foreach ($worksheet->getMergeCells() as $mergedCells) {
            
// Если текущая ячейка - объединенная,
            
if ($cell->isInRange($mergedCells)) {
                
// то вычисляем значение первой объединенной ячейки, и используем её в качестве значения текущей ячейки
                
$merged_value explode(":"$mergedCells);
                
                
/** @noinspection PhpDeprecationInspection */
                
$merged_value $worksheet->getCell($merged_value[0])->getCalculatedValue();
                
                break;
            }
        }

        
// Проверяем, что ячейка не объединенная: если нет, то берем ее значение, иначе значение первой
        // объединенной ячейки
        
$value_str .= "'" . (strlen($merged_value) == $cell->getCalculatedValue() : $merged_value) . "',";
    }

    
// Обрезаем строку, убирая запятую в конце
    
$value_str substr($value_str0, -1);

    
// Добавляем строку в таблицу MySQL
    
$connection->query("INSERT INTO exceltable (" $columns_str ") VALUES (" $value_str ")");

Может я что-то не дописал? Жду замечаний по возможности.
И кстати, насчет
Код:
$columns_names_on1line
я посмотрел на соответствие в библиотеке что-то похожее. Нет похожих. Есть только
Код:
$columns_names
Интересно, что хотел сделать этим первоначальный автор скрипта?
Deme7r вне форума Ответить с цитированием
Старый 14.04.2014, 18:50   #4
ATL
Форумчанин
 
Аватар для ATL
 
Регистрация: 26.01.2007
Сообщений: 278
По умолчанию

Судя по всему, вывод ошибок PHP выключен? Включите, скорее всего "что-то пошло не так".

И надо построчно идти и проверять каждую переменную:
PHP код:
$columns_count PHPExcel_Cell::columnIndexFromString($worksheet->getHighestColumn());

    
// Перебираем столбцы листа Excel и генерируем строку с именами через запятую
    
for ($column 0$column $columns_count$column++) { 
В $columns_count точно что-то пришло? Если 0 - пролетаем, цикл не выполняется.

PHP код:
$connection->query("CREATE TABLE exceltable (" str_replace(","" TEXT NOT NULL,"$columns_str) . " TEXT NOT NULL)"); 
Что в $columns_str? Таблица создаётся? Если нет - дальше тоже всё ломается.
ATL вне форума Ответить с цитированием
Старый 14.04.2014, 20:08   #5
Deme7r
 
Регистрация: 28.03.2014
Сообщений: 4
По умолчанию

Да вроде все раскомментировано:
PHP код:
error_reporting E_ALL E_STRICT
display_errors 
On
display_startup_errors 
On
log_errors 
On 
Если что-то ещё не включено, прошу дописать.
Где-то прочитал, что вот так еще можно (это так, к словцу):
Включение вывода всех ошибок и предупреждений в коде PHP-скриптов
Включить вывод уведомлений и предупреждений можно, добавив в начало нужного .php файла следующие строки:
PHP код:
ini_set('error_reporting'E_ALL);
ini_set('display_errors'1);
ini_set('display_startup_errors'1); 
Построчно каждую переменную проверять. В этом моменте, как в сериале Санта-Барбара ( серий было так много - что до сих пор помню имена всех героев, да смысла сериала так и не понял). Т.е. вроде и перепроверял, и все равно.. Поэтому и обратился сюда, может я настолько косоглазый?
Было ещё дело, я начал грешить на его функцию. Система такова: index.php(первоначальный)>excel_mys ql.php(функция)>PHPExcel.php, но проверить ведь просто (или нет?). Берем и меняем:
PHP код:
// Подключаем модуль
    
require_once ".\exceltomysql\excel_mysql.php"
на:
PHP код:
// Подключаем модуль
    
require_once ".\exceltomysql\PHPExcel.php"
безрезультатно.

А вот, как в базе отобразилось:
Эта таблица там уже была мною создана до начала работы над парсером.

Последний раз редактировалось Deme7r; 14.04.2014 в 20:11. Причина: Не отобразилась ссылка на картинку
Deme7r вне форума Ответить с цитированием
Старый 14.04.2014, 20:24   #6
Deme7r
 
Регистрация: 28.03.2014
Сообщений: 4
По умолчанию

Цитата:
Сообщение от Deme7r Посмотреть сообщение
Было ещё дело, я начал грешить на его функцию. Система такова: index.php(первоначальный)>excel_mys ql.php(функция)>PHPExcel.php, но проверить ведь просто (или нет?). Берем и меняем:
PHP код:
// Подключаем модуль
    
require_once ".\exceltomysql\excel_mysql.php"
на:
PHP код:
// Подключаем модуль
    
require_once ".\exceltomysql\PHPExcel.php"
безрезультатно.
вот функция
Deme7r вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Php парсер части сайтов) Fahman PHP 6 15.12.2013 17:14
PHP: Передача данных из MYSQL в Excel student2008 PHP 0 13.05.2013 13:01
Парсер XML на PHP cfgKEKS PHP 6 31.03.2012 16:42
разработка приложения для бд mysql посредством delph любаша БД в Delphi 11 16.10.2010 18:29
Отправка письма посредством php Syltan PHP 9 17.03.2010 14:57