Добрый день.
Никак не могу найти информацию, как вывести прайс excel на сайте в виде обычной html странички.
Суть задачи — менеджер загружает на сайт обновленный прайс (TV файл) — он обновляется на странице. Внешний вид на странице:
Modx Revo 2.3.2
Просто так ничего не будет выводиться. Если загружаете экселевский файл, то он без лишних действий им же и останется. Если в 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);
Да, я так и получал TV, там у меня ошибки именно в PHPExcel. Спасибо.
Че за ошибки-то?
Не помню. Были разные по мере работ. Буквально час назад заработало.
Поменял запись из примера:
$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 строк? Или это все дело как-то кэшируется?
Илья, изучайте основы MODX, и чем отличается [[showXls?]] от [[!showXls?]].