[CodeIgniter4]phpspreadsheet的使用


 [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');

稍微有點亂,多看幾遍就理清順序了,哇哈哈哈


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM