export-to-excel - 我需要编写一个以 CSV 和 XLSX 格式导出数据的插件。十月 CMS
问题描述
我需要编写一个以 CSV 和 XLSX格式导出数据的插件*. 作为基础,我遵循使用 ImportExport 后端行为的 Vojta 的插件代码 (1) 。
主插件控制器DataImportExport
从位于ImportExportController
.
class DataImportExport extends Controller
{
public$implement = [
'Backend.Behaviors.ImportExportController',
];
...
}
正是这种行为具有将数据导出到 CSV 文件的方法。然而,如果我想导出到 XLSX 文件中,我应该将相应的方法添加到该行为中,即通过覆盖其现有方法的一些方法添加到导出控制器中。然而,当我在DataImportExport
控制器内部执行此操作时,它不起作用......当我尝试/测试时,导出过程与仅使用 CSV 之前的导出过程保持一致......似乎无法覆盖/扩展后端行为,即modules\backend\behaviors\ImportExportController.php
。
例如,在DataimportExport
控制器上,我尝试通过添加用于 XLSX 导出的代码来覆盖行为exportFromList()
方法-
然而,没有积极的变化......我尝试了它。ImportExportController
class DataImportExport extends Controller
{
public $implement = [
'Backend.Behaviors.ImportExportController',
];
public function __construct()
{
parent::__construct();
BackendMenu::setContext('RainLab.User', 'user', $this->action);
// extending the ImportExportController behavior
\Backend\Behaviors\ImportExportController::extend(function($model) {
$model->addDynamicProperty('tagsCache', null);
$model->addDynamicMethod('writeXLSX', function() use ($model) {
});
$model->addDynamicMethod('getTagsAttribute', function() use ($model) {
if ($this->tagsCache) {
return $this->tagsCache;
} else {
return $this->tagsCache = $model->tags()->lists('name');
}
});
});
}
...
// method to override
public function exportFromList($definition = null, $options = [])
{
...
$response = Response::make();
if ($options['export_type'] == 'csv') {
/*
* Response CSV
*/
$response->header('Content-Type', 'text/csv');
$response->header('Content-Transfer-Encoding', 'binary');
$response->header('Content-Disposition', sprintf('%s; filename="%s"', 'attachment', $filename));
$response->setContent((string) $csv);
} else {
// export into xlsx code
}
return $response;
}
}
笔记
- Vojta 的插件仅从 CSV 文件导出/导入。
解决方案
也许你应该看看https://octobercms.com/plugin/vdomah-excel在哪里可以导入和导出 CSV 和 Excel 文件?该文档非常好,我在许多项目中都使用它来导入数据,并且运行良好。
最好的,卢卡斯
推荐阅读
- amazon-web-services - Redshift Spectrum 读取文件的数据格式是什么?
- go - 如何用 go-swagger 实现中间件?
- reactjs - history.push 没有在反应中重新渲染路线
- javascript - 不要在three.js中清除相机标志
- shared-libraries - 多进程取消链接共享内存,需要只有在所有进程退出时才应该取消链接共享内存
- prometheus - Prometheus:可以赋予 storage.tsdb.retention.time 标志的最小值是多少
- ios - popoverPresentationControllerDidDismissPopover 的替代方法?
- javascript - AJAX 数据的控制台日志是我的 html 代码吗?
- amazon-web-services - 如何在 AWS Elasticsearch 上配置“search.max_open_scroll_context”
- azure - 是否可以强制所有 Azure AD B2C MFA 为自动拨号电话。同时隐藏呼叫我按钮