个性化阅读
专注于IT技术分析

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

本文概述

如果你是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中建立路由的方式, 配置会有所不同, 但是要使其起作用, 原理是相同的:

  1. 使用名称, 扩展名类型和.twig后缀创建一个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捆绑包视图的控制器:

<?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图表), 则可能需要阅读有关如何防止文件在生成时损坏的本文。
赞(0)
未经允许不得转载:srcmini » 如何在Symfony 2和3中使用php创建Excel文件

评论 抢沙发

评论前必须登录!