首頁  >  文章  >  後端開發  >  php讀excel檔案的方法

php讀excel檔案的方法

巴扎黑
巴扎黑原創
2016-11-29 09:57:421603瀏覽

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

1. 以.csv格式讀取 

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

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

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

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

array fgetcsv ( int $handle [, int $length [, string $delimiter [, string $enclosure]]] ) p
( () 或fsockopen() 所產生的有效檔案指標。 

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

delimiter (可選)設定欄位分界符(只允許一個字元),預設值為逗號。 

enclosure (選用)設定欄位環繞符(只允許一個字元),預設值為雙引號。此參數是在 PHP 4.3.0 中新增的。 和 fgets() 類似,只除了 fgetcsv() 解析讀入的行並找出 CSV 格式的欄位然後傳回一個包含這些欄位的陣列。 

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

注意: CSV 檔案中的空白行將被傳回為一個包含單一 null 欄位的陣列,不會被當成錯誤。 

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

 

也可以利用fputcsv函數將行格式化為CSV 並寫入檔案指標。 

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/OLERid.';

改為require_once 'oleread.inc'; 

example.php 中 

修改$data->setOutputEncoding('CP1251′); 
修改$data->setOutputEncoding('CP1251′); 
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?titled.T.

有時寫程式時後台要求把大量資料匯入資料庫中,例如電腦考試成績的查詢、電話簿的資料等一般都是存放在excel的,這時我們可把資料匯出成csv文件,然後透過以下程式即可在背景批次匯入資料到資料庫。

  以下只是主要程序部分: 


//定義取得時間函數 
function getmicrotime(){ 
   list($usec, $sec) = explode ); (float)$usec + (float)$sec); 

?> 
$time_start = getmicrotime(); 
include("db.inc.php");//連接資料庫new testcsv; 
?> 
$handle = fopen ("test.csv","r"); 
$sql="插入分數(idcard,姓名,num,性別,國家,分數)values(";
while ($data = fgetcsv ($handle, 1000, ",")) {

  $num = count ( $ data); 
  for ($c=0; $c       if($c==$num-1){$sql=$sql.$data[$c]." )" ;break;} 
      $sql=$sql.$data[$c].","; 
  } 
印出「
」; 
echo $sql."
"; 
$db-> $sql); 
echo "sql語句執行成功!
"; 
$sql="插入分數(idcard,names,num,sex,nation,score)values("; 

fclose ($handle);
$time_end = getmicrotime(); 
$time = $time_end - $ time_start; 
echo "程式執行時間:".$time."秒";
?

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn