yii2tech/csv-grid

此包已废弃,不再维护。未建议替代包。

Yii2扩展数据导出到CSV文件

资助包维护!
klimov-paul
Patreon

安装次数: 862 647

依赖: 4

建议者: 0

安全: 0

星标: 85

关注者: 8

分支: 14

开放问题: 0

类型:yii2-extension

1.0.5 2020-03-04 11:17 UTC

This package is auto-updated.

Last update: 2022-02-15 10:29:07 UTC


README

12951949

为Yii2的CSV数据导出扩展


此扩展提供了将数据导出到CSV文件的能力。

有关许可证信息,请检查LICENSE文件。

Latest Stable Version Total Downloads Build Status

安装

安装此扩展的首选方式是通过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');