iteracode / excel
CakePHP 3 的 Excel 插件
Requires
- php: >=5.4
- cakephp/cakephp: ~3.0
- cakephp/plugin-installer: *
- phpoffice/phpexcel: 1.8.*
Requires (Dev)
This package is auto-updated.
Last update: 2024-09-19 02:38:53 UTC
README
该插件基于 [dakota] (https://github.com/dakota/CakeExcel) 的作品,并使用 PHPExcel 实现与 Excel 相关的功能。
安装
您可以使用 composer 将此插件安装到您的 CakePHP 应用程序中。
安装 composer 包的推荐方法是
添加
"repositories": [
{
"type": "vcs",
"url": "https://github.com/Iteracode/excel"
}
]
到您的 composer.json,因为此包不在 packagist 上。然后在您的控制台中
composer require Iteracode/Excel:dev-master
应获取插件。
在 bootstrap.php 中加载插件,如常操作
Plugin::load('Iteracode/Excel', ['bootstrap' => true, 'routes'=>true]);
RequestHandler 组件由插件的引导文件配置。如果不这样,您可以在控制器中的 initialize 方法中这样做,例如
public function initialize()
{
parent::initialize();
$this->loadComponent('RequestHandler', [
'viewClassMap' => ['xlsx' => 'Iteracode/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、一个 Entity、一个实体 Collection 或一个数据数组,并从数据创建一个工作表。实体的属性或数组中第一条记录的键被设置为生成的工作表的第一行的列标题。如果您使用非标准列类型,请小心。实际上,该 Helper 只与字符串、数字和日期一起工作。
在 config/routes.php 文件中在应受影响的路由之前注册 xlsx 扩展
Router::extensions(['xlsx']);
示例(假设您有一个 article 模型和控制器,带有常规的 index-action)
在 ArticlesController 中包含辅助函数
public $helpers = ['Iteracode/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('Iteracode/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']);