首页 > 编程语言 >fastadmin-PHP-导出少量数据PhpOffice以及百万级别数据csv压缩

fastadmin-PHP-导出少量数据PhpOffice以及百万级别数据csv压缩

时间:2024-11-19 11:55:55浏览次数:1  
标签:sheet fastadmin zip list PhpOffice limit file csv where

在进行数据导出的时候,少量的数据可以使用phpexcel,但大量的数据用phpexcel就很消耗资源了。

在使用fastadmin做数据导出的时候,相关的代码请参考:https://blog.csdn.net/bingyu709/article/details/141949034

我自己这边因为数据量会很大,所以代码层做了一个数量的划分,少于50000走phpexcel导出,大于50000走csv,并且打包zip。

并且我的逻辑是导出成功后把文件防止项目指定目录下,并没有做一个直接下来,如果想直接从浏览器下载请自己网上找其他代码参考,我所参考的帖子是直接下载的,大家可以试试看。

public function export() {
        if ($this->request->isPost()) {



            $filter             = $this->request->request("filter", '');
            $filter_arr         = (array)json_decode($filter, true);

            $ids                = $this->request->request('ids','');

            $scene_id                   = CService::MANAGE_ALL_CUSTOMER;
            if (!empty($filter_arr) && isset($filter_arr['scene_id']))  {
                $scene_id       = intval($filter_arr['scene_id']);
            }

            $scene_where        = $this->getFilterAllSceneWhere($scene_id);

            list($where, $sort, $order, $offset, $limit) = $this->buildAllParams();

            if (!empty($ids) && $ids != '' && $ids != 'all') {
                $ids_arr        = explode(',',$ids);
                $where['id']    = ['in', $ids_arr];
            }

            $where              = array_merge($scene_where,$where);


            $count              = CModel::model()->where($where)->count();


            if ($count > 0) {

                if ($count > 50000) {

                    set_time_limit(0);
                    ini_set('memory_limit', '128M');

                    $xlsTitle = [   '字段1', '字段2', '字段3'
                                ];

                    // buffer计数器
                    $cnt = 0;



                    $fileName           = '客户导出'.date('YmdHis').rand(10000000,88888888);//文件名称
                    $pro_path           = ExportService::EXPORT_CUSTOMER_FILE_PATH; // 项目目录
                    $fileName           = $pro_path . $fileName;

                    $zip_file_name      = $fileName.'.zip';

                    // 输出Excel文件头,可把user.csv换成你要的文件名
                    header('Content-Type: application/vnd.ms-excel;charset=utf-8');
                    header('Content-Disposition: attachment;filename="' . $zip_file_name . '"');
                    header('Cache-Control: max-age=0');

                    $fileNameArr = [];

                    $every_step_limit       = 10000;
                    $loop_number_count      = intval(ceil($count / $every_step_limit));


                    for ($i = 0; $i < $loop_number_count; $i ++) {


                        $fp = fopen($fileName . '_' . ($i+1) . '.csv', 'w'); //生成临时文件
                        fwrite($fp, chr(0xEF).chr(0xBB).chr(0xBF));/*防止乱码  */

                        // chmod('attack_ip_info_' . $i . '.csv',777);//修改可执行权限
                        $fileNameArr[] = $fileName . '_' . ($i+1) . '.csv'; // 将数据通过fputcsv写到文件句柄
                        fputcsv($fp, $xlsTitle);
                        /******************** 调整位置开始 ***************************/

                        $limit          = $i * $every_step_limit;
                        $limit_list     = ExportService::service()->getExportList($where, $limit, $every_step_limit);
                        $list           = ExportService::service()->formatExportData($limit_list, $this->auth_global_search_organise_id);
                        if (!empty($list)) {
                            foreach ($list as $item) {
                                $cnt++;
                                if ($limit == $cnt) {
                                    // 刷新一下输出buffer,防止由于数据过多造成问题
                                    ob_flush();
                                    flush();
                                    $cnt = 0;
                                }
                                fputcsv($fp, $item);
                            }
                            unset($list);
                        }
                        fclose($fp); // 每生成一个文件关闭
                    }



                    try {
                        // 进行多个文件压缩
                        $zip = new \ZipArchive();

                        $zip->open($zip_file_name, $zip::CREATE); // 打开压缩包
                        foreach ($fileNameArr as $file) {
                            $zip->addFile($file, basename($file)); // 向压缩包中添加文件
                        }
                        $zip->close();  // 关闭压缩包
                        foreach ($fileNameArr as $file) {
                            unlink($file); // 删除csv临时文件
                        }

                        if (file_exists($zip_file_name)) {
                           
                            $this->success('操作成功');
                        } else {
                            $this->error('操作失败');
                        }
                    } catch (ValidateException|PDOException|Exception $e) {
                        $this->error('操作失败');
                    }
                } else {
                    set_time_limit(0);

                    $spreadsheet    = new Spreadsheet();
                    $sheet          = $spreadsheet->getActiveSheet();

                    $sheet->getStyle('A:S')->getAlignment()
                        ->setVertical(\PhpOffice\PhpSpreadsheet\Style\Alignment::VERTICAL_CENTER) //设置垂直居中
                        ->setHorizontal(\PhpOffice\PhpSpreadsheet\Style\Alignment::HORIZONTAL_CENTER) //设置水平居中
                        ->setWrapText(true); //设置自动换行

                    $titleStyleArray     = [
                        'font'      => [
                            'name'  => 'SimHei', // 中文字体,"黑体"的类似字体
                            'bold'  => true,
                            'size'  => 12,
                        ]
                    ];
                    $sheet->getStyle('A1:Z1')->applyFromArray($titleStyleArray);

                    $lineStyleArray     = [
                        'font'      => [
                            'name'  => 'SimHei', // 中文字体,"黑体"的类似字体
                        ]
                    ];

                    //设置表头
                    $sheet->setCellValue('A1', '字段1');
                    $sheet->setCellValue('B1', '字段2');
                    $sheet->setCellValue('C1', '字段3');
            ....... $sheet->getColumnDimension('A')->setWidth(15); $sheet->getColumnDimension('B')->setWidth(15); $sheet->getColumnDimension('C')->setWidth(15);
            .......//$sheet->getDefaultRowDimension()->setRowHeight(60); //设置行高 $res_list = ExportService::service()->getExportCustomerList($where); $list = ExportService::service()->formatExportCustomerData($res_list, $this->auth_global_search_organise_id); if (!empty($list)) { //输出表格 foreach($list as $keys => $value) { $keys = $keys + 2; $sheet->setCellValue('A'.$keys,$value['field1'] ?? '')->getStyle('A')->applyFromArray($lineStyleArray); $sheet->setCellValue('B'.$keys,$value['field2'] ?? '')->getStyle('B')->applyFromArray($lineStyleArray); $sheet->setCellValue('C'.$keys,$value['field3'] ?? '')->getStyle('C')->applyFromArray($lineStyleArray);
                 .........
} } // 保存Excel文件到服务器的指定路径 $pro_path = ExportService::EXPORT_CUSTOMER_FILE_PATH; // 项目目录 $file_name = '导出'.date('YmdHis').rand(10000000,88888888).'.xlsx'; $file_path = $pro_path . $file_name; // if (!file_exists($file_path)) { // fopen($file_path, 'w'); // } try { $writer = \PhpOffice\PhpSpreadsheet\IOFactory::createWriter($spreadsheet, 'Xlsx'); $writer->save($file_path); if (file_exists($file_path)) { $this->success('操作成功'); } else { $this->error('操作失败'); } } catch (ValidateException|PDOException|Exception $e) { $this->error('操作失败'); } } } } }

 

标签:sheet,fastadmin,zip,list,PhpOffice,limit,file,csv,where
From: https://www.cnblogs.com/wt645631686/p/18554584

相关文章

  • 【Doris 系列】actual column number in csv file is less than schema column number
    问题FlinkSQL写Doris表,报错actualcolumnnumberincsvfileislessthanschemacolumnnumber.现象FLINKSQL定义的Schema明明有m列,结果写入的时候报错实际的列有m+1列。CREATETABLEDORIS_SINK(IDSTRING,NAMESTRING,BANKSTRING,AGEINT)wi......
  • python从旧库中导出csv并导入新库
    在线的游戏,迁移数据库,数据比较大,游戏不能停很久,先使用sqldump导入不变的表,再使用python导出可变的表到csv文件,导入到新库.找出各表中csv中最大的id,然后停服, 然后根据各表的id,从id位置开始再导出新增数据,再导入到新库.export.py"""导出msql表格"""impo......
  • csv生成工具
    由于经常要拉取数据库记录生成csv,所以封装了两个工具。可以根据需求对这两个工具进行相应的改写。一种是接受两个参数,一个是csv生成的路径,这个路径分windows和linux,windows系统要注意文件分隔符为\\而linux文件分隔符为//,比如windows下为E:\\csv\\而Linux下为//www//zip//......
  • fastadmin 数据记录行上添加操作按钮并设置权限
    1.一键curd以及配置菜单编写控制器方法-业务逻辑再次一键生成菜单-生成刚刚写审核通过方法的控制器。 2.自定义控制器中方法。3.查看角色组的权限,并授予该角色权限。4.前端修改index页面,因为需要权限所以需要加上一句话data-operate-log="{:$auth->check('......
  • laravel PhpOffice 读取表格数据
    /***更新安通船期*Description*AuthorAllen*Date2024-11-11*@paramRequest$request[description]*@return[type][description]*/publicfunctionupdateAntongShipDate(Request$request){......
  • 【Python学习】Python csv 数据处理实例——bilibili 视频播放量跟踪
    1.理论知识准备在Python中,处理CSV(Comma-SeparatedValues)文件非常常见,因为CSV是一种广泛使用的数据交换格式。Python标准库中的csv模块提供了读取和写入CSV文件的功能。以下是一些基本的使用方法。读取CSV文件首先,确保你的CSV文件是有效的,并且你知道其中数......
  • SQLSever将csv文件中的数据导入数据库中的某个表中的操作以及可能会出现的报错
    注:导入数据前,检查一下数据类型是否与数据库中的数据类型相匹配第一种方法:首先打开SQLSever数据库,右击你的数据库找到任务后点开导入平面文件,如图 在弹开的窗口中点击下一步 接下来 填写完后点击下一步,跳转到预览数据的页面,会显示出表中的前20条数据,在检查没有错误后接......
  • [经典] 前端js将文件流导出为csv/excel文件
    前端将文件流导出为csv/excel文件有两种方式:1.后端直接返回文件连接:前端正常请求,后端返回一个静态文件链接,直接使用:window.location.href=url简单,但是缺点是耗资源,后端需要把数据转化为excel存起来,并且直接暴露连接。2.后台返回二进制流:前台请求后台接口拿到二进制流转......
  • 虚假新闻检测:CSV格式数据集的预处理与模型选择
    ✅作者简介:2022年博客新星第八。热爱国学的Java后端开发者,修心和技术同步精进。......
  • 导入csv文件到milvus
    1.创建表milvus_cliconnect-urihttp://192.168.1.134:19530-troot:Milvususedatabase-ddb_testcreatecollection-ctb_test02-fid:INT64:primary_field-fvector:FLOAT_VECTOR:128-fa1:INT64:a1-fb1:VARCHAR:32-pid-A-d'car_collection' 2.准备数据......