天天看點

PHP讀取EXCEL

常用的用PHP讀取EXCEL的方法有以下三種,各自有各自的優缺點。個人推薦用第三種方法,因為它可以跨平台使用。

1. 以.csv格式讀取

将.xls轉換成.csv的文本格式,然後再用PHP分析這個檔案,和PHP分析文本沒有什麼差別。

優點:跨平台,效率比較高、可以讀寫。

缺點:隻能直接使用.csv的檔案,如果經常接受.xls二進制檔案的話需要手工轉換,不能自動化。一個檔案隻有一個SHEET。

PHP有自帶的分析.csv函數:fgetcsv

array fgetcsv ( int $handle [, int $length [, string $delimiter [, string $enclosure]]] )

handle 一個由 fopen()、popen() 或 fsockopen() 産生的有效檔案指針。

length (可選)必須大于 CVS 檔案内最長的一行。在 PHP 5 中該參數是可選的。如果忽略(在 PHP 5.0.4 以後的版本中設為 0)該參數的話,那麼長度就沒有限制,不過可能會影響執行效率。

delimiter (可選)設定字段分界符(隻允許一個字元),預設值為逗号。

enclosure (可選)設定字段環繞符(隻允許一個字元),預設值為雙引号。該參數是在 PHP 4.3.0 中添加的。 和 fgets() 類似,隻除了 fgetcsv() 解析讀入的行并找出 CSV 格式的字段然後傳回一個包含這些字段的數組。

fgetcsv() 出錯時傳回 FALSE,包括碰到檔案結束時。

注意: CSV 檔案中的空行将被傳回為一個包含有單個 null 字段的數組,不會被當成錯誤。

當然也可以自己手動分析字元串。

01

<?php

02

$row

= 1;

03

$handle

fopen

(

"test.csv"

,

"r"

);

04

while

(

$data

fgetcsv

(

$handle

, 1000, 

","

)) {

05

$num

count

(

$data

);

06

echo

"

07

$num

fields in line 

$row

:/n";

08

$row

++;

09

for

(

$c

=0; 

$c

$num

$c

++) {

10

echo

$data

[

$c

] . 

"/n"

;

11

}

12

}

13

fclose(

$handle

);

14

?>

還可以利用fputcsv函數将行格式化為 CSV 并寫入檔案指針。

另,由于日期型的特殊性,在取值時可能會産生錯誤,可将Excel單元格類型設為Text,

将日期以文本形式讀取,如需日期型字元再通過PHP對其進行處理即可(strtotime()結合date())。

2. ODBC連結資料源

優點:支援多種格式,cvs, xls等。支援讀寫,使用标準SQL語言,和SQLSERVER、MYSQL資料庫幾乎完全一樣。

缺點:值支援windows伺服器

3. PHP自定義類

優點:跨平台。某些類支援寫操作。支援.xls二進制檔案

常用的類有phpExcelReader、PHPExcel。其中後者支援讀寫,但是需要php5.2以上版本。

phpExcelReader是專門用來讀取檔案的。傳回一個數組,包含表格的所有内容。

該 class 使用的方法可以參考網站下載下傳回來的壓縮檔中的 example.php。

不過我下載下傳回來的 (版本 2009-03-30),有兩點要注意:

reader.php 中的下面這行要修改

将 require_once ‘Spreadsheet/Excel/Reader/OLERead.php’;

改為 require_once ‘oleread.inc’;

example.php 中

修改 $data->setOutputEncoding(‘CP1251′);

為 $data->setOutputEncoding(‘CP936′);

修改 nl2br(htmlentities($data->sheets[$sheet]['cells'][$row][$col]));

為 $table_output[$sheet] .= nl2br(htmlspecialchars($data->sheets[$sheet]['cells'][$row][$col]));

不然中文會有問題。

繁體的話可以修改為CP950、日文是CP932,具體可參考codepage說明。

修改 $data->read(‘jxlrwtest.xls’) 為自己的 excel 檔案名,zip 檔中附的 jxlrwtest.xls 應該是壞了。

這是下載下傳位址:

phpExcelReader:http://sourceforge.net/projects/phpexcelreader/

PHPExcel:http://www.codeplex.com/PHPExcel/Wiki/View.aspx?title=Documents&referringTitle=Home