fanatik3/cakephp-excel

CakePHP 3 的 Excel 插件

安装: 33

依赖: 0

建议者: 0

安全: 0

星标: 0

关注者: 1

分支: 0

类型:cakephp-plugin

dev-main 2020-12-26 12:30 UTC

This package is auto-updated.

Last update: 2024-09-26 21:24:31 UTC


README

该插件基于[dakota] (https://github.com/dakota/CakeExcel) 的工作,并使用PHPExcel 提供与 Excel 相关的功能。

安装

您可以使用 composer 将此插件安装到您的 CakePHP 应用程序中。

安装 composer 包的推荐方法是

添加

"repositories": [
         {
            "type": "vcs",
            "url": "https://github.com/Fanatik3/excel"
        }
    ] 

到您的 composer.json,因为此包不在 Packagist 上。然后在您的控制台

composer require Fanatik3/Excel:dev-master

应获取插件。

像往常一样在 bootstrap.php 中加载插件

	Plugin::load('Fanatik3/Excel', ['bootstrap' => true, 'routes'=>true]);

RequestHandler 组件由插件的 bootstrap 文件配置。如果没有,您可以在控制器的 initialize 方法中这样做,例如

	public function initialize()
		{
        		parent::initialize();
        		$this->loadComponent('RequestHandler', [
            			'viewClassMap' => ['xlsx' => 'Fanatik3/Excel.Excel']
        ]);
        	}

注意:RequestHandlerComponent 默认已加载在您的 AppController 中。根据您的需求调整设置。

您需要设置 xlsx 扩展的解析。在 config/routes.php 文件中添加以下内容,在定义任何路由或范围之前

Router::extensions('xlsx');

或者您可以在范围内添加

$routes->setExtensions(['xlsx']);

(目前在插件的 config/routes.php 文件中设置此设置已损坏。因此,您必须在应用程序的 config/routes.php 文件中提供代码)

您还需要为生成的 Excel 文件提供布局。在 src/Template/Layout/ 子目录中添加一个名为 xlsx 的文件夹,并在该文件夹中创建一个名为 default.ctp 的文件,其内容至少如下所示

<?= $this->fetch('content') ?>

您可以从视图中创建 Excel 工作簿。这与 dakotas 插件类似。请参阅那里的文档。新增功能

1. ExcelHelper

有一个名为 'addworksheet' 的方法,它接受一个 ResultSet、一个实体、一个实体集合或一个数据数组,并从数据创建一个工作表。实体的属性或数组中第一条记录的键设置为生成的工作表的第一行的列标题。如果使用非标准列类型,请小心。辅助器实际上仅与字符串、数字和日期一起工作。

在 config/routes.php 文件中注册 xlsx 扩展,在应受影响的路由之前

    Router::extensions(['xlsx']);

示例(假设您有一个 article 模型和控制器,具有常规的 index 动作)

在 ArticlesController 中包含辅助器

   public $helpers = ['Fanatik3/Excel.Excel'];

在 Template/Articles 中添加一个名为 'xlsx' 的文件夹,并在该文件夹中创建一个名为 'index.ctp' 的文件。包括以下代码片段以获取名为 'Articles' 的单个工作表的 Excel 文件

    $this->Excel->addWorksheet($articles, 'Articles');

在您的应用程序中某个位置创建生成文件的链接

    <?= $this->Html->link(__('Excel'), ['controller' => 'Articles', 'action' => 'index', '_ext'=>'xlsx']); ?>

完成。

2. ImportComponent

接受一个 Excel 工作簿,提取一个包含数据的单个工作表(例如,使用辅助器生成),并生成一个数据数组,该数组可用于构建实体。第一行必须包含属性名/数据库列名。

在控制器中包含导入组件

 public function initialize()
 {
    parent::initialize();
    $this->loadComponent('Fanatik3/Excel.Import');
 }    

然后您可以使用该方法

 prepareEntityData($file = null, array $options = [])

例如,如果您已上传文件

 move_uploaded_file($this->gerRequest()->getData('file.tmp_name'), TMP . DS . $this->getRequest()->getData('file.name'));
 $data = $this->Import->prepareEntityData(TMP . $this->getRequest()->getData('file.name'));

您将获得一个与表单辅助器类似的数据数组。然后您可以在控制器中生成和保存实体

 $entities = $table->newEntities($data);
 foreach ($entities as $entity) {
       $table->save($entity, ['checkExisting' => false])
 }

如果您的表不为空且您不想替换数据库中的记录,则在 $options 数组中将 'append'=>true 设置为

$data = $this->Import->prepareEntityData($file, ['append'=> true]);

如果文件中有多个工作表,您可以在 $options 数组中提供工作表名称或索引以使用,例如

$data = $this->Import->prepareEntityData($file, ['worksheet'=> 0]);

或者

$data = $this->Import->prepareEntityData($file, ['worksheet'=> 'Articles']);