PhpSpreadsheet 小教程

lmaster發表於2019-06-19

關於 PhpSpreadsheet 簡單教程

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

一. 介紹

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

支援格式

格式 讀取 寫入
ods
excel 2007 及以上(xlsx)
excel 97 及以上(xls)
excel 95(xls,傳說中的 BIFF 5)
excel 2003(xml,SpreadsheetML)
CSV

環境要求

  • 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的電子表格處理工具類,後續有時間在補上寫入和匯出

本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章