Интеграция PHPExcel и Kohana Framework
Итак, не буду ходить вокруг да около, имеется веб-проект написанный на php с использованием Kohana в который нужно добавить возможность генерации документов Excel. Ранее я уже решал подобные задачи при помощи библиотеки PHPExcel, но «скрещивать» Кохану и ПХПЭксель предстояло впервые.
Обычно использование сторонних библиотек под Kohana не вызывает проблем: библиотеку нужно скопировать в каталог application/vendor/, а в коде подключать при помощи
require Kohana::find_file('vendor', 'каталог_библиотеки/имя_подключаемого_файла');
Но я решил «погуглить» на предмет уже готовых модулей и нашел вот этот модуль.
Модуль состоял из одного класса Spreadsheet и имел несколько полезных методов для добавления данных в таблицу и записи на диск сгенерированной таблицы.
Использование модуля выявило несколько проблем/недочетов. Во-первых после подключения данного модуля перестал работать модуль userguide. Причина была в том что автор модуля решил поместить библиотеку PHPExcel в папке модуля в modules/phpexcel/vendor/. Во-вторых сгенерированную таблицу можно было только сохранить на сервере, возможности отправить файл сразу в браузер пользователя не было. В-третьих отсутствовала возможность получить текущий рабочий лист (объект PHPExcel_Worksheet) например для доступа к ячейкам листа.
Ради устранения недочетов было решено переписать модуль.
Библиотеку PHPExcel помещаем в application/vendor/ и изменяем init.php
<?php
/* PHP Excel integration */
require Kohana::find_file('vendor', 'phpexcel/PHPExcel');
Добавляем методы
public function set_active_sheet($index)
{
$this->_spreadsheet->setActiveSheetIndex($index);
}
для установки активной страницы,
public function get_active_sheet()
{
return $this->_spreadsheet->getActiveSheet();
}
для получения объекта текущей активной страницы и
public function send($settings=array())
{
$settings = array_merge(array(
'format' => 'Excel2007',
'name' => 'NewSpreadsheet',
), $settings);
$writer = PHPExcel_IOFactory::createWriter($this->_spreadsheet, $settings['format']);
$ext = $this->exts[$settings['format']];
$mime = $this->mimes[$settings['format']];
$request = Request::instance();
$request->headers['Content-Type'] = $mime;
$request->headers['Content-Disposition'] = 'attachment;filename="'.$settings['name'].'.'.$ext.'"';
$request->headers['Cache-Control'] = 'max-age=0';
$request->send_headers();
if ($settings['format'] == 'CSV')
{
$writer->setUseBOM(true);
}
$writer->save('php://output');
exit;
}
для отправки таблицы в браузер.
Кроме этого добавляем поддержку нескольких форматов для сохранения таблиц: Excel2007, Excel5, CSV и PDF
private $exts = array(
'CSV' => 'csv',
'PDF' => 'pdf',
'Excel5' => 'xls',
'Excel2007' => 'xlsx',
);
private $mimes = array(
'CSV' => 'text/csv',
'PDF' => 'application/pdf',
'Excel5' => 'application/vnd.ms-excel',
'Excel2007' => 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
);
В результате получившийся модуль kohana-phpexcel.
Как использовать модуль.
Устанавливаете модуль kohana-phpexcel в modules/phpexcel/.
Устанавливаете библиотеку PHPExcel. В application/vendor/ создаете каталог phpexcel. Скачиваете с официального сайта последнюю версию (в данный момент 1.7.5) библиотеки PHPExcel, распаковываете архив и копируете все содержимое каталога classes в application/vendor/.
Подключаете модуль. В application/bootstrap.php правим список автозагружаемых модулей
Kohana::modules(array(
...
'phpexcel' => MODPATH.'phpexcel',
));
Пример использования модуля
$ws = new Spreadsheet(array(
'author' => 'Kohana-PHPExcel',
'title' => 'Report',
'subject' => 'Subject',
'description' => 'Description',
));
$ws->set_active_sheet( 0);
$as = $ws->get_active_sheet();
$as->setTitle('Report');
$as->getDefaultStyle()->getFont()->setSize(9);
$as->getColumnDimension('A')->setWidth(7);
$as->getColumnDimension('B')->setWidth(40);
$as->getColumnDimension('C')->setWidth(12);
$as->getColumnDimension('D')->setWidth(10);
$sh = array(
1 => array('Day','User','Count','Price'),
2 => array(1, 'John', 5, 587),
3 => array(2, 'Den', 3, 981),
4 => array(3, 'Anny', 1, 214)
);
$ws->set_data($sh, false);
$ws->send(array('name'=>'report', 'format'=>'Excel5'));
(#) TyraelOne:
Подскажите как записать значение в таблицу которое начинается с нуля?:
0123
0055
Устанавливаю текстовый формат для всех ячеек так
$as->getDefaultStyle()->getNumberFormat()->setFormatCode(PHPExcel_Style_NumberFormat::FORMAT_TEXT);
И он нормально устанавливается но в ячейки записываются данные без нулей на начале:
123
55
(#) TyraelOne:
Разобрался. Вот кому может пригодится..
в файле classes/spreadsheet.php
строку (128)
$sheet->setCellValueByColumnAndRow($column, $row, $value);
меняем на
$sheet->setCellValueExplicitByColumnAndRow($column, $row, $value);
(#) Alexander:
А возможно засунуть PHPExcel библиотеку не в application/vendor/phpexcel а в modules/НашМодуль/vendor/phpexcel ?
(#) Sasha:
Спс, за туториал, а как можно:
1. С БД когда записи выбераю, их как подставить в Excel?
2. Как после подстановки записей, сразу предоставить скачивание файла?
Спасибо.