關於 PhpSpreadsheet 簡單教學

2020-07-16 10:05:48
今天遇到一個問題,涉及 php 與 excel 之間資料轉換。之前一直用 PHPExcel,他們的開發組不更新了。但是找到了 PhpSpreadsheet

一、介紹

用純 php 編寫的庫,它提供了一組類,允許您讀取和寫入不同的電子試算表檔案格式

支援格式

89e1b234114930a4f759eadb1f2eb89.png

環境要求

php 5.6 及以上

php_zip 支援並啟用

php_xml 支援並啟用

php_gd2 支援並啟用

安裝

> composer require phpoffice/phpspreadsheet

hello world

<?php
require 'vendor/autoload.php';
use PhpOfficePhpSpreadsheetSpreadsheet;
use PhpOfficePhpSpreadsheetWriterXlsx;
$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 = PhpOfficePhpSpreadsheetIOFactory::load($inputFileName);

注意:

這不是載入檔案的最有效方法, 並且它缺乏在將檔案實際讀入 Spreadsheet 物件之前以任何方式設定載入器的靈活性。

知道檔案型別,可以自己決定使用哪種讀取器

// 檔案路徑
$inputFileName = './sampleData/example1.xls';
/** 建立讀取器  **/
$reader = new PhpOfficePhpSpreadsheetReaderXls();
//    $reader = new PhpOfficePhpSpreadsheetReaderXlsx();
//    $reader = new PhpOfficePhpSpreadsheetReaderXml();
//    $reader = new PhpOfficePhpSpreadsheetReaderOds();
//    $reader = new PhpOfficePhpSpreadsheetReaderSlk();
//    $reader = new PhpOfficePhpSpreadsheetReaderGnumeric();
//    $reader = new PhpOfficePhpSpreadsheetReaderCsv();
$spreadsheet = $reader->load($inputFileName);

當只要讀取資料,不要格式時,範例讀取器中 readDataOnly 屬性,如下

$inputFileType = 'Xls';
$inputFileName = './sampleData/example1.xls';
$reader = PhpOfficePhpSpreadsheetIOFactory::createReader($inputFileType);
/**  只要資料  **/
$reader->setReadDataOnly(true);
$spreadsheet = $reader->load($inputFileName);

注意:csv 讀取器沒有這個屬性

多個檔案合併為一個物件

$inputFileType = 'Csv';
$inputFileNames = [
    './sampleData/example1.csv',
    './sampleData/example2.csv'
    './sampleData/example3.csv'
];
$reader = PhpOfficePhpSpreadsheetIOFactory::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 = PhpOfficePhpSpreadsheetIOFactory::load("new.xls");
$data = $spreadsheet
            ->getSheet(0) // 指定第一個工作表為當前
            ->toArray();  // 轉為陣列
// 或者得到全部工作表的資料陣列           
$cells=array();
// 工作表物件有疊代器實現
foreach ( $spreadsheet->getWorksheetIterator() as $data ) {
    $cells = $data->toArray();
}

結語

PhpSpreadsheet 是非常不錯的 php 的電子試算表處理工具類,後續有時間在補上寫入和匯出。

更多PHP相關知識,請存取PHP中文網

以上就是關於 PhpSpreadsheet 簡單教學的詳細內容,更多請關注TW511.COM其它相關文章!