Интеграция 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')); 

Комментарии

  1. (#)   TyraelOne:

    Подскажите как записать значение в таблицу которое начинается с нуля?:
    0123
    0055

    Устанавливаю текстовый формат для всех ячеек так
    $as->getDefaultStyle()->getNumberFormat()->setFormatCode(PHPExcel_Style_NumberFormat::FORMAT_TEXT);

    И он нормально устанавливается но в ячейки записываются данные без нулей на начале:
    123
    55


  2. (#)   TyraelOne:

    Разобрался. Вот кому может пригодится..

    в файле classes/spreadsheet.php
    строку (128)
    $sheet->setCellValueByColumnAndRow($column, $row, $value);
    меняем на
    $sheet->setCellValueExplicitByColumnAndRow($column, $row, $value);


  3. (#)   Alexander:

    А возможно засунуть PHPExcel библиотеку не в application/vendor/phpexcel а в modules/НашМодуль/vendor/phpexcel ?


Оставить комментарий

Ответ на Интеграция PHPExcel и Kohana Framework