pazys 25 декабря 2014 1 12
Добрый день.
Никак не могу найти информацию, как вывести прайс excel на сайте в виде обычной html странички.
Суть задачи — менеджер загружает на сайт обновленный прайс (TV файл) — он обновляется на странице. Внешний вид на странице:
<table>...</table>

Modx Revo 2.3.2
12 комментариев
Fi1osof1
Fi1osof 25 декабря 2014г в 14:35 #
Просто так ничего не будет выводиться. Если загружаете экселевский файл, то он без лишних действий им же и останется. Если в HTML выводить, то его парсить надо. Есть два основных варианта:
1. Загружать именно как эксель (формат .xls или .xlsx), подключать php-библиотеку для работы с эксель-файлами, парсить данные и выводить их в нужном формате.
2. Сохранять эксель-файл в формате CSV. С ним проще работать как с простым текстовым файлом. В помощь функции fgetcsv и str_getcsv.
p
pazys 25 декабря 2014г в 18:11 #
Спасибо. Я подключал pxpexcel, делал по аналогии с Evo, но к сожалению так и не смог избавиться от ошибок.
С PHP я не настолько хорошо знаком. Думал, может у кого осталась ссылочка на мануал или заметка Evernote.

loom-studio.net/2011/06/otobrazhaem-v-modx-evo-dannyie-iz-excell/
Вот по аналогии делал, думал там можно просто заменить getTemplateVarOutput на Revo-вские getObject но полезли ошибки PHPExcel.

Попробую fgetcsv использовать.
Fi1osof1
Fi1osof 25 декабря 2014г в 20:42 #
думал там можно просто заменить getTemplateVarOutput на Revo-вские getObject
Так getTemplateVarOutput() возвращает значение ТВ-поля. В Рево это $modx->resource->getTVValue($tv_id);
p
pazys 26 декабря 2014г в 11:22 #
Да, я так и получал TV, там у меня ошибки именно в PHPExcel. Спасибо.
M
MisterN 26 декабря 2014г в 17:10 #
Че за ошибки-то?
p
pazys 26 декабря 2014г в 17:19 #
Не помню. Были разные по мере работ. Буквально час назад заработало.
Поменял запись из примера:
$objReader = PHPExcel_IOFactory::createReader('Excel2007');
//    $objPHPExcel = $objReader->load($xls);

На:
$objPHPExcel = PHPExcel_IOFactory::load($xls);

$xls — tv путь к файлику экселя.
И сейчас всё работает.
M
MisterN 26 декабря 2014г в 17:36 #
Заработало — ок.
p
pazys 28 декабря 2014г в 21:06 #
Оставлю тут, может кому пригодится:
Скачиваем библиотеку PHPExcel
Я положил ее в assets/lib/ там внутри уже папка Classes из скачанного архива, в сниппете будет виден путь.
Создал TV файл, назвал его xlsFile
Создал сниппет showXls, в нем присутствует отладочная информация:
<?php
require_once 'assets/lib/Classes/PHPExcel/IOFactory.php'; // Подключаем библиотеку
$xls = $modx->resource->getTVValue('xlsFile'); // Наш TV
$objPHPExcel = PHPExcel_IOFactory::load($xls); // Скармливаем его библиотеке
foreach ($objPHPExcel->getWorksheetIterator() as $worksheet)
{
    $worksheetTitle     = $worksheet->getTitle();
    $highestRow         = $worksheet->getHighestRow(); // Например, 10
    $highestColumn      = $worksheet->getHighestColumn(); // Например, 'F'
    $highestColumnIndex = PHPExcel_Cell::columnIndexFromString($highestColumn);
    $nrColumns = ord($highestColumn) - 64;
    echo "
В таблице ".$worksheetTitle." ";
    echo $nrColumns . ' колонок (A-' . $highestColumn . ') ';
    echo ' и ' . $highestRow . ' строк.';
    echo '
Данные: <table border="0"><tr>';
    for ($row = 1; $row <= $highestRow; ++ $row)
    {
        echo '<tr>';
        for ($col = 0; $col < $highestColumnIndex; ++ $col) 
        {
            $cell = $worksheet->getCellByColumnAndRow($col, $row);
            $val = $cell->getValue();
            $dataType = PHPExcel_Cell_DataType::dataTypeForValue($val);
            echo '<td>' . $val . '
(Тип ' . $dataType . ')</td>';
        }
        echo '</tr>';
    }
    echo '</table>';
}

И теперь в ресурсе, где надо вывести Excel и где мы загрузили в TV файлик, запускаем сниппет:
[[showXls?]]
Fi1osof1
Fi1osof 28 декабря 2014г в 21:19 #
Ну что, круто! И на вид даже универсально. Имело смысл не комментом дописать, а прям в топик, но и так пойдет, можно просто UPD-ссылку в топик дописать на решение. Наверняка кому-нибудь пригодится.
Fi1osof1
Fi1osof 28 декабря 2014г в 21:28 #
За полезный материал поднимаю статус до члена Клуба :)
I
Ilya 16 июня 2015г в 16:45 #
И теперь в ресурсе, где надо вывести Excel и где мы загрузили в TV файлик, запускаем сниппет:
[[showXls?]]
Решение действительно интересное. Один вопрос. Скажите, а не накладно, что при каждом обновлении страницы происходит обработка Excel-файла? А если прайс большой? У меня более 1000 строк? Или это все дело как-то кэшируется?
Fi1osof1
Fi1osof 16 июня 2015г в 18:55 #
Илья, изучайте основы MODX, и чем отличается [[showXls?]] от [[!showXls?]].
Авторизуйтесь или зарегистрируйтесь (можно через соцсети ), чтобы оставлять комментарии.