【问题标题】:PHPSpreadsheet - How Do I Use Auto Migration ToolPHPSpreadsheet - 如何使用自动迁移工具
【发布时间】:2019-04-12 09:48:24
【问题描述】:

我是一个长期阅读者,但对提问很陌生。如果我问错了,请纠正我。

简介

我们正在将我们的服务器从 PHP 5.4 升级到 PHP 7.2,与新版本 PHP 不完全兼容的库之一是 PHPExcel。因此,我们也在升级到 PHPSpreadsheet。我们的很多项目都以不同的方式使用 PHPExcel,所以如果我能让 Auto Migrate 工具正常工作,即使它遗漏了一些东西,这对我来说也能节省大量时间。

使用该工具的说明可在此处找到: https://phpspreadsheet.readthedocs.io/en/develop/topics/migration-from-PHPExcel/

他们只是说在通过 Composer 安装后使用以下命令(我已经完成了):

cd /project/to/migrate/src
/project/to/migrate/vendor/phpoffice/phpspreadsheet/bin/migrate-from-phpexcel

问题

我能够很好地执行迁移器,但它只扫描“vendor/phpoffice/phpspreadsheet”目录中的文件。它根本不扫描我的项目中的任何文件。


如何让迁移脚本扫描我的项目文件,而不是它自己的文件?


当地环境

  1. Windows 10
  2. 最新的 XAMPP
  3. PHP 7.2.11

我是如何运行它的

cd C:\path\to\project\that\uses\phpexcel
php vendor\phpoffice\phpspreadsheet\bin\migrate-from-phpexcel

到目前为止我是如何解决的

  1. 在说明页面上运行确切的命令(最终运行两个命令,第二个是无效命令)
  2. 将“migrate-from-phpexcel”移动到我的项目根目录并在那里运行
  3. 在移动到项目根目录并指向 Bootstrap.php 文件后编辑“migrate-from-phpexcel”(运行,但仅在库本身内部。同样的问题)

【问题讨论】:

  • 我怀疑通过简单地运行迁移工具,您的 PHPExcel 原始代码也适用于 SpreadsheetExcel。根据我的经验,需要完成“大量代码重写”,而不仅仅是简单地重命名几个函数。我建议坚持使用 PHPExcel 库(1.8.1+),它也应该适用于 PHP 7+ 版本,除非你有足够的时间。

标签: php migration phpspreadsheet


【解决方案1】:

我不知道您是如何或从哪里运行第二个命令的,但该命令遍历了我的整个项目并进行了看似适当的转换。我在 IDE 中时从项目根目录运行它(PhpStorm,使用它的“运行命令”工具)。我运行了与您相同的命令,如下所示:

 php vendor\phpoffice\phpspreadsheet\bin\migrate-from-phpexcel  

确认“是”后,我看到它遍历目录,更改了各种文件但跳过了它的 OWN 文件。 当我测试我的脚本时,我从它的一个模块(第 312 行和第 313 行的Coordinate.php)中遇到了关于“非数字值”的警告。我对警告进行了一些研究,但除了人们指责 PHP 7.1**(我正在运行 7.2.*)外,找不到任何可以解决的问题。所以我取消了警告,我的电子表格完全按照我指定的方式创建。 这是我在“创建 excel”脚本中的第一条语句:

 error_reporting(E_ALL & ~E_NOTICE & ~E_WARNING); 

我必须进行的唯一其他“手动”更改是将“createWriter”的文件格式从“Excel2007”更改为“Xlsx”——正如它在文档中所说的那样。更复杂的电子表格可能需要更多的手动工作,但可能没有上面提到的那么多。

【讨论】:

    【解决方案2】:

    2021+ 自动升级方法

    Discalimer:我编写了一个工具来处理从 CLI 自动迁移的名为 Rector 的工具,因此人们不必再手动升级 PHP 代码了。 It's free, open-source, on GitHub.


    官方迁移工具仅修复类名。还有 24 种情况需要更改,例如提到的“'Excel2007' to 'Xlsx'”。

    我们需要升级庞大的 PHP 项目,而手动更改会花费太多时间,并且可能会耽误我们数周。相反,我们制作了一个包含所有 25 个案例的升级集,为我们更改了代码


    分 4 步 ↓

    1.将 Rector 安装到您的 PHP 项目中

    composer install rector/rector --dev
    

    2.创建rector.php 配置

    vendor/bin/rector init
    

    3.添加电子表格集:

    use Rector\Set\ValueObject\SetList;
    use Symfony\Component\DependencyInjection\Loader\Configurator\ContainerConfigurator;
    
    return static function (ContainerConfigurator $containerConfigurator) {
        $containerConfigurator->import(SetList::PHPEXCEL_TO_PHPSPREADSHEET);
    };
    
    

    4.在您的代码上运行 Rector

    # to see diff with no changes
    vendor/bin/rector process src --dry-run
    
    
    # to make changes happen
    vendor/bin/rector process src
    

    如果你想了解更多,we wrote a short post about it

    【讨论】:

      【解决方案3】:

      如果它对其他人有帮助:在更新使用 PhpExcel v1.8.2 的旧项目时,在代码库上运行 rector 在大多数需要处理的文件上失败,并出现错误:

      [ERROR] Could not process "test.php" file, due to:                                                
               "Analyze error: "PHPExcel_Writer_Exception (Unable to load PDF Rendering library) thrown while looking 
               for class PHPExcel_Writer_PDF_DomPDF.". Include your files in "$parameters->set(Option::AUTOLOAD_PATHS,
               [...]);" in "rector.php" config.                                                                       
               See https://github.com/rectorphp/rector#configuration". 
      

      为了解决这个问题,我在这里遵循了建议:https://github.com/rectorphp/rector/issues/6418#issuecomment-882923495 并注释掉了 PhpExcel 安装本身中的行 - 文件中包含 throw new PHPExcel_Writer_Exception('Unable to load PDF Rendering library'); 的行 DomPDF.php、mPDF.php、tcPDF.php em> 在 Classes/PHPExcel/Writer/PDF/

      【讨论】:

        猜你喜欢
        • 2013-11-27
        • 1970-01-01
        • 1970-01-01
        • 2010-11-20
        • 1970-01-01
        • 2011-01-04
        • 2020-08-10
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多