方法1:將Excel轉存成CSV檔,再用phpmyadmin匯入。
- 以下是用來測試的excel資料,裡面故意輸入一些特殊字元,也故意留了一個欄位沒有輸入值。
- 首先,將excel檔另存成CSV檔。
- 將剛剛另存的CSV檔轉成UTF8的編碼。轉換的方法有很多種,這邊介紹用記事本來轉換。
用記事本,開啟CSV檔,然後選擇 「另存新檔」 ,此時可發現編碼為「ANSI」,將編碼改成 「UTF-8」後,再按 「存檔」即可。 - 打開phpMyAdmin,到要匯入的資料表,確認資料表編碼也是UTF8,再按「輸入(Import)」。
- 選擇剛剛的CSV檔。
檔案的字集選「utf-8」,格式選「CSV」,
欄位分隔符號「,」,內容分隔符號「"」,內容跳脫符號「"」。
再按 「執行」。 - 下圖為匯入的結果,一些特殊符號都能匯入,也無亂碼。
方法2:用程式去讀取excel的資料,再用程式將資料寫到資料庫。
- 這邊最難的應該就是讀取excel檔的資料。
這邊介紹用Spreadsheet_Excel_Reader去讀取excel資料,Spreadsheet_Excel_Reader之前看是在PEAR的套件庫裡面,後來在PEAR裡面就看不到了。
不過在 http://sourceforge.net/projects/phpexcelreader/ 依然可以下載。
(Spreadsheet_Excel_Reader目前只能讀取xls的檔,若是xlsx的檔,可用另一套PHPExcel處理。) - 該套件解壓縮後,有example.php檔的說明可以看套件用法。下面的程式碼是利用
Spreadsheet_Excel_Reader讀取xls檔資料後,再用PDO寫入資料庫。
require_once 'Excel/reader.php'; $data = new Spreadsheet_Excel_Reader(); $data->setOutputEncoding('UTF-8');//設定從excel的xls讀取出來的資料,用UTF8輸出 $data->setUTFEncoder('mb');//設定用mb_convert_encoding取代iconv,用來進行文字編碼的轉換 $data->read('Book1.xls'); //資料庫設定 $dsn = "mysql:dbname=test;host=127.0.0.1"; $user = "root"; $password = "test"; $driver_options = array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES UTF8");//設定資料庫連線為UTF8 try { $dbh = new PDO($dsn, $user, $password, $driver_options); } catch (PDOException $e) { echo 'Connection failed: ' . $e->getMessage(); } $aa=''; $bb=''; $cc=''; $sth = $dbh->prepare('INSERT INTO test SET aa = :aa, bb=:bb, cc=:cc'); $sth->bindParam(':aa', $aa); $sth->bindParam(':bb', $bb); $sth->bindParam(':cc', $cc); $numRows = $data->sheets[0]['numRows']; $numCols = $data->sheets[0]['numCols']; for ($i = 1; $i <= $numRows; $i++) { for ($j = 1; $j <= $numCols; $j++) { $v = $data->sheets[0]['cells'][$i][$j];//第一列的第三個欄位為NULL,此時這邊會出現notice,可自行加判斷處理 if(NULL===$v) $v = "";//因為我的資料表結構不能儲存NULL,所以將NULL改為空字串 switch($j) { case 1: $aa = $v; break; case 2: $bb = $v; break; case 3: $cc = $v; break; } } $sth->execute();//寫入資料庫 }
備註:
"require_once 'Excel/reader.php';"這一行若出現找不到"Spreadsheet/Excel/Reader/OLERead.php"的錯誤訊息(我下載時的版本有出現這個錯誤),
請修改 Excel/reader.php 這個檔,將裡面的
require_once 'Spreadsheet/Excel/Reader/OLERead.php';改為
require_once 'oleread.inc';
請問您用csv_importer有出現phpmyadmin中文字變成亂碼的問題嗎?
回覆刪除我phpmyadmin用的是UTF-8
感謝您,很棒的文章,很受用。
回覆刪除感謝你,幫了很大的忙~
回覆刪除請問這樣是錯在哪裡?
回覆刪除CSV 輸入的第 1 行欄位數有錯
感謝~
請檢查 CSV 檔每一行欄位數,跟資料表欄位數是否相同。
刪除可用文字編輯器開啟 CSV 檔,看分隔符號「,」分隔出的欄位數。
很不錯的教學!
回覆刪除