Содержание
Если вы новичок в разработке php, библиотека PHPExcel может показаться вам совершенно незнакомой, этот проект предоставляет набор классов для языка программирования PHP, которые позволяют вам писать и читать из различных форматов файлов электронных таблиц, таких как Excel (BIFF). ) .xls, Excel 2007 (OfficeOpenXML) .xlsx, CSV, Libre / OpenOffice Calc .ods, Gnumeric, PDF, HTML. Этот проект построен на основе стандарта Microsoft OpenXML и PHP.
Существует два способа создания файлов Excel в Symfony 2-3, либо вы используете обычный ExcelBundle для использования PHPOffice, как и в любом PHP-проекте (рекомендуется для простых и сложных документов Excel, так как очень легко манипулировать оригиналом). PHPOffice) или вы можете сгенерировать файлы Excel с помощью Twig, используя TwigExcelBundle (рекомендуется для базовых файлов CSV, XLS и XLSX без сложных структур).
A. от контролеров
В Symfony рекомендуется использовать комплекты вместо использования в контроллере require для включения нашей библиотеки. Создатель этого пакета (не библиотека PHPExcel) liuggio и исходный код можно посмотреть в официальный репозиторий в github.
Заметка
Важно сначала прочитать официальную документацию библиотеки PHPExcel, затем процесс будет действительно интуитивно понятным с Symfony 2.
Для установки нашего пакета мы добавим в composer.json
файл в требуемой зоне
"liuggio/excelbundle": "dev-master",
Если вы используете composer непосредственно в консоли, выполните:
composer require liuggio/excelbundle
Когда все зависимости будут загружены, просто добавьте пакет к ядру (файл AppKernel.php) так:
$bundles = array(
// ...
new Liuggio\ExcelBundle\LiuggioExcelBundle(),// Add excel bundle
);
Создание потокового файла Excel, созданного с помощью php
В этом примере мы будем использовать писатель Excel 2007, помните, что в оригинальной библиотеке мы использовали: new PHPExcel_Writer_Excel2007($objPHPExcel);
но с этим пакетом мы будем использовать функцию createWriter, предоставляемую пакетом.
// Important to include
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\HttpFoundation\ResponseHeaderBag;
class DefaultController extends Controller
{
public function indexAction($name)
{
// ask the service for a excel object
$phpExcelObject = $this->get('phpexcel')->createPHPExcelObject();
$phpExcelObject->getProperties()->setCreator("liuggio")
->setLastModifiedBy("Giulio De Donato")
->setTitle("Office 2005 XLSX Test Document")
->setSubject("Office 2005 XLSX Test Document")
->setDescription("Test document for Office 2005 XLSX, generated using PHP classes.")
->setKeywords("office 2005 openxml php")
->setCategory("Test result file");
$phpExcelObject->setActiveSheetIndex(0)
->setCellValue('A1', 'Hello')
->setCellValue('B2', 'world!');
$phpExcelObject->getActiveSheet()->setTitle('Simple');
// Set active sheet index to the first sheet, so Excel opens this as the first sheet
$phpExcelObject->setActiveSheetIndex(0);
// create the writer
$writer = $this->get('phpexcel')->createWriter($phpExcelObject, 'Excel2007');
// create the response
$response = $this->get('phpexcel')->createStreamedResponse($writer);
// adding headers
$dispositionHeader = $response->headers->makeDisposition(
ResponseHeaderBag::DISPOSITION_ATTACHMENT,
'PhpExcelFileSample.xlsx'
);
$response->headers->set('Content-Type', 'text/vnd.ms-excel; charset=utf-8');
$response->headers->set('Pragma', 'public');
$response->headers->set('Cache-Control', 'maxage=1');
$response->headers->set('Content-Disposition', $dispositionHeader);
return $response;
}
}
Сохранение файла Excel в пути
// Important to include
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\HttpFoundation\ResponseHeaderBag;
class DefaultController extends Controller
{
public function indexAction($name)
{
// ask the service for a excel object
$phpExcelObject = $this->get('phpexcel')->createPHPExcelObject();
$phpExcelObject->getProperties()->setCreator("liuggio")
->setLastModifiedBy("Giulio De Donato")
->setTitle("Office 2005 XLSX Test Document")
->setSubject("Office 2005 XLSX Test Document")
->setDescription("Test document for Office 2005 XLSX, generated using PHP classes.")
->setKeywords("office 2005 openxml php")
->setCategory("Test result file");
$phpExcelObject->setActiveSheetIndex(0)
->setCellValue('A1', 'Hello')
->setCellValue('B2', 'world!');
$phpExcelObject->getActiveSheet()->setTitle('Simple');
// Set active sheet index to the first sheet, so Excel opens this as the first sheet
$phpExcelObject->setActiveSheetIndex(0);
// create the writer
$writer = $this->get('phpexcel')->createWriter($phpExcelObject, 'Excel2007');
// The save method is documented in the official PHPExcel library
$writer->save('/path/to/save/filename.xlsx');
// Return a Symfony response (a view or something or this will thrown error !!!)
return "A symfony response";
}
}
Б. Использование ветки
TwigExcelBundle это пакет Symfony, который обеспечивает простую интеграцию PhpExcel для Twig. Чтобы установить этот пакет, выполните следующую команду composer:
composer require mewesk/twig-excel-bundle
Или, если вы хотите добавить в composer.json
а затем выполнить composer install
:
{
"require": {
"mewesk/twig-excel-bundle": "^2.1"
},
}
Замечания: если вы хотите использовать пакет Twig, то LuggioExcelBundle не требуется, так как этот пакет автоматически установит исходный PHPOffice в качестве зависимости компоновщика.
После установки комплекта с помощью composer зарегистрируйте комплект в своем /app/AppKernel.php
:
Очистите кеш вашего проекта, используя php bin/console cache:clear
и начнем с использования комплекта.
Возврат файла Excel в качестве ответа
В зависимости от того, как вы устанавливаете маршруты в Symfony, конфигурация будет меняться, однако, чтобы она работала, принцип тот же:
- создать вид ветки с именем, типом расширения и
.twig
суффикс (например,excel.xlsx.twig
). - Верните это представление как ответ от контроллера.
YAML
Если вы используете YAML для настройки маршрутов, начните с добавления маршрута, предназначенного для контроллера:
# routing.yml
mybundle_route:
path: /{_filename}.{_format}
defaults: { _controller: mainBundle:Default:index, _format: xlsx }
## To access this route use:
## www.mydomain.com/example-filename.xlsx
Затем создайте контроллер, который возвращает представление пакета TwigExcel:
render('mainBundle:Default:excel.xlsx.twig', [
'data' => ['La', 'Le', 'Lu']
]);
}
}
наш excel.xlsx.twig
представление будет содержать следующую структуру (находится в /src/mainBundle/default/excel.xlsx.twig
):
{% xlsdocument %}
{% xlssheet 'Worksheet' %}
{% xlsrow %}
{% xlscell { style: { font: { size: '18' } } } %}Values{% endxlscell %}
{% endxlsrow %}
{% for value in data %}
{% xlsrow %}
{% xlscell %}{{ value }}{% endxlscell %}
{% endxlsrow %}
{% endfor %}
{% endxlssheet %}
{% endxlsdocument %}
Из контроллера мы отправляем массив с некоторыми данными, и он будет отображаться в строках в файле ветки. Обратите внимание, что формат может быть изменен в соответствии с вашими потребностями. Теперь, если вы получаете доступ к заявленному маршруту (www.domain.com/custom-filename.xlsx
) вы получите файл Excel в ответ на скачивание.
аннотирование
Если вы используете аннотацию, создайте маршрут в контроллере, который возвращает представление TwigExcel:
['La', 'Le', 'Lu']];
}
}
Представление будет таким же, как и в конфигурации YAML. Теперь, если вы получаете доступ к заявленному маршруту (www.domain.com/custom-filename.xlsx
) вы получите файл Excel в ответ на скачивание.
Замечания: имя маршрута будет именем файла сгенерированного файла, поэтому убедитесь, что вы указали правильное имя файла Excel в маршруте с правильным расширением, чтобы предотвратить повреждение файлов.
Пакет TwigExcel обеспечивает подробная документация обо всех доступных тегах и функциях веток здесь.
Заметки
- Помните, что официальный документация библиотеки PHPExcel доступна здесь и это совершенно отличается от этого комплекта. Этот пакет является оболочкой для Symfony 2 библиотеки PHPExcel.