Как создать файл Excel с php в Symfony 2 & 3

Если вы новичок в разработке 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, конфигурация будет меняться, однако, чтобы она работала, принцип тот же:

  1. создать вид ветки с именем, типом расширения и .twig суффикс (например, excel.xlsx.twig).
  2. Верните это представление как ответ от контроллера.

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 обеспечивает подробная документация обо всех доступных тегах и функциях веток здесь.

Заметки

Ссылка на основную публикацию
Adblock
detector