【问题标题】:How to use PHPExcel correctly with Symfony 2如何在 Symfony 2 中正确使用 PHPExcel
【发布时间】:2011-09-18 04:08:07
【问题描述】:

我需要将PHPExcelSymfony2 项目一起使用。任何人都知道如何正确设置项目以使用该库?我应该把它放在供应商目录中吗?配置文件等应该改变什么?

【问题讨论】:

    标签: symfony configuration phpexcel


    【解决方案1】:

    实际上,要正确执行此操作,您需要执行以下步骤:

    • 编辑您的deps 文件并添加来自PHPExcel 的依赖项
    [PHPExcel]
    git=http://github.com/PHPOffice/PHPExcel.git
    target=/phpexcel
    version=origin/master
    
    • 运行php bin/vendors install 以安装所有缺少的依赖项(在我们的例子中为PHPExcel

    • 更新app/autoload.php中的前缀部分:

    $loader->registerPrefixes(array(
        // ...
        'PHPExcel'         => __DIR__.'/../vendor/phpexcel/Classes',
    ));
    
    • 完成。现在,您可以在包的控制器中使用它(代码基于来自Tests/01simple-download-xls.phpPHPExcel 示例):
    <?php
    namespace Demo\MyBundle\Controller;
    
    use Symfony\Bundle\FrameworkBundle\Controller\Controller;
    use Symfony\Component\HttpFoundation\Response;
    use PHPExcel;
    use PHPExcel_IOFactory;
    
    class DemoController extends Controller
    {
       public function demoAction()
       { 
           $response = new Response();
    
           // Create new PHPExcel object
           $objPHPExcel = new PHPExcel();
    
           // Set document properties
           $objPHPExcel->getProperties()->setCreator("Me")
                       ->setLastModifiedBy("Someone")
                       ->setTitle("My first demo")
                       ->setSubject("Demo Document");
           // Add some data
           $objPHPExcel->setActiveSheetIndex(0)
                       ->setCellValue('A1', 'Hello')
                       ->setCellValue('B2', 'world!')
                       ->setCellValue('C1', 'Hello')
                       ->setCellValue('D2', 'world!');
           // Set active sheet index to the first sheet
           $objPHPExcel->setActiveSheetIndex(0);
    
           // Redirect output to a client’s web browser (Excel5)
           $response->headers->set('Content-Type', 'application/vnd.ms-excel');
           $response->headers->set('Content-Disposition', 'attachment;filename="demo.xls"');
           $response->headers->set('Cache-Control', 'max-age=0');
           $response->prepare();
           $response->sendHeaders();
           $objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel5');
           $objWriter->save('php://output');
           exit();
       }
    }
    

    【讨论】:

    • 只需在函数开头添加$response = new Response();并包含use Symfony\Component\HttpFoundation\Response;
    • 我永远不会在 Symfony2 控制器中使用“new”操作符——你是说——我永远不会对这个控制器进行单元测试,也不会让我的同事有机会测试它。这会起作用,但这是一种糟糕的做法
    • @alchemication 你能提供最佳实践解决方案吗?
    • @gakhov 当然,对不起,我的错;)将 PHPExcel 包装在一个服务类中,并在控制器中使用 $this-&gt;get('my.phpexcel_service') 来访问该服务。然后您也可以将此服务注入其他服务......等等......而且一切都很容易测试/模拟。希望它至少有所帮助。
    • @gakhov 值得一读(甚至几次):Symfony2 Services Docs
    【解决方案2】:
    1. 将库复制到您的供应商目录。
    2. 在引导文件中配置自动加载器:

      $loader->registerPrefixes(array(
          // Swift, Twig etc.
          'PHPExcel' => __DIR__ . '/../vendor/phpexcel/lib/PHPExcel'
      ));
      
    3. 就是这样。

    【讨论】:

    • 我有同样的问题,你能解释一下你的解决方案吗?如果我尝试在我的控制器中初始化 PHPExcel 类,我会得到一个“找不到类”...
    • 谢谢 - 但我如何在我的控制器中初始化 PHPExcel 类 - “新 PHPExcel”是否足够,还是我必须使用命名空间?
    • PHPExcel 不支持命名空间,它是在全局命名空间中定义的。使用\PHPExcel
    • 有一天(希望)PHPExcel 将能够放弃对 PHP 5.2 的支持并将 PHP5.3 设置为最低版本,然后我们将能够使用命名空间;但是超过 50% 的用户群仍在运行 5.2 服务器,我们还不能做出改变 :(
    【解决方案3】:

    实际上最好的解决方案是使用https://github.com/liuggio/ExcelBundle。 我尝试使用@Crozin 的解决方案,但我仍然收到有关 IOFactory::createWriter 的错误。 希望这可以帮助, 西蒙娜

    【讨论】:

      【解决方案4】:

      从 Symfony 2.3 开始,您现在可以这样做:

      ...
      "require": {
          ...
          "phpoffice/phpexcel": "dev-master"
          ...
      },
      ...
      

      然后只需运行composer update,依赖项就会自动解析。

      如果您不想弄乱composer.json 文件,也可以使用composer require phpoffice/phpexcel:dev-master

      【讨论】:

        【解决方案5】:

        如果您使用 composer 来管理您的项目,您只需更改 composer.json 文件:

        "autoload": {
            "psr-4": {
                "": "src/",
                "": "vendor/phpoffice/phpexcel/Classes/"
            },
            "classmap": [
                "app/AppKernel.php",
                "app/AppCache.php"
            ]
        },
        

        然后添加

        use PHPExcel;
        use PHPExcel_IOFactory;
        

        到你的控制器文件,你可以像这样使用 PHPExcel:

        $objPHPExcel = new PHPExcel();
        

        希望对你有帮助。

        【讨论】:

        • 是的,这是现代方式。 2011 年的情况有点不同:)
        【解决方案6】:

        使用 composer(自 Symfony2.1 起)非常简单,您只需修改 composer.json
        您不再需要注册命名空间!

        只有两点需要注意:

        1. 参考github标签,我只找到package类型的解决方案
        2. 当更改 composer.json 中与类自动加载相关的内容时,您必须删除 vendor 目录中的整个目录

        这里是相关链接:use PHPExcel with composer and Symfony2.2

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-07-19
          • 1970-01-01
          • 1970-01-01
          • 2011-10-04
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多