PHP-Xlswriter 替代php excel 提升性能
后端笔记 2020-09-17 09:44:59

仓库地址:https://github.com/viest/php-ext-xlswriter-doc/tree/master/zh-cn

Install

Unix

C/C++ Code复制内容到剪贴板
  1. pecl install xlswriter  

 

# 添加 extension = xlswriter.so 到 ini 配置

读取文件暂不支持 windows 系统;

扩展版本大于等于 1.2.7;

PECL 安装时将会提示是否开启读取功能,请键入 yes;

安装完成后,可以输入命令查看已安装的扩展

PHP Code复制内容到剪贴板
  1. php -m  

 

 

 

 

Windows

download dll

 

Benchmark

Test environment: Macbook Pro 13 inch, Intel Core i5, 16GB 2133MHz LPDDR3 Memory, 128GB SSD Storage.

Export

Two memory modes export 1 million rows of data (27 columns, data is string)

  • Normal mode: only 29S is needed, and the memory only needs 2083MB;
  • Fixed memory mode: only need 52S, memory only needs <1MB;
Import

1 million rows of data (1 columns, data is inter)

  • Full mode: Just 3S, the memory is only 558MB;
  • Cursor mode: Just 2.8S, memory is only <1MB;

 

查看文档 

 

PHP Code复制内容到剪贴板
  1. composer require viest/php-ext-xlswriter-ide-helper:dev-master  

 

 

宝塔面板安装php扩展,xlswriter

1、ssh进入,略过

2、下载包

C/C++ Code复制内容到剪贴板
  1. cd /www/server/php/[php版本]/bin  
  2. sudo wget https://github.com/viest/php-ext-xlswriter/archive/master.zip  
  3. sudo unzip master.zip  
  4. rm -f master.zip  
  5. cd php-ext-xlswriter-master/  

 

 

 

 


 

读取excel文件示例:

PHP Code复制内容到剪贴板
  1.     /** 
  2.      * 解析excel资源并入库解析结果(由C封装的php扩展,内存优化模式) 
  3.      * @param $attid 
  4.      * @param int $headerRow 
  5.      * @param int $dataStartRow 
  6.      * @return ExcelRead 
  7.      * @throws HttpException 
  8.      */  
  9.     protected function insertParsingRecordByC($attid$headerRow = 1, $dataStartRow = 1)  
  10.     {  
  11.         // 资源文件  
  12.         $attModel = Attachment::findOne(["id" => $attid]);  
  13.         if (!$attModel) {  
  14.             throw new HttpException(400, "上传记录不存在");  
  15.         }  
  16.         $filePath = Yii::$app->storage->getFullPath($attModel->path);  
  17.         if (!file_exists($filePath)) {  
  18.             throw new HttpException(400, "资源文件不存在");  
  19.         }  
  20.         // path是指文件目录  
  21.         $config = ['path' => Yii::getAlias("@storagePath") . "/upload"];  
  22.         $excel = new \Vtiful\Kernel\Excel($config);  
  23.         // 读取文件  
  24.         $data = $excel->openFile($attModel->path)  
  25.             ->openSheet()  
  26.             ->getSheetData();  
  27. //        // 打开文件,获取工作表数量  
  28. //        $sheetList = $excel->openFile('tutorial.xlsx')  
  29. //            ->sheetList();  
  30. //        foreach ($sheetList as $sheetName) {  
  31. //            echo 'Sheet Name:' . $sheetName . PHP_EOL;  
  32. //            // 通过工作表名称获取工作表数据  
  33. //            $sheetData = $excel  
  34. //                ->openSheet($sheetName)  
  35. //                ->getSheetData();  
  36. //            //var_dump($sheetData);  
  37. //        }  
  38.         $headerRow -= 1;  //从0开始  
  39.         $dataStartRow -= 1; // 从0开始,都会依次减掉一行  
  40.   
  41.         $allRow = count($data);           // 总行数  
  42.         foreach ($data[$headerRowas $k => $h) {  
  43.             $getValue = $data[$dataStartRow][$k]; //取第一行数据,看数据类型是有无值  
  44.             if ($getValue) {  
  45.                 // 从第一行数据行取,如果有值的话  
  46.                 // 1代表 字符型  2代表  数值型  
  47.                 $excelHeader[] = [  
  48.                     "index" => $k,  
  49.                     "dataType" => $getValue ? (is_numeric($getValue) ? 2 : 1) : "",  
  50.                     "dataTypeName" => $getValue ? (is_numeric($getValue) ? "数值型" : "字符型") : "",  
  51.                     "type" => $getValue ? (is_numeric($getValue) ? "integer" : "string") : "",  
  52.                     "size" => $getValue ? (is_numeric($getValue) ? "11" : "255") : "",  
  53.                     "dbType" => $getValue ? (is_numeric($getValue) ? "int(11)" : "varchar(255)") : "",  
  54.                     "defaultValue" => null,  
  55.                     "isPrimaryKey" => false,  
  56.                     "name" => $h,  
  57.                     "target" => $h//别名  
  58.                 ];  
  59.             } else {  
  60.                 $excelHeader[] = [  
  61.                     "index" => $k,  
  62.                     "dataType" => 0,  
  63.                     "dataTypeName" => "",  
  64.                     "type" => "",  
  65.                     "size" => "",  
  66.                     "dbType" => "",  
  67.                     "defaultValue" => null,  
  68.                     "isPrimaryKey" => false,  
  69.                     "name" => "",  
  70.                     "target" => ""//别名  
  71.                 ];  
  72.             }  
  73.         }  
  74.         // 暂只获取第一个工作表  
  75.         for ($currentRow = $dataStartRow$currentRow <= $allRow$currentRow++) {  
  76.             $excelDatas[] = $data[$currentRow];  
  77.         }  
  78.         $time = time();  
  79.         $params = [  
  80.             'user_id' => Yii::$app->user ? Yii::$app->user->id : 0,  
  81.             'attachment_id' => $attid,  
  82.             'excel_head' => Json::encode($excelHeader),  
  83.             'excel_data' => Json::encode($excelDatas),  
  84.             'status' => '0',  
  85.             'error' => '',  
  86.             'mark' => '',  
  87.             'created_at' => $time,  
  88.             'updated_at' => $time,  
  89.         ];  
  90.         $model = new self();  
  91.         $model->setAttributes($params);  
  92.         if ($model->save()) {  
  93.             return $model;  
  94.         } else {  
  95.             throw new HttpException(400, current($model->firstErrors));  
  96.         }  
  97.     }  

 

 

 

本文来自于:http://www.yoyo88.cn/note/backend/543.html

Powered by yoyo苏ICP备15045725号