1. 程式人生 > 其它 >PHP_XLSXWriter替換PHPExcel,PhpSpreadsheet 他們之間的區別與效能

PHP_XLSXWriter替換PHPExcel,PhpSpreadsheet 他們之間的區別與效能

技術標籤:php

PHP_XLSXWriter替換PHPExcel,PhpSpreadsheet 他們之間的區別與效能

PHPExcel 是一個處理Excel,CVS檔案的開源框架,它基於微軟的OpenXML標準和PHP語言。可以使用它來讀取、寫入不同格式的電子表格,這也是PHP至今最通用的Excel處理工具,但是它有一個非常致命的缺點: 特別佔記憶體,對大批量的表格資料幾乎會讓人累覺不愛,處理速度非常慢,但是它功能非常豐富,API非常多,所以在匯出複雜格式的Excel表格時,你往往不得不使用它,真是讓人又愛又恨。
不幸的是,PHPExcel官方已不再維護了這個專案了,官方團隊在github上又起了一個新專案,叫PhpSpreadsheet,新專案使用了大量的php新特性,比如名稱空間,PSR標準,效能也比PHPExcel高了不少

相比於PHPExcel和PhpSpreadsheet,PHP_XLSXWriter是一個小而強悍的Excel讀寫外掛,它並沒有PHPExcel功能豐富,很多高階操作比如凍結表頭,並不具備,但是它匯出速度非常快,非常適合於資料量特別大,報表格式不是很複雜的匯出需求

 public function phpByExcel($data){
      $t1 = microtime(true);
      $phpExcel = new \PHPExcel();
      $phpExcel->setActiveSheetIndex(0);
      $phpExcel->getActiveSheet()->setTitle('使用者資訊');
      $phpExcel->getActiveSheet()->setCellValue("A1", "id");
      $phpExcel->getActiveSheet()->setCellValue("C1", "名字");
      $phpExcel->getActiveSheet()->setCellValue("D1", "電話");
      $phpExcel->getActiveSheet()->setCellValue("E1", "郵箱");
      $phpExcel->getActiveSheet()->setCellValue("F1", "城市");
      $i = 2;
      foreach ($data as $k => $v){
         $phpExcel->getActiveSheet()->setCellValue("A".$i, $v['uid']);
         $phpExcel->getActiveSheet()->setCellValue("C".$i, $v['truename']);
         $phpExcel->getActiveSheet()->setCellValue("D".$i, $v['mobile']);
         $phpExcel->getActiveSheet()->setCellValue("E".$i, $v['email']);
         $phpExcel->getActiveSheet()->setCellValue("F".$i, $v['city']);
         $i++;
      }
      $fileext = '.xlsx';
      $objWriter = \PHPExcel_IOFactory::createWriter($phpExcel, 'Excel2007');
      $t2 = microtime(true);
      $filename = 'phpexcel耗時:'.($t2 - $t1);
//    dump($data);
      // 檔案儲存路徑
      $path = preg_replace('(/+)', '/', storage_path('/tempdoc'));
      if (!is_dir($path)) {
         @mkdir($path, 0755, true);
      }
      $pathToFile = $path . '/'  . date('YmdHis') . $filename . $fileext;
      $objWriter->save($pathToFile);
      if (file_exists($pathToFile)) {
         $headers = [
            'Content-Type' => 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
            'Content-Length' => filesize($pathToFile),
            'Content-Disposition' => 'attachment; filename="' . $filename . '"'
         ];
         return response()->download($pathToFile, $filename, $headers);
      } else {
         return response_json(0, [], '匯出錯誤,請重新整理頁面後重試');
      }
   }
   public function phpByXls($data){
      $title = [
         'id',
         '名字',
         '電話',
         '郵箱',
         '城市'
      ];
      $t1 = microtime(true);
      $writer = new \XLSXWriter();
      $sheet1 = 'sheet1';
      //設定標題頭,指定樣式
      $styles1 = array('font' => '宋體', 'font-size' => 10, 'font-style' => 'bold', 'fill' => '#8DEEEE',
         'halign' => 'center', 'border' => 'left,right,top,bottom');
      $writer->writeSheetRow($sheet1, $title, $styles1);
      $styles2 = ['height' => 25];//設定單元格的高度
      foreach ($data as $row) {
         $writer->writeSheetRow($sheet1, $row,$styles2);
      }
      $t2 = microtime(true);
      $filename = 'phpxls耗時:'.($t2 - $t1);
      $fileext = '.xlsx';
      // 檔案儲存路徑
      $path = preg_replace('(/+)', '/', storage_path('/tempdoc'));
      if (!is_dir($path)) {
         @mkdir($path, 0755, true);
      }
      $pathToFile = $path . '/'  . date('YmdHis') . $filename . $fileext;
      $writer->writeToFile($pathToFile);exit();
   }

匯出10000條資料
在這裡插入圖片描述

匯出30000條資料
在這裡插入圖片描述

匯出50000條資料
在這裡插入圖片描述

匯出100000條資料
在這裡插入圖片描述

經過測試xlswriter時間記憶體爽壓制PhpSpreadsheet,且匯出資料越大對比越明顯
效能比較php_xlswrite > phpspreadsheet > phpexcel