myzero1 / yii2-gridview-export

导出模块,将 gridview 数据导出到 Excel。使用 gridview 的数据提供者和列。

安装: 798

依赖项: 0

建议者: 0

安全性: 0

星标: 0

关注者: 1

分支: 0

开放问题: 0

类型:yii2-module

2.3.2 2023-10-23 09:35 UTC

README

导出模块,将 gridview 数据导出到 Excel。使用 gridview 的数据提供者和列。

显示时间

安装

安装此模块的首选方式是通过 composer

运行以下命令之一:

php composer.phar require myzero1/yii2-gridview-export:*

或者

"myzero1/yii2-gridview-export": "*"

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

设置

扩展安装后,只需按照以下方式修改您的应用程序配置

在 main.php 中

return [
    ......
    'bootstrap' => [
        ......
        // function(){\myzero1\gdexport\helpers\Helper::rewriteClass2GC();}, // If you want to set myzero1_gdexport_streamMode to rewrite_class, you need to add this line.
        ......
    ],
    'modules' => [
        ......
        // 'gdexport' => ['class' => 'myzero1\gdexport\Module',], // If using /gdexport/export/export as the export address, you need to add this line.
        ......
    ],
    ......
];

在 params.php 中

return [
    ......
    // 'myzero1_gdexport_streamMode' => 'rewrite_class', //gc,rewrite_class,curl,default is gc,to solve the memory leak of yii2 AR recorder 
    ......
];

用法

在视图中使用导出小部件

您可以在视图中任何位置使用它,如下所示

<?= \myzero1\gdexport\helpers\Helper::createExportForm($dataProvider, $columns, $name='导出文件名', $buttonOpts = ['class' => 'btn btn-info'], $url=['/gdexport/export/export','id' => 1], $writerType='Xls', $buttonLable='导出', $timeout = 600);?>

// 推荐使用下面这种方式,不会内存溢出
// <?= \myzero1\gdexport\helpers\Helper::createExportForm($dataProvider, $columns, $name='导出文件名', $buttonOpts = ['class' => 'btn btn-info'], $url=['/gdexport/export/big-export','id' => 1], $writerType='Xls', $buttonLable='导出大量数据', $timeout = 600);?>

// 导出文件zip
// <?= \myzero1\gdexport\helpers\Helper::createExportForm($dataProvider, $columns, $name='导出文件名', $buttonOpts = ['class' => 'btn btn-info'], $url=['/gdexport/export/export-file','id' => 1], $writerType='Xls', $buttonLable='导出大量数据', $timeout = 600);?>

// 导出文件zip并加密
// <?= \myzero1\gdexport\helpers\Helper::createExportForm($dataProvider, $columns, $name='导出文件名', $buttonOpts = ['class' => 'btn btn-info'], $url=['/gdexport/export/export-file-pw','id' => 1], $writerType='Xls', $buttonLable='导出大量数据', $timeout = 600);?>

// 用数据流导出
// <?= \myzero1\gdexport\helpers\Helper::createExportForm($dataProvider, $columns, $name='导出文件名', $buttonOpts = ['class' => 'btn btn-info'], $url=['/gdexport/export/export-stream','id' => 1], $writerType='Xls', $buttonLable='导出大量数据', $timeout = 600);?>

// 用数据流导出,添加确认框
// <?= \myzero1\gdexport\helpers\Helper::createExportForm($dataProvider, $columns, $name='导出文件名', $buttonOpts = ['class' => 'btn btn-info'], $url=['/gdexport/export/export-stream','id' => 1], $writerType='Xls', $buttonLable='导出大量数据', $timeout = 600, $confirmMsg = "请问你确认导出数据吗?");?>

使用自定义路由器

在 ExportController.php 中使用自定义路由器,如下所示

<?php
//......
/**
 * ExportController.
 */
class ExportController extends Controller
{
    //......
    /**
     * Realtime exporter
     * @return mixed
     */
    public function actionRealtime()
    {
        $post = \Yii::$app->request->post();

        return \myzero1\gdexport\helpers\Helper::exportSend($post['export_columns'], $exportQuery=$post['export_query'], $exportSql=$post['export_sql'], $exportName=$post['export_name'], $writerType = $post['export_type'], $post['export_timeout']);

        // 推荐使用下面这种方式,不会内存溢出
        // return \myzero1\gdexport\helpers\Helper::exportSend($post['export_columns'], $exportQuery=$post['export_query'], $exportSql=$post['export_sql'], $exportName=$post['export_name'], $writerType = $post['export_type'], $post['export_timeout']);
    }

    //......
}
?>

在视图中使用自定义路由器,如下所示

<?= \myzero1\gdexport\helpers\Helper::createExportForm($dataProvider, $columns, $name='导出文件名', $buttonOpts = ['class' => 'btn btn-info'], ['/export/realtime'], $writerType='Xls', $buttonLable='导出', $timeout = 600);?>


$provider = \myzero1\gdexport\helpers\Helper::remoteArrayDataProvider(
    $url, 
    $params,
    $timeout=600,
    $itemsKeys=['data','items'],
    $totalKeys=['data','total'],
    $pageSizeKeys=['data','page_size'],
    $dataProviderKey='',
    $extendDataKeys=['data','total_amount']
);

重建 2.0.0

基于 https://packagist.org.cn/packages/yii2tech/csv-grid 进行加工完善

myzero1_gdexport_streamMode 各个种参数解决yii2 AR recorder内存泄漏的优缺点

*****注意

1   php 导出的时候一定要设置  ini_set('memory_limit',-1); 否则很容易就出现内存不足,而且 gc_collect_cycles() 回收不起作用。

2   docker 容器中运行 php-fpm 一定要设置资源现在特别是内存的限制,否则会把资源耗尽

3   docker-composer 中配置资源限制,由于有资源限制, 且没有使用swarm, 所以要加上--compatibility参数, 否则报错或者限制不生效    docker-compose --compatibility up -d ,实例如下
version: '3.7'
services:
  openldap:
    image: 10.10.xxx.54/public/openldap:1.3.0
    container_name: openldap
    environment:
      - N9E_NID=22
    ports:
      - "389:389"
      - "636:636"
    deploy:
      resources:
         limits:
            cpus: "2.00"
            memory: 5G
         reservations:
            memory: 200M
    volumes:
      - ./ldap:/var/lib/ldap
      - ./slapd.d:/etc/ldap/slapd.d
    restart: always

4   https://docs.docker.net.cn/compose/compose-file/deploy/#resources       https://www.codetd.com/article/14276922

5   从2.2.3开始,只要把docker的内存限制一下,用默认配置,基本上就可以了满足导出需求。


Composer 中 ~ 和 ^ 的含义

Laravel Framework 6.20.27
6 表示主版本号
20 表示次版本号
27 表示修订号

^和~的出现是为了对扩展包进行版本锁定的。它们的区别如下:
^表示锁定主版本号。
~表示锁定次版本号

我们假定这个扩展的主版本号6,中间的次版本号最大是99,末尾的修订号是999。
^6.20 表示版本的范围是6.20.0到6.99.999
~6.20 表示版本的范围是6.20.0到6.20.999

发布日志

2023/05/10 14:50        2.1.0   add curl to exportStream 
2023/05/13 17:17        2.2.0   add rewrite_class to export