PHPExcel 讀取表格

zgxxx發表於2018-11-08

先引入類IOFactory.php

    require_once '../PHPExcel/IOFactory.php';
    $filePath = "test.xlsx";  // 測試檔案

載入測試檔案

  1. $inputFileType = PHPExcel_IOFactory::identify($filePath) 判斷檔案型別
  2. $objReader = PHPExcel_IOFactory::createReader($inputFileType); 例項化型別物件
  3. $objPHPExcel = $objReader->load($filePath); 載入檔案

下面主要判斷Excel2007和Excel5型別,即xlsx/xlsm/xltx/xltm和xls/xlt格式檔案

    try {
        $inputFileType = PHPExcel_IOFactory::identify($filePath);
        if ($inputFileType !== "Excel5" && $inputFileType !== "Excel2007" ) {
            unlink($filePath) && str_alert(-1,"請確保匯入的檔案格式正確!");
        }
        $objReader = PHPExcel_IOFactory::createReader($inputFileType);
        $objPHPExcel = $objReader->load($filePath);
    } catch(Exception $e) {
        unlink($filePath) && str_alert(-1,'載入檔案發生錯誤:”'.pathinfo($filePath,PATHINFO_BASENAME).'”: '.$e->getMessage());
    }

獲取當前工作表

    $sheet = $objPHPExcel->getSheet(0);
    //或者
    $sheet = $objPHPExcel->getActiveSheet();

獲取工作表行數和列數

    $highestRow = $sheet->getHighestRow();
    $highestColumn = $sheet->getHighestColumn();

注意:有時候你會發現你的表格明明有內容的行數就5行,但是獲取到的$highestRow卻有7,8行或者更多,這可能是因為你在操作你的表格的時候不小心點選了其它行數,雖然沒有填寫內容,但getHighestRow也是能夠識別出行數;
想要獲取有內容的行數應該使用getHighestDataRow和getHighestDataColumn
原始碼註釋是這樣介紹的string Highest row number that contains data,即包含資料的字串最高行數.

單元格具體內容

xlsx型別的表格單元格是透過類似xy軸座標來獲取的,
可透過類似

     $sheet->getCell("A1")->getValue();
     $sheet->getCell("B2")->getValue();

獲取相應位置的內容,
如果不想透過字母了來遍歷獲取,可以用數字索引方法

      $sheet->getCellByColumnAndRow(0,1);
      $sheet->getCellByColumnAndRow(1,2);

注意座標中第一個引數從0開始,0代表A,1代表B...,第二個引數從1開始.
下面是遍歷表格獲取全部單元格內容:

    $dataSet=array();
    for ($column = "A"; $column <= $highestColumn; $column++) {//列數是以A列開始
        for ($row = 4; $row <= $highestRow; $row++) { //行數是以第4行開始
            $cell = $sheet->getCell($column . $row)->getValue();
            if($cell instanceof PHPExcel_RichText) { //富文字轉換字串
                $cell = $cell->__toString();
            }
            $dataSet[$row][] = $cell;
        }
    }

其中富文字轉換字串,是使用$cell instanceof PHPExcel_RichText判斷是否為富文字,查閱資料發現如果你的單元格中字串包含兩種以上的字型會自動被設為富文字,這時候需要__toString()轉換

判斷合併單元格是否位於最左上角

當我們迴圈輸出所有單元格後發現,一些被合併的單元格只有最左上座標的是有內容的,其他都是null
例如A4,A5合併成一個單元格,getCell("A4")是有正常內容的,但是getCell("A5")是null.
isMergeRangeValueCell可以用來判斷某個具體的單元格是否為最左上角

    $sheet->getCell('A' . $row)->isMergeRangeValueCell()

當$row為4的時候是返回true,5的時候返回false

轉換時間

獲取表格中時間格式的內容,需要PHPExcel_Shared_Date::ExcelToPHP()來轉換為php可識別的時間格式

    date('Y-m-d',PHPExcel_Shared_Date::ExcelToPHP($sometime);
本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章