dfware / csv-grid

Yii2扩展,将数据导出到CSV文件

资助包维护!
klimov-paul
Patreon

安装次数: 49

依赖关系: 0

建议者: 0

安全: 0

星标: 0

关注者: 0

分支: 20

开放问题: 0

类型:yii2-extension

1.0.0 2023-09-27 17:51 UTC

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');