PHPExcel替代方案PhpSpreadsheet

PHPExcel上一版本1.8.1於2015年發佈。該項目已不再維護,可以使用,但是不建議再使用。所有用戶都應該遷移到其直接後繼者PhpSpreadsheet或其他替代方案。PhpSpreadsheet打破了兼容性,大大提高了代碼庫質量(命名空間,PSR合規性,最新PHP語言功能的使用等)。

文檔地址:https://phpspreadsheet.readthedocs.io/en/develop/

GitHub下載:https://github.com/PHPOffice/PhpSpreadsheet

composer安裝:composer require phpoffice/phpspreadsheet

簡單入門

<?php
require './vendor/autoload.php';

use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PhpOffice\PhpSpreadsheet\Writer\Xlsx;

$spreadsheet = new \PhpOffice\PhpSpreadsheet\Spreadsheet();
$spreadsheet = new Spreadsheet();
try {
    $sheet = $spreadsheet->getActiveSheet();
} catch (\PhpOffice\PhpSpreadsheet\Exception $e) {
    echo "==PhpSpreadsheet異常==";
    var_dump($e);
    die;
}
// 按照單元格寫入
$sheet->setCellValue('A1','Hello World');
// 按照行列寫入,注意行和列都是從1開始的
$sheet->setCellValueByColumnAndRow(1,2,'2行1列');

$writer = new Xlsx($spreadsheet);
try {
    $writer->save('hello.xlsx');
} catch (\PhpOffice\PhpSpreadsheet\Writer\Exception $e) {
    echo "==Writer異常==";
    var_dump($e);
    die;
}

生成的hello.xlsx如下

 從內存中清除工作簿

$spreadsheet->disconnectWorksheets(); //如果沒有這句,直接運行下面那句會報“內存泄漏”錯誤

unset($spreadsheet);

PhpSpreadsheet類無法讀取和寫入持久存儲,但是提供了\PhpOffice\PhpSpreadsheet\Reader\IReader和\PhpOffice\PhpSpreadsheet\Writer\IWriter實現了讀和寫

有兩種方法可以將文件讀入PhpSpreadsheet

1 自動文件類型解析模式

$spreadsheet = \PhpOffice\PhpSpreadsheet\IOFactory::load("05featuredemo.xlsx");

 如果您需要在閱讀器上設置一些屬性(例如,只讀取數據)

$reader = \PhpOffice\PhpSpreadshee\IOFactory::createReaderForFile("05featuredemo.xlsx");
$reader->setReadDataOnly(true);
$reader->load("05featuredemo.xlsx");

2 顯式模式

$reader = \PhpOffice\PhpSpreadsheet\IOFactory::createReader("Xlsx");
$spreadsheet = $reader->load("hello.xlsx");

自動類型解析模式比顯式模式稍慢。

閱讀電子表格(.xlsx文件)

$reader = new \PhpOffice\PhpSpreadsheet\Reader\Xlsx();
$spreadsheet = $reader->load("05featuredemo.xlsx");

 設置單元格的數據

1 按照單元格寫入

$sheet->setCellValue('A1','Hello World');

2 按照行列寫入,注意行和列都是從1開始的

$sheet->setCellValueByColumnAndRow(1,2,'2行1列');

獲取單元格的數據

1 按照單元格讀取

$sheet->getCell('A1')->getValue()

2 按照行列寫入,注意行和列都是從1開始的

$sheet->getCellByColumnAndRow($column,$row)->getValue()

例子:有一個students.xlsx,內容如下

<?php
require './vendor/autoload.php';
$reader = new \PhpOffice\PhpSpreadsheet\Reader\Xlsx();
$reader->setReadDataOnly(true);
$spreadsheet = $reader->load('students.xlsx');

$sheet = $spreadsheet->getActiveSheet();
$highestRow = $sheet->getHighestRow();  // 最大行數
$highestColumn = $sheet->getHighestColumn(); // 最大列數
$highestColumn = "AB";
// 把下標變成數字,如A-Z分別對應1-26,AA對應27,AB對應28,以此類推
$highestColumnIndex = PhpOffice\PhpSpreadsheet\Cell\Coordinate::columnIndexFromString($highestColumn);
if($highestRow <= 2){ // 因爲students.xlsx表格數據是從第三行開始的
    exit('Excel沒有任何數據');
}
$data = array();
for($row = 3;$row <= $highestRow;$row++){
    $tempData['name'] = $sheet->getCellByColumnAndRow(1,$row)->getValue();
    $tempData['chinese'] = $sheet->getCellByColumnAndRow(2,$row)->getValue();
    $tempData['math'] = $sheet->getCellByColumnAndRow(3,$row)->getValue();
    $tempData['English'] = $sheet->getCellByColumnAndRow(4,$row)->getValue();
    $data[] = $tempData;
}
var_dump($data);

 結果如下

如果要在students.xlsx添加一行,李四 80 85 90,怎麼處理?這也就要引入下面的概念

從模板生成Excel文件(讀取,修改,寫入)

<?php
require './vendor/autoload.php';

$spreadsheet = \PhpOffice\PhpSpreadsheet\IOFactory::load('students.xlsx');

$sheet = $spreadsheet->getActiveSheet();//李四 80 85 90

$sheet->getCell('A7')->setValue('李四');
$sheet->getCell('B7')->setValue(80);
$sheet->getCell('C7')->setValue(85);
$sheet->getCell('D7')->setValue(90);

$writer = \PhpOffice\PhpSpreadsheet\IOFactory::createWriter($spreadsheet, 'Xlsx');
$writer->save('new_students.xlsx');

生成 new_students.xlsx 內容如下

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章