2013年7月23日 星期二

PHP - 使用 PHPExcel 讀取Excel檔

更新時間:2015-11-04 21:38
<?php

//引入一個檔案即可
require_once 'PHPExcel_1.8.0/Classes/PHPExcel/IOFactory.php';

//檔案路徑
$inputFileName = 'example.xlsx';

//檔案類型 (不是副檔名,而是 Excel5, Excel2007, CSV, Excel2003XML 這種字串)
$inputFileType = PHPExcel_IOFactory::identify($inputFileName);

/**  Create a new Reader of the type that has been identified  **/
$objReader = PHPExcel_IOFactory::createReader($inputFileType);

/**  Load $inputFileName to a PHPExcel Object  **/
$objPHPExcel = $objReader->load($inputFileName);
$sheetCount = $objPHPExcel->getSheetCount();
$sheetNames = $objPHPExcel->getSheetNames();

$sheet = $objPHPExcel->getActiveSheet(0); //讀取第一個工作表(編號從 0 開始)
$colString = $sheet->getHighestColumn(); //最大欄位的英文代號
$highestColumns = PHPExcel_Cell::columnIndexFromString($colString); //最大欄位的數字編號。A=0, B=1, C=2....
$highestRows = $sheet->getHighestRow(); //最高行數。從1開始

for($s = 0; $s<$sheetCount; $s++){
    $objPHPExcel->setActiveSheetIndex($s);
    $sheet = $objPHPExcel->getActiveSheet();
    $colString = $sheet->getHighestColumn(); //最大欄位的英文代號
    $highestColumns = PHPExcel_Cell::columnIndexFromString($colString); //最大欄位的數字編號。A=0, B=1, C=2....
    $highestRows = $sheet->getHighestRow(); //最高行數。從1開始
    
    $SheetName = $sheetNames[$s];
    $excelData[$s]['SheetName'] = $SheetName;
    
    //欄位標題
    $v = null;
    for ($c = 0; $c < $highestColumns; $c++) { // 0 = A欄
        $v = trim($sheet->getCellByColumnAndRow($c, 1)->getValue());
        if(!empty($v)){
            $excelData[$s]['Titles'][] = $v;
        }
    }
    
    //資料
    $startRowNum = 2; //資料列從第2行開始。可自訂
    for ($r = $startRowNum; $r <= $highestRows; $r++) { // $r = 行數
        $i = $r-$startRowNum; // $i = 第1維陣列索引
        for ($c = 0; $c < 2; $c++) { //$c = 第2維陣列 = 欄位編號
            $v = trim($sheet->getCellByColumnAndRow($c, $r)->getValue());
            if(!empty($v)){
                $excelData[$s]['Data'][$i][$c] = $v;
            }
        }
    }
    
    
}
echo "<pre>",print_r($excelData,1),"</pre>";

//寫入檔案
$filename = $SheetName . ".txt"; //檔案名稱
$fp = @fopen("$filename","w+"); //開啟檔案,要是沒有檔案將建立一份
foreach($excelData[$s]['Data'] as $row){
    $str = '"' . $row[0] . '"' . ':"' . $row[1] . '"' . "\r\n";
    fputs($fp, $str);
}
fclose($fp); //關閉檔案
對讀取 Excel 檔來說,以上這些資料應該就很夠用了。
另外還有一個 toArray 的功能可以把整個表格內容讀到陣列。
$sheetData = $sheet->toArray(null, true, true, true);
echo "
", print_r($sheetData , 1), "
"; exit;

要匯出的話,請參考 PHPExcel - 匯出 Excel檔

4 則留言:

  1. 1. $highestColumns 是英文代號,應該沒辦法用 < 來運算。 2. $row 未定義,應該是 $r ?

    回覆刪除
  2. 謝謝您的提醒,已修正一些內容。現在 $highestColumns 是數字編號

    回覆刪除
  3. 回覆
    1. 剛剛才看到您的信,謝謝喔。已更新。

      刪除