yii2tech / csv-grid
Yii2扩展数据导出到CSV文件
Requires
- yiisoft/yii2: ~2.0.13
Requires (Dev)
- phpunit/phpunit: 4.8.27 || ^5.0 || ^6.0
README
为Yii2的CSV数据导出扩展
此扩展提供了将数据导出到CSV文件的能力。
有关许可证信息,请检查LICENSE文件。
安装
安装此扩展的首选方式是通过composer。
运行以下命令之一:
php composer.phar require --prefer-dist yii2tech/csv-grid
或者将以下内容添加到您的composer.json文件的require部分:
"yii2tech/csv-grid": "*"
(内容省略,与原文相同)
使用方法
此扩展提供了将数据导出到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');