[CodeIgniter4]phpspreadsheet的使用
使用一個開源庫第一步肯定是要看官網文檔咯,看完就要爬坑,爬坑就要寫個博客壓壓驚
https://phpspreadsheet.readthedocs.io/en/latest/
環境依賴
- PHP >= 5.6
- PHP_ZIP拓展
- PHP_XML拓展
- PHP_GD拓展
第一步安裝
composer require phpoffice/phpspreadsheet
可能會有安裝失敗問題,請修改php.ini文件,lnmp的php.ini的位置:/usr/local/php/etc/php.ini
disable_functions修改成如下即可,如果還不行就繼續根據錯誤提示刪除下面限制的函數。
disable_functions = passthru,exec,system,chroot,chgrp,chown,shell_exec,popen,ini_alter,ini_restore,dl,openlog,syslog,readlink,symlink,popepassthru,stream_socket_server
第二步使用
官方示例
<?php require 'vendor/autoload.php'; use PhpOffice\PhpSpreadsheet\Spreadsheet; use PhpOffice\PhpSpreadsheet\Writer\Xlsx; $spreadsheet = new Spreadsheet(); $sheet = $spreadsheet->getActiveSheet(); $sheet->setCellValue('A1', 'Hello World !'); $writer = new Xlsx($spreadsheet); $writer->save('hello world.xlsx');
CI4使用示例
此控制器位置\app\Controllers\Test\Index.php
輸出文件到網站根目錄,即public里面
<?php namespace App\Controllers\Test; // 采用命名空間的方式調用這個功能 use App\Controllers\BaseController; use PhpOffice\PhpSpreadsheet\Spreadsheet; use PhpOffice\PhpSpreadsheet\Writer\Xlsx; class Index extends BaseController { public function __construct() { } public function index() { $spreadsheet = new Spreadsheet(); $sheet = $spreadsheet->getActiveSheet(); $sheet->setCellValue('A1', 'Hello World !'); //輸出文件到網站根目錄,也就是public里面 $writer = new Xlsx($spreadsheet); $writer->save('hello world.xlsx'); }
直接輸出下載
<?php namespace App\Controllers\Test; use App\Controllers\BaseController; use PhpOffice\PhpSpreadsheet\Spreadsheet; use PhpOffice\PhpSpreadsheet\Writer\Xlsx; class Index extends BaseController { public function __construct() { } public function index() { $spreadsheet = new Spreadsheet(); $sheet = $spreadsheet->getActiveSheet(); $sheet->setCellValue('A1', 'Hello World !'); header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');//告訴瀏覽器輸出07Excel文件 //header('Content-Type:application/vnd.ms-excel');//告訴瀏覽器將要輸出Excel03版本文件 header('Content-Disposition: attachment;filename="01simple.xlsx"');//告訴瀏覽器輸出瀏覽器名稱 header('Cache-Control: max-age=0');//禁止緩存 $writer = new Xlsx($spreadsheet); $writer->save('php://output'); } }
釋放內存,為了防止內存泄露,進行手動清理
//釋放內存,為了防止內存泄露,進行手動清理 $spreadsheet->disconnectWorksheets(); unset($spreadsheet);
第三步文件讀取
創建對象
完成了上面的輕松小任務,現在開始創建對象。
# 待讀取的excel文件,全路徑,如果不是cli模式,那就是網站根目錄為"\",ci4默認位置為public文件夾里面 $filename = 'test.xlsx'; # 根據文件名自動創建 適用於不知道文件后綴時xls還是xlsx的情況 $spreadsheet = \PhpOffice\PhpSpreadsheet\IOFactory::load($filename); # 或者如果確定文件后綴,直接創建,性能會略優於上面方法 $reader = \PhpOffice\PhpSpreadsheet\IOFactory::createReader("Xlsx"); # $reader = \PhpOffice\PhpSpreadsheet\IOFactory::createReader("Xls"); $spreadsheet = $reader->load($filename); # 甚至可以直接指定reader實現創建 性能又會優於上面一丟丟 $reader = new \PhpOffice\PhpSpreadsheet\Reader\Xlsx(); # 可以額外設定只讀模式,上面也試用,讓工具只讀取數據,不處理樣式,性能會更好 $reader->setReadDataOnly(true); $spreadsheet = $reader->load($filename);
獲取Worksheet
表格對象,即當前工作表格
# 獲取當前活動的sheet $sheet = $spreadsheet->getActiveSheet(); # 或者直接指定序號獲得第一個sheet $sheet = $spreadsheet->getSheet(0);
開始讀取sheet中的單元格數據
# 讀取excel中A1數據,即第一行第一列,返回“姓名” $sheet->getCell('A1')->getValue(); # B1 返回“性別” $sheet->getCell('B1')->getValue(); # 獲取當前總行數 $rows = $sheet->getHighestRow(); $users = []; # 一般excel中第一行為標題,所以實際數據從第二行開始 循環讀取 for($i = 2; $i <= $rows; $i++) { $temp = []; $temp['name'] = $sheet->getCell('A' . $i)->getValue(); $temp['sex'] = $sheet->getCell('B' . $i)->getValue(); $temp['age'] = $sheet->getCell('C' . $i)->getValue(); # 防止空行情況 if (!$temp['name']) { continue; } $users[] = $temp; } var_dump($users);
第四步EXCEL文件寫入
創建表格對象
下面方法為新創建表格對象,當然也可以用已經讀取完成的對象,如上面的$spreadsheet
,然后實現對原有單元格的覆寫,生成新文件
# 新創建Spreadsheet對象 $spreadsheet = new \PhpOffice\PhpSpreadsheet\Spreadsheet(); # 獲取活動的sheet $sheet = $spreadsheet->getActiveSheet();
寫入單元格數據
# 第一行寫入標題數據 $sheet->setCellValue('A1', '姓名1'); $sheet->setCellValue('B1', '性別1'); $sheet->setCellValue('C1', '年齡1'); # 模擬寫入的數據 $users = [ ['name' => '張三', 'sex' => '男', 'age' => 21,], ['name' => '李四', 'sex' => '女', 'age' => 22,], ['name' => '王五', 'sex' => '男', 'age' => 20,], ]; # 要寫入的總行數 $count = count($users); # 逐行寫入 for ($i = 0; $i < $count; $i++) { # 要寫入的行號 從第二行開始 $index = $i + 2; # 用戶數據 $line = $users[$i]; $sheet->setCellValue('A' . $index, $line['name']); $sheet->setCellValue('B' . $index, $line['sex']); $sheet->setCellValue('C' . $index, $line['age']); }
生成並保存文件
# 也可以保存為其他格式 $writer = new \PhpOffice\PhpSpreadsheet\Writer\Xlsx($spreadsheet); # $writer = new \PhpOffice\PhpSpreadsheet\Writer\Xls($spreadsheet); # 寫入文件 $writer->save('/tmp/xxx.xlsx');
稍微有點亂,多看幾遍就理清順序了,哇哈哈哈