Вывод прайса excel на сайте

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

<table>...</table>

Modx Revo 2.3.2

Comments

Просто так ничего не будет выводиться. Если загружаете экселевский файл, то он без лишних действий им же и останется. Если в HTML выводить, то его парсить надо. Есть два основных варианта:

  1. Загружать именно как эксель (формат .xls или .xlsx), подключать php-библиотеку для работы с эксель-файлами, парсить данные и выводить их в нужном формате.
  2. Сохранять эксель-файл в формате CSV. С ним проще работать как с простым текстовым файлом. В помощь функции fgetcsv и str_getcsv.

Спасибо. Я подключал pxpexcel, делал по аналогии с Evo, но к сожалению так и не смог избавиться от ошибок. С PHP я не настолько хорошо знаком. Думал, может у кого осталась ссылочка на мануал или заметка Evernote.

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

думал там можно просто заменить getTemplateVarOutput на Revo-вские getObject

Так getTemplateVarOutput() возвращает значение ТВ-поля. В Рево это $modx->resource->getTVValue($tv_id);

Не помню. Были разные по мере работ. Буквально час назад заработало. Поменял запись из примера:

$objReader = PHPExcel_IOFactory::createReader('Excel2007');
//    $objPHPExcel = $objReader->load($xls);

На:

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

$xls — tv путь к файлику экселя. И сейчас всё работает.

Оставлю тут, может кому пригодится: Скачиваем библиотеку 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?]]

Ну что, круто! И на вид даже универсально. Имело смысл не комментом дописать, а прям в топик, но и так пойдет, можно просто UPD-ссылку в топик дописать на решение. Наверняка кому-нибудь пригодится.

И теперь в ресурсе, где надо вывести Excel и где мы загрузили в TV файлик, запускаем сниппет: [[showXls?]]

Решение действительно интересное. Один вопрос. Скажите, а не накладно, что при каждом обновлении страницы происходит обработка Excel-файла? А если прайс большой? У меня более 1000 строк? Или это все дело как-то кэшируется?