最近客戶要寫一個能匯入Excel檔案並存入資料表功能的模組,幾年前有寫過但還是用.csv格式的,沒辦法用.xlsx格式讀取,php程式也很老舊了,想說砍掉重練好了,這裡立馬想到tad老師在【實戰PHP7】一書中有提到可以用PHPExcel套件匯出資料表中的內容存成.xlsx檔,但沒提到讀取的部分,不過已經有好的開始是成功的一半,至少不用走冤枉路,這裡要向TAD吳弘凱老師致上十二萬分的敬意,太感謝您了。
經過上網查詢PHPExcel套件的使用方法,寫了一用PHPExcel套件讀取Excel內容後存入資料表的方法,大家參考看看喔!!
這裡還是要感謝tad老師,因為老師開發的tadtools模組裡面就已經有PHPExcel套件了,而且還是最新版,只要引入檔案就能使用了。
1、先引入PHPExcel.php,在模組上方中貼上以下引入路徑
require_once TADTOOLS_PATH . '/PHPExcel.php'; //引入 PHPExcel 物件庫
備註說明TADTOOLS_PATH是直接指向tadtools的常數,如果有再function.php中引入
include_once XOOPS_ROOT_PATH."/modules/tadtools/tad_function.php";
就能使用TADTOOLS_PATH常數
2、加上編碼指定
header("Content-Type:text/html; charset=utf-8");
3、要讀取Excel的欄位共有三欄,分別是學生姓名,學號,座號
表頭不要儲存,然後存入資料表的student_name,student_number,student_seatnumber三個欄位中。
4、code如下說明:
function buildPHPExcel($excelname=""){
global $xoopsDB,$xoopsModule; //需要global物件
//$excelname為檔名由buildPHPExcel()外部傳入
//讀取Excel檔案位置
$file = XOOPS_ROOT_PATH.'/uploads/'. $xoopsModule->getVar("dirname").'/file/'.$excelname.'.xlsx';
try {
$PHPExcel = PHPExcel_IOFactory::load($file);
} catch(Exception $e) {
die('Error loading file "'.pathinfo($file,PATHINFO_BASENAME).'": '.$e->getMessage());
}
$sheet = $PHPExcel->getSheet(0); // 讀取第一個工作表(編號從 1 開始)
$highestRow = $sheet->getHighestRow(); // 取得總列數
function alpha2num($a) //英文轉數字(A=>0、B=>1、AA=>26...以此類推)
{
$l = strlen($a);
$n = 0;
for($i = 0; $i < $l; $i++)
$n = $n*26 + ord($a[$i]) - 0x40;
return $n-1;
}
$highestColumn = $sheet->getHighestColumn(); //取得欄數(英文字ABC)
$highestColumn = alpha2num($highestColumn); //將列號英文字轉成列數
for ($row = 0; $row <= $highestRow; $row++) {
if($row>'1'){ //去除表頭(第0圈為空值,第1圈為表頭,所以從2開始讀取內容)
for ($column = 0; $column <= $highestColumn; $column++) {
$val = $sheet->getCellByColumnAndRow($column, $row)->getValue();
$excel[$row][$column]=$val; //吧$val存成陣列
}}
//資料表語法
if($row>'1'){ //不儲存表頭
$sql="insert into " . $xoopsDB->prefix('neilstudentinformation') . "
(`student_name`,`student_number`,`student_seatnumber`)
values
('".$excel[$row]['0']."','".$excel[$row]['1']."','".$excel[$row]['2']."')";
$xoopsDB->queryF($sql) or redirect_header($_SERVER['PHP_SELF'],3, mysql_error());
}
}
}
經過上網查詢PHPExcel套件的使用方法,寫了一用PHPExcel套件讀取Excel內容後存入資料表的方法,大家參考看看喔!!
這裡還是要感謝tad老師,因為老師開發的tadtools模組裡面就已經有PHPExcel套件了,而且還是最新版,只要引入檔案就能使用了。
1、先引入PHPExcel.php,在模組上方中貼上以下引入路徑
require_once TADTOOLS_PATH . '/PHPExcel.php'; //引入 PHPExcel 物件庫
備註說明TADTOOLS_PATH是直接指向tadtools的常數,如果有再function.php中引入
include_once XOOPS_ROOT_PATH."/modules/tadtools/tad_function.php";
就能使用TADTOOLS_PATH常數
2、加上編碼指定
header("Content-Type:text/html; charset=utf-8");
3、要讀取Excel的欄位共有三欄,分別是學生姓名,學號,座號
表頭不要儲存,然後存入資料表的student_name,student_number,student_seatnumber三個欄位中。
4、code如下說明:
function buildPHPExcel($excelname=""){
global $xoopsDB,$xoopsModule; //需要global物件
//$excelname為檔名由buildPHPExcel()外部傳入
//讀取Excel檔案位置
$file = XOOPS_ROOT_PATH.'/uploads/'. $xoopsModule->getVar("dirname").'/file/'.$excelname.'.xlsx';
try {
$PHPExcel = PHPExcel_IOFactory::load($file);
} catch(Exception $e) {
die('Error loading file "'.pathinfo($file,PATHINFO_BASENAME).'": '.$e->getMessage());
}
$sheet = $PHPExcel->getSheet(0); // 讀取第一個工作表(編號從 1 開始)
$highestRow = $sheet->getHighestRow(); // 取得總列數
function alpha2num($a) //英文轉數字(A=>0、B=>1、AA=>26...以此類推)
{
$l = strlen($a);
$n = 0;
for($i = 0; $i < $l; $i++)
$n = $n*26 + ord($a[$i]) - 0x40;
return $n-1;
}
$highestColumn = $sheet->getHighestColumn(); //取得欄數(英文字ABC)
$highestColumn = alpha2num($highestColumn); //將列號英文字轉成列數
for ($row = 0; $row <= $highestRow; $row++) {
if($row>'1'){ //去除表頭(第0圈為空值,第1圈為表頭,所以從2開始讀取內容)
for ($column = 0; $column <= $highestColumn; $column++) {
$val = $sheet->getCellByColumnAndRow($column, $row)->getValue();
$excel[$row][$column]=$val; //吧$val存成陣列
}}
//資料表語法
if($row>'1'){ //不儲存表頭
$sql="insert into " . $xoopsDB->prefix('neilstudentinformation') . "
(`student_name`,`student_number`,`student_seatnumber`)
values
('".$excel[$row]['0']."','".$excel[$row]['1']."','".$excel[$row]['2']."')";
$xoopsDB->queryF($sql) or redirect_header($_SERVER['PHP_SELF'],3, mysql_error());
}
}
}
備註說明:$excel[$row]['0'],$excel[$row]['1'],$excel[$row]['2']就是Excel表格由左往右的欄數,原本因該是ABC,但經轉換後變成數字0.1.2
5、送出表單後,去資料表查看確認這三個欄位是有寫入的,而且表頭並沒被寫入,再次上傳則資料會自動增加上去,功能一切正常,收工,可以來吃午飯了!!
如有更好的方法也歡迎留言討論!
教學撰寫:徐嘉裕 Neil hsu
5、送出表單後,去資料表查看確認這三個欄位是有寫入的,而且表頭並沒被寫入,再次上傳則資料會自動增加上去,功能一切正常,收工,可以來吃午飯了!!
如有更好的方法也歡迎留言討論!
教學撰寫:徐嘉裕 Neil hsu
留言
張貼留言