本文概述
如果你是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",
如果直接在控制台中使用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.使用Twig
TwigExcelBundle是一个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中注册捆绑软件:
<?php
use 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中建立路由的方式, 配置会有所不同, 但是要使其起作用, 原理是相同的:
- 使用名称, 扩展名类型和.twig后缀创建一个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捆绑包视图的控制器:
<?php
namespace 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视图的路由:
<?php
namespace 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图表), 则可能需要阅读有关如何防止文件在生成时损坏的本文。
评论前必须登录!
注册