yii2tech/spreadsheet

此包已被弃用且不再维护。未建议替代包。

用于导出到电子表格的Yii2扩展,例如Excel,LibreOffice等。

资助包维护!
klimov-paul
Patreon

安装次数: 420 195

依赖: 12

建议者: 0

安全: 0

星标: 77

关注者: 6

分支: 13

开放问题: 0

类型:yii2-extension

1.0.5 2019-09-12 15:07 UTC

This package is auto-updated.

Last update: 2022-01-10 10:42:45 UTC


README

12951949

Yii2的电子表格数据导出扩展


此扩展提供了将数据导出到电子表格(例如Excel,LibreOffice等)的能力。

有关许可信息,请参阅LICENSE文件。

Latest Stable Version Total Downloads Build Status

安装

安装此扩展的最佳方式是通过composer

运行以下命令:

php composer.phar require --prefer-dist yii2tech/spreadsheet

"yii2tech/spreadsheet": "*"

将以下内容添加到您的composer.json文件的require部分。

用法

此扩展提供了将数据导出到电子表格的能力,例如Excel,LibreOffice等。它由phpoffice/phpspreadsheet库提供支持。导出是通过\yii2tech\spreadsheet\Spreadsheet实例完成的,它提供了类似于\yii\grid\GridView小部件的界面。

示例

<?php

use yii2tech\spreadsheet\Spreadsheet;
use yii\data\ArrayDataProvider;

$exporter = new Spreadsheet([
    'dataProvider' => new ArrayDataProvider([
        'allModels' => [
            [
                'name' => 'some name',
                'price' => '9879',
            ],
            [
                'name' => 'name 2',
                'price' => '79',
            ],
        ],
    ]),
    'columns' => [
        [
            'attribute' => 'name',
            'contentOptions' => [
                'alignment' => [
                    'horizontal' => 'center',
                    'vertical' => 'center',
                ],
            ],
        ],
        [
            'attribute' => 'price',
        ],
    ],
]);
$exporter->save('/path/to/file.xls');

请参阅\yii2tech\spreadsheet\Column类以获取有关列属性和配置规范的详细信息。

在运行Web应用程序时,您可以使用\yii2tech\spreadsheet\Spreadsheet::send()方法通过下载对话框将结果文件发送到浏览器。

<?php

use yii2tech\spreadsheet\Spreadsheet;
use yii\data\ActiveDataProvider;
use yii\web\Controller;

class ItemController extends Controller
{
    public function actionExport()
    {
        $exporter = new Spreadsheet([
            'dataProvider' => new ActiveDataProvider([
                'query' => Item::find(),
            ]),
        ]);
        return $exporter->send('items.xls');
    }
}

多工作表文件

您可以为多个工作表(选项卡)创建一个输出文件。例如:您可能想导出有关办公室使用的设备的资料,将显示器、鼠标、键盘等分开列出,但保留在同一文件中。为此,您需要在创建最终文件之前手动调用带有不同配置的\yii2tech\spreadsheet\Spreadsheet::render()方法。例如

<?php

use yii2tech\spreadsheet\Spreadsheet;
use yii\data\ActiveDataProvider;
use app\models\Equipment;

$exporter = (new Spreadsheet([
    'title' => 'Monitors',
    'dataProvider' => new ActiveDataProvider([
        'query' => Equipment::find()->andWhere(['group' => 'monitor']),
    ]),
    'columns' => [
        [
            'attribute' => 'name',
        ],
        [
            'attribute' => 'price',
        ],
    ],
]))->render(); // call `render()` to create a single worksheet

$exporter->configure([ // update spreadsheet configuration
    'title' => 'Mouses',
    'dataProvider' => new ActiveDataProvider([
        'query' => Equipment::find()->andWhere(['group' => 'mouse']),
    ]),
])->render(); // call `render()` to create a single worksheet

$exporter->configure([ // update spreadsheet configuration
    'title' => 'Keyboards',
    'dataProvider' => new ActiveDataProvider([
        'query' => Equipment::find()->andWhere(['group' => 'keyboard']),
    ]),
])->render(); // call `render()` to create a single worksheet

$exporter->save('/path/to/file.xls');

结果您将得到一个包含3个工作表(选项卡)的单个*.xls文件:'Monitors'、'Mouses'和'Keyboards'。

使用\yii2tech\spreadsheet\Spreadsheet::configure(),您可以重置任何电子表格参数,包括columns。因此,您可以组合多个完全不同的工作表到一个文件中。

大数据处理

\yii2tech\spreadsheet\Spreadsheet允许导出\yii\data\DataProviderInterface\yii\db\QueryInterface实例。导出通过批量操作完成,这允许处理大量数据而不会出现内存溢出。

在使用\yii\data\DataProviderInterface的情况下,数据将通过分页机制分割成批次。因此,您应该设置分页,并设置页面大小以控制批次大小

<?php

use yii2tech\spreadsheet\Spreadsheet;
use yii\data\ActiveDataProvider;

$exporter = new Spreadsheet([
    'dataProvider' => new ActiveDataProvider([
        'query' => Item::find(),
        'pagination' => [
            'pageSize' => 100, // export batch size
        ],
    ]),
]);
$exporter->save('/path/to/file.xls');

注意:如果您在数据提供者中禁用分页,则不会执行批量处理。

\yii\db\QueryInterface 的使用情况下,Spreadsheet 将尝试使用 batch() 方法,如果它在查询类中存在(例如在 \yii\db\Query\yii\db\ActiveQuery 的使用情况下)。如果 batch() 方法不可用,则将自动创建一个 yii\data\ActiveDataProvider 实例来包围给定的查询。您可以通过 \yii2tech\spreadsheet\Spreadsheet::$batchSize 控制批量大小。

<?php

use yii2tech\spreadsheet\Spreadsheet;
use yii\data\ActiveDataProvider;

$exporter = new Spreadsheet([
    'query' => Item::find(),
    'batchSize' => 200, // export batch size
]);
$exporter->save('/path/to/file.xls');

注意:尽管批量数据处理减少了生成电子表格文件所需的资源量,但您的程序仍然可能在处理大量数据时遇到 PHP 内存限制错误。这是因为创建的文档复杂度很大,在整个过程中都存储在内存中。如果您需要导出真正的大量数据集,请考虑通过 yii2tech/csv-grid 扩展使用简单的 CSV 数据格式来导出。

复杂的表头

您可以将工作表表头中的某些列组合成组。例如,您可能有 2 个不同的数据列:“计划收入”和“实际收入”。在这种情况下,您可能希望将它们显示为单个列“收入”,分成 2 个子列:“计划”和“实际”。这可以通过使用 \yii2tech\spreadsheet\Spreadsheet::$headerColumnUnions 实现。每个条目应指定 'offset',它确定要跳过的列数,以及 'length',它确定要合并的列数。联合的其他选项与常规列相同。例如

<?php

use yii2tech\spreadsheet\Spreadsheet;
use yii\data\ArrayDataProvider;

$exporter = new Spreadsheet([
    'dataProvider' => new ArrayDataProvider([
        'allModels' => [
            [
                'column1' => '1.1',
                'column2' => '1.2',
                'column3' => '1.3',
                'column4' => '1.4',
                'column5' => '1.5',
                'column6' => '1.6',
                'column7' => '1.7',
            ],
            [
                'column1' => '2.1',
                'column2' => '2.2',
                'column3' => '2.3',
                'column4' => '2.4',
                'column5' => '2.5',
                'column6' => '2.6',
                'column7' => '2.7',
            ],
        ],
    ]),
    'headerColumnUnions' => [
        [
            'header' => 'Skip 1 column and group 2 next',
            'offset' => 1,
            'length' => 2,
        ],
        [
            'header' => 'Skip 2 columns and group 2 next',
            'offset' => 2,
            'length' => 2,
        ],
    ],
]);
$exporter->save('/path/to/file.xls');

注意:仅支持单级表头列联合。更复杂的情况需要您自行处理。

自定义单元格渲染

在调用 save()send() 方法之前,您可以对生成的电子表格进行编辑,对其进行一些最终的调整。有几种方法可以简化此过程

  • \yii2tech\spreadsheet\Spreadsheet::renderCell() - 使用给定的内容和样式渲染指定的单元格。
  • \yii2tech\spreadsheet\Spreadsheet::applyCellStyle() - 将指定的样式应用于单元格。
  • \yii2tech\spreadsheet\Spreadsheet::mergeCells() - 将单元格范围合并为一个单元格。

您可以在使用 \yii2tech\spreadsheet\Spreadsheet::render() 组装文档后使用这些方法来覆盖或添加一些内容。例如

<?php

use yii2tech\spreadsheet\Spreadsheet;
use yii2tech\spreadsheet\SerialColumn;
use yii\data\ArrayDataProvider;

$exporter = new Spreadsheet([
    'dataProvider' => new ArrayDataProvider([
        'allModels' => [
            [
                'id' => 1,
                'name' => 'first',
            ],
            [
                'id' => 2,
                'name' => 'second',
            ],
        ],
    ]),
    'columns' => [
        [
            'class' => SerialColumn::class,
        ],
        [
            'attribute' => 'id',
        ],
        [
            'attribute' => 'name',
        ],
    ],
])->render(); // render the document

// override serial column header :
$exporter->renderCell('A1', 'Overridden serial column header');

// add custom footer :
$exporter->renderCell('A4', 'Custom A4', [
    'font' => [
        'color' => [
            'rgb' => '#FF0000',
        ],
    ],
]);

// merge footer cells :
$exporter->mergeCells('A4:B4');

$exporter->save('/path/to/file.xls');

提示:您可以使用 \yii2tech\spreadsheet\Spreadsheet::$rowIndex 获取紧接最后一个渲染的行的行号。