如何在Symfony 2和3中使用php创建Excel文件

本文概述

  • A.从控制器
  • B.使用Twig
  • 笔记
如果你是php开发的新手, 那么PHPExcel库可能对你来说完全不为人知, 该项目为PHP编程语言提供了一组类, 这些类允许你读写不同的电子表格文件格式, 例如Excel(BIFF ).xls, Excel 2007(OfficeOpenXML)、. xlsx, CSV, Libre / OpenOffice Calc .ods, 数字, PDF, HTML。该项目基于Microsoft的OpenXML标准和PHP构建。
在Symfony 2-3中有2种生成Excel文件的方法, 一种是使用普通的ExcelBundle来使用PHPOffice, 就像在任何类型的PHP项目上一样(建议用于简单和复杂的excel文档, 因为使用原始文档非常容易操作) PHPOffice代码), 也可以使用TwigExcelBundle使用Twig生成Excel文件(推荐用于基本的CSV, XLS和XLSX文件, 而无需复杂的结构)。
A.从控制器在Symfony中, 一种好的做法是使用捆绑软件, 而不是在控制器中使用require一次以包含我们的库。这个捆绑包(不是PHPExcel库)的创建者是liuggio, 可以在github的官方存储库中查看源代码。
注意首先阅读PHPExcel库的正式文档很重要, 然后使用symfony 2的过程将非常直观。
要安装我们的捆绑包, 我们将在require区域中添加composer.json文件。
"liuggio/excelbundle": "dev-master",

【如何在Symfony 2和3中使用php创建Excel文件】如果直接在控制台中使用composer, 则执行:
composer require liuggio/excelbundle

下载所有依赖项后, 只需将捆绑包添加到你的内核(AppKernel.php文件), 即可:
$bundles = array( // ... new Liuggio\ExcelBundle\LiuggioExcelBundle(), // Add excel bundle );

创建使用PHP创建的流式Excel文件
在此示例中, 我们将使用excel 2007 writer, 请记住, 在我们使用的原始库中: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"; } }

B.使用TwigTwigExcelBundle是一个symfony捆绑包, 可为Twig提供简单的PhpExcel集成。要安装此捆绑软件, 请执行以下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中注册捆绑软件:
< ?phpuse Symfony\Component\HttpKernel\Kernel; use Symfony\Component\Config\Loader\LoaderInterface; class AppKernel extends Kernel { public function registerBundles() { $bundles = [ // .... // new MewesK\TwigExcelBundle\MewesKTwigExcelBundle(), // .... // ]; // .... // }// .... // }

使用php bin /控制台缓存清除项目的缓存:清除, 让我们开始使用捆绑软件。
返回Excel文件作为响应
根据你在symfony中建立路由的方式, 配置会有所不同, 但是要使其起作用, 原理是相同的:
  1. 使用名称, 扩展名类型和.twig后缀创建一个Twig视图(例如excel.xlsx.twig)。
  2. 从控制器返回该视图作为响应。
YAML
如果你使用YAML来配置路由, 请首先添加以控制器为目标的路由:
# routing.ymlmybundle_route: path:/{_filename}.{_format} defaults: { _controller: mainBundle:Default:index, _format: xlsx }## To access this route use: ## www.mydomain.com/example-filename.xlsx

然后创建一个返回TwigExcel捆绑包视图的控制器:
< ?phpnamespace mainBundle\Controller; use Symfony\Bundle\FrameworkBundle\Controller\Controller; use Symfony\Component\HttpFoundation\Request; class DefaultController extends Controller { public function indexAction(Request $request) { return $this-> 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 %}

从控制器, 我们正在发送一个包含一些数据的数组, 它将在Twig文件中的行中呈现。请注意, 可以根据需要以所需的方式更改格式。现在, 如果你访问声明的路由(www.domain.com/custom-filename.xlsx), 你将获得一个excel文件作为下载响应。
注解
如果你使用注释, 请在控制器中创建一个返回TwigExcel视图的路由:
< ?phpnamespace mainBundle\Controller; use Symfony\Bundle\FrameworkBundle\Controller\Controller; use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route; use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template; use Symfony\Component\HttpFoundation\Response; class DefaultController extends Controller { /** * @Route("/{_filename}.{_format}", defaults={"_format"="xls", "_filename"="example"}, requirements={"_format"="csv|xls|xlsx"}) * @Template("mainBundle:Default:excel.xlsx.twig") */ public function indexAction($_filename) { return ['data' => ['La', 'Le', 'Lu']]; } }

该视图将与YAML配置中的Providen相同。现在, 如果你访问声明的路由(www.domain.com/custom-filename.xlsx), 你将获得一个excel文件作为下载响应。
注意:路由的名称将是生成文件的文件名, 因此请验证你为路由中的excel文件提供了有效的文件名, 并带有正确的扩展名以防止损坏文件。
TwigExcel捆绑包在此处提供了所有可用的twig标签和功能的详细文档。
笔记
  • 请记住, 这里提供了PHPExcel库的官方文档, 它与该捆绑包完全不同。该捆绑包是PHPExcel库的symfony 2的包装。
  • 如果要使用图表(phpExcel图表), 则可能需要阅读有关如何防止文件在生成时损坏的本文。

    推荐阅读