dfware / csv-grid
Yii2扩展,将数据导出到CSV文件
Requires
- yiisoft/yii2: ~2.0.13
Requires (Dev)
- phpunit/phpunit: 4.8.27 || ^5.0 || ^6.0
This package is auto-updated.
Last update: 2024-09-27 20:02:50 UTC
README
安装此扩展的首选方式是通过composer。
运行
composer require dfware/csv-grid
或添加
"dfware/csv-grid": "*"
到您的composer.json的require部分。
使用方法
此扩展提供将数据导出到CSV文件的功能。导出通过\yii2tech\csvgrid\CsvGrid
实例进行,该实例提供类似于\yii\grid\GridView
小部件的接口。
示例
<?php use yii2tech\csvgrid\CsvGrid; use yii\data\ArrayDataProvider; $exporter = new CsvGrid([ 'dataProvider' => new ArrayDataProvider([ 'allModels' => [ [ 'name' => 'some name', 'price' => '9879', ], [ 'name' => 'name 2', 'price' => '79', ], ], ]), 'columns' => [ [ 'attribute' => 'name', ], [ 'attribute' => 'price', 'format' => 'decimal', ], ], ]); $exporter->export()->saveAs('/path/to/file.csv');
\yii2tech\csvgrid\CsvGrid
允许导出\yii\data\DataProviderInterface
和\yii\db\QueryInterface
实例。导出通过批次进行,这允许处理大量数据而不会发生内存溢出。
在\yii\data\DataProviderInterface
的使用情况下,数据将通过分页机制分成批次。因此,您应该设置分页以及页面大小以控制批次大小
<?php use yii2tech\csvgrid\CsvGrid; use yii\data\ActiveDataProvider; $exporter = new CsvGrid([ 'dataProvider' => new ActiveDataProvider([ 'query' => Item::find(), 'pagination' => [ 'pageSize' => 100, // export batch size ], ]), ]); $exporter->export()->saveAs('/path/to/file.csv');
注意:如果您在数据提供者中禁用分页,则不会执行批处理。
在\yii\db\QueryInterface
的使用情况下,如果查询类(例如,在\yii\db\Query
或\yii\db\ActiveQuery
的使用情况下)中存在batch()
方法,则CsvGrid
将尝试使用该方法。如果不存在batch()
方法,则将自动创建围绕给定查询的yii\data\ActiveDataProvider
实例。您可以通过\yii2tech\csvgrid\CsvGrid::$batchSize
控制批次大小
<?php use yii2tech\csvgrid\CsvGrid; $exporter = new CsvGrid([ 'query' => Item::find(), 'batchSize' => 200, // export batch size ]); $exporter->export()->saveAs('/path/to/file.csv');
在运行Web应用程序时,您可以使用\yii2tech\csvgrid\ExportResult::send()
方法通过下载对话框将结果文件发送到浏览器
<?php use yii2tech\csvgrid\CsvGrid; use yii\data\ActiveDataProvider; use yii\web\Controller; class ItemController extends Controller { public function actionExport() { $exporter = new CsvGrid([ 'dataProvider' => new ActiveDataProvider([ 'query' => Item::find(), ]), ]); return $exporter->export()->send('items.csv'); } }
将结果分割成多个文件
在导出大量数据时,您可能希望将导出结果分割成多个文件。这对于您计划使用具有单个文件中最大行数限制的程序很有用。例如:'Open Office'和'MS Excel 97-2003'允许每个CSV文件最多65536行,'MS Excel 2007' - 1048576。
您可以使用\yii2tech\csvgrid\CsvGrid::$maxEntriesPerFile
来限制单个结果文件中的最大行数。如果导出结果生成多个CSV文件,则这些文件将自动归档到单个归档文件中。例如
<?php use yii2tech\csvgrid\CsvGrid; $exporter = new CsvGrid([ 'query' => Item::find(), 'maxEntriesPerFile' => 60000, // limit max rows per single file ]); $exporter->export()->saveAs('/path/to/archive-file.zip'); // output ZIP archive!
注意:您不必将多个文件的结果作为单个归档接收。您可以使用\yii2tech\csvgrid\ExportResult::$csvFiles
手动遍历创建的CSV文件,并按您喜欢的任何方式处理它们
<?php use yii2tech\csvgrid\CsvGrid; $exporter = new CsvGrid([ 'query' => Item::find(), 'maxEntriesPerFile' => 60000, // limit max rows per single file ]); $result = $exporter->export(); foreach ($result->csvFiles as $csvFile) { /* @var $csvFile \yii2tech\csvgrid\CsvFile */ copy($csvFile->name, '/path/to/dir/' . basename($csvFile->name)); }
归档结果
如果导出结果包含多个CSV文件,则将自动归档。但是,您可以通过\yii2tech\csvgrid\ExportResult::$forceArchive
强制执行导出结果的归档
<?php use yii2tech\csvgrid\CsvGrid; $exporter = new CsvGrid([ 'query' => Item::find(), 'resultConfig' => [ 'forceArchive' => true // always archive the results ], ]); $exporter->export()->saveAs('/path/to/archive-file.zip'); // output ZIP archive!
注意!默认情况下,\yii2tech\csvgrid\ExportResult
使用PHP Zip扩展来创建归档。因此,如果此扩展未存在于您的环境中,则它将失败。
您可以通过\yii2tech\csvgrid\ExportResult::$archiver
设置自己的归档方法。例如
<?php use yii2tech\csvgrid\CsvGrid; $exporter = new CsvGrid([ 'query' => Item::find(), 'resultConfig' => [ 'forceArchive' => true, 'archiver' => function (array $files, $dirName) { $archiveFileName = $dirName . DIRECTORY_SEPARATOR . 'items.tar'; foreach ($files as $fileName) { // add $fileName to $archiveFileName archive } return $archiveFileName; }, ], ]); $exporter->export()->saveAs('/path/to/items.tar');
在通过\yii2tech\csvgrid\ExportResult::send()
将文件发送到浏览器时,无需检查结果是否已归档,因为将自动附加正确的文件扩展名
<?php use yii2tech\csvgrid\CsvGrid; use yii\data\ActiveDataProvider; use yii\web\Controller; class ItemController extends Controller { public function actionExport() { $exporter = new CsvGrid([ 'dataProvider' => new ActiveDataProvider([ 'query' => Item::find(), // over 1 million records ]), 'maxEntriesPerFile' => 60000, ]); return $exporter->export()->send('items.csv'); // displays dialog for saving `items.csv.zip`! } }
自定义输出格式
尽管CSV规定特定的数据格式(每个值用引号括起,值之间用逗号分隔,行之间用换行符分隔),但在某些情况下需要对其进行更改。例如:您可能需要使用分号来分隔值,或者可能想创建TSV(表格分隔值)文件而不是CSV。您可以使用\yii2tech\csvgrid\CsvGrid::$csvFileConfig
来自定义格式条目。
<?php use yii2tech\csvgrid\CsvGrid; $exporter = new CsvGrid([ 'query' => Item::find(), 'csvFileConfig' => [ 'cellDelimiter' => "\t", 'rowDelimiter' => "\n", 'enclosure' => '', ], ]); $exporter->export()->saveAs('/path/to/file.txt');