如今遇到使用PHPEXCEL讀取EXCEL的開發,雖然網上大家都供獻了很多不錯的源碼,不過遇到自己開發時也得根據自己的情況來使用並解決一些問題。這裏把我在此開發過程中使用的方法及遇到的問題發佈出來,方法能在這一篇文章中解決更多的問題。
一、PHPEXCEL的使用
使用PHPEXCEL需要先下載PHPEXCEL文件包,本文配備了文件包方便大家下載測試,也可以根據需要網上找更新的版本。
function import_level1() {
$filename=trim($_POST['file']);//讀取excel文件
$filePath="/home/ftp/c/chinajxedu_news/wwwroot/uploadfile/excel/".$filename;//指定文件路徑
require_once('/home/ftp/c/chinajxedu_news/wwwroot/phpcms/excel/PHPExcel/IOFactory.php');//引入excel文件庫
if($dosubmit){
$PHPReader = new PHPExcel_Reader_Excel5();
if(!$PHPReader->canRead($filePath)){
$PHPReader = new PHPExcel_Reader_Excel5();
if(!$PHPReader->canRead($filePath)){
echo 'no Excel';
return ;
}
}
$PHPExcel = $PHPReader->load($filePath);
$currentSheet = $PHPExcel->getSheet(0); /**取得一共有多少列*/
$allColumn = $currentSheet->getHighestColumn(); /**取到多少列*/
$allRow = $currentSheet->getHighestRow();
for( $currentRow = 2 ; $currentRow <= $allRow ; $currentRow++){
$flag = 0;
$col = array();
for($currentColumn='A'; $this->getascii($currentColumn) <= $this->getascii($allColumn) ; $currentColumn++){
$address = $currentColumn.$currentRow;
$string = $currentSheet->getCell($address)->getValue();
$col[$flag] = $string;
$flag++;
}
//插入數據
if($col)
{
//這裏可以取$col數組中的值構建要插入數據庫的數組對象。
}
//print_r($col);
}
}
}
此方法使用的方式是對要導入的excel文件採用指定絕對地址的方法,大家可以根據情況增加上傳文件到服務器的功能,總之需要指定準確的文件路徑及名稱。excel版本建議爲97-2003(.xls),xlsx應該也可以,沒測試,使用的朋友你可以試一下。
二、使用中遇到的幾個問題
1、在循環讀取excel中getascii方法必須使用,否則只會讀取第一列的數據,列無法循環下去。
public function getascii($ch) { //讀取字符串的ASCII碼
if(strlen($ch) == 1)
return ord($ch)-65;
return ord($ch[1])-38;
}
2、如果excel表中有日期,而且需要以時間戳的形式存入到數據表中,則時間日期格式需進行如下處理。
Excel中的日期存儲的是數值類型,計算的是從1900年1月1日到現在的數值。例如2008-12-31實際上存儲的是39813。可以在 Excel中驗證,首先在一個單元格中輸入2008-12-31,然後將單元格格式修改爲“常規”,然後就會看到單元格內容變成了39813。
Excel中的時間是一個從0到0.99999999之間的小數值,表示從00:00:00(12:00:00 AM)到23:59:59(11:59:59 PM)之間的時間。例如12:00 PM的數值是0.5,表示一天的一半。
Excel 2007版本中提供了24種默認的日期類型格式,其中帶星號的兩個會和系統時區綁定(這樣在不同時區的電腦之間傳遞文件時,時間會發生變化)其他的則不會根據時區發生變化。
這些信息只做爲一個簡單瞭解,如想了解更多的可以到網上去查,這裏不再多說,以解決實問題爲主。
$d = trim($col[9]);$t = 24 * 60 * 60;
$cometinfo['card_date']=strtotime(gmdate('Y-m-d', ($d-25569) * $t));
因爲excel中返回的是一個數值,所以需要將其進行轉化,轉化方法是通過及$t的運算和gmdate的轉格式。這裏需要注意的時“25569”這個值,如查發現用這個值不能輸出正確的時間,則改用“gmdate('Y-m-d', (41728.732916667 - $d) * $t);”,因爲不同的excel中代表的日期起啓日期不同,有的是1900年,有的則是1970年。