今天遇到一個問題,涉及 php 與 excel 之間資料轉換。之前一直用 PHPExcel,他們的開發組不更新了。但是找到了 PhpSpreadsheet 。
一、介紹
用純php 編寫的函式庫,它提供了一組類,允許您讀取和寫入不同的電子表格檔案格式
支援格式
環境需求
php 5.6 以上
php_zip 支援並啟用
php_xml 支援並啟用
php_gd2 支援並啟用
安裝
> composer require phpoffice/phpspreadsheet
#hello world
<?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');
實例
套件中帶了實例程式碼,位置vendor/phpoffice/phpspreadsheet/samples 下
> php -S localhost:8000 -t vendor/phpoffice/phpspreadsheet/samples
二、讀取
無需關心文件類型加載,用到了IOFactory
// 文件路径 $inputFileName = './sampleData/example1.xls'; $spreadsheet = \PhpOffice\PhpSpreadsheet\IOFactory::load($inputFileName);
注意:
這不是加載文件的最有效方法, 並且它缺乏在將檔案實際讀入Spreadsheet 物件之前以任何方式配置載入器的靈活性。
知道檔案類型,可以自行決定使用哪種讀取器
// 文件路径 $inputFileName = './sampleData/example1.xls'; /** 创建读取器 **/ $reader = new \PhpOffice\PhpSpreadsheet\Reader\Xls(); // $reader = new \PhpOffice\PhpSpreadsheet\Reader\Xlsx(); // $reader = new \PhpOffice\PhpSpreadsheet\Reader\Xml(); // $reader = new \PhpOffice\PhpSpreadsheet\Reader\Ods(); // $reader = new \PhpOffice\PhpSpreadsheet\Reader\Slk(); // $reader = new \PhpOffice\PhpSpreadsheet\Reader\Gnumeric(); // $reader = new \PhpOffice\PhpSpreadsheet\Reader\Csv(); $spreadsheet = $reader->load($inputFileName);
當只要讀取數據,不要格式時,實例讀取器中readDataOnly 屬性,如下
$inputFileType = 'Xls'; $inputFileName = './sampleData/example1.xls'; $reader = \PhpOffice\PhpSpreadsheet\IOFactory::createReader($inputFileType); /** 只要数据 **/ $reader->setReadDataOnly(true); $spreadsheet = $reader->load($inputFileName);
注意:csv 讀取器沒有這個屬性
多個檔案合併為一個物件
$inputFileType = 'Csv'; $inputFileNames = [ './sampleData/example1.csv', './sampleData/example2.csv' './sampleData/example3.csv' ]; $reader = \PhpOffice\PhpSpreadsheet\IOFactory::createReader($inputFileType); /** 拿到第一个 **/ $inputFileName = array_shift($inputFileNames); $spreadsheet = $reader->load($inputFileName); $spreadsheet->getActiveSheet() ->setTitle(pathinfo($inputFileName,PATHINFO_BASENAME)); /** 循环读取 **/ foreach($inputFileNames as $sheet => $inputFileName) { /** 重新设置工作表索引 **/ $reader->setSheetIndex($sheet+1); /** 把文件当做一个新的工作表载入 **/ $reader->loadIntoExisting($inputFileName,$spreadsheet); /** 设置工作表标题 **/ $spreadsheet->getActiveSheet() ->setTitle(pathinfo($inputFileName,PATHINFO_BASENAME)); }
注意:對多個工作表使用相同的工作表索引不會將檔案附加到同一工作表中,而是覆寫先前載入的結果。您無法將多個 CSV 檔案載入到同一工作表中。
轉為數組
檔案最後會載入到一個對像中,我稱為spreadsheet 工作表對象,這個對象存放著所以工作表集合的信息(資料資訊與格式資訊、工作表資訊等)
$spreadsheet = PhpOffice\PhpSpreadsheet\IOFactory::load("new.xls"); $data = $spreadsheet ->getSheet(0) // 指定第一个工作表为当前 ->toArray(); // 转为数组 // 或者得到全部工作表的数据数组 $cells=array(); // 工作表对象有迭代器实现 foreach ( $spreadsheet->getWorksheetIterator() as $data ) { $cells = $data->toArray(); }
結語
PhpSpreadsheet 是非常不錯的php 的電子表格處理工具類,後續有時間在補上寫入和導出。
更多PHP相關知識,請造訪PHP中文網!
以上是關於 PhpSpreadsheet 簡單教學的詳細內容。更多資訊請關注PHP中文網其他相關文章!