2012-10-12 51 views
1

我正在使用php讀取excel並將這些記錄存儲在mysql。我遇到了PHPExcel,這是一組非常好的插件類,它們可以很容易地幫助實現它試圖通過搜索,但沒有類似於我的用例。另外,不太好在面向對象的PHP,我很短的時間在這樣做。SQL插入數據使用PHPExcel從Excel中讀取

First Name Last Name Nationality Gender Date of Birth Time of Birth Date/Time PHP Coder Sanity %Age 

以上是我對樣本數據庫列首先排我的Excel sheet.I的希望將它們插入到數據庫之前,以配合我行的列名。 我的代碼到現在爲我提供了一個2維數組,其中我得到了列名和值。我想在插入之前檢查列名的原因是,我的excels可以按列名的任何順序排列。 我在包中使用exampleReader01,並使用一些SO參考來實現此目的。

$headingsArray = $objWorksheet->rangeToArray('A1:'.$highestColumn.'1',null, true, true, true); 
    $headingsArray = $headingsArray[1]; 
    $r = -1; 
    $namedDataArray = array(); 
    for ($row = 2; $row <= $highestRow; ++$row) { 
    $dataRow = $objWorksheet->rangeToArray('A'.$row.':'.$highestColumn.$row,null, true, true, true); 
    if ((isset($dataRow[$row]['A'])) && ($dataRow[$row]['A'] > '')) { 
     ++$r; 
    foreach($headingsArray as $columnKey => $columnHeading){ 
     $namedDataArray[$r][$columnHeading] = $dataRow[$row][$columnKey]; 
    } 
    } 
} 

現在我想要一些幫助,我該如何將它插入右欄。 我的陣列是這樣的

Array 
(
[0] => Array 
    (
     [First Name] => Mark 
     [Last Name] => Baker 
     [Nationality] => British 
     [Gender] => M 
     [Date of Birth] => 19-Dec-60 
     [Time of Birth] => 1:30 
     [Date/Time] => 22269.0625 
     [PHP Coder] => 1 
     [Sanity %Age] => 32% 
    ) 

[1] => Array 
    (
     [First Name] => Toni 
     [Last Name] => Baker 
     [Nationality] => British 
     [Gender] => F 
     [Date of Birth] => 24-Nov-50 
     [Time of Birth] => 20:00 
     [Date/Time] => 18591.83333 
     [PHP Coder] => 
     [Sanity %Age] => 95% 
    ) 

[2] => Array 
    (
     [First Name] => Rachel 
     [Last Name] => Baker 
     [Nationality] => British 
     [Gender] => F 
     [Date of Birth] => 7-Dec-82 
     [Time of Birth] => 0:15 
     [Date/Time] => 30292.01042 
     [PHP Coder] => 
     [Sanity %Age] => 100% 
    ) 

) 

希望我很清楚。
感謝您的時間。

回答

1

如果我可以假設你的Excel列標題名稱永遠不會改變,爲什麼不簡單地使用映射數組?

$dbMapping = array(
    'col1' => header1, 
    'col2' => header2, 
    .. 
    'colN' => headerN 
); 

所以,當你準備好要插入到數據庫,通過與列標題名稱的每一行重複你已經在你的二維數組並把它傳遞到您的映射數組即$ dbMapping [「COL1」 ],這將爲您提供您的標題名稱,並且您可以獲取正確的行值。

foreach ($rows as $row) { 
    insert into col1, col2, ... colN 
     values ($rows[$dbMapping['col1']], $rows[$dbMapping['col2']], ... 
} 

當然,這將是使用參數值你最好的興趣。

+0

如果我得到你的權利,你的意思是我應該有一個靜態數組,有我的列名和我的地圖與數據庫中的列號。 例如:'First Name => col1,Last Name => col2'等等。請您詳細闡述一下邏輯如何檢查映射,我已經添加了我的表結構和列名。 感謝您的努力。 – KillABug

+0

對不起,不得不切換$ dbMapping值,但我用僞代碼更新了一點,以顯示總體思路 – dispake

+0

我嘗試像這樣的foreach($ namedDataArray as $ key => $ value) {$ sql = 「insert into tbl_user(」。$ fieldset。「)values(」。「'」。$ value ['First Name']。「'」。「,」。「'」。$ value ['Last Name']。 「 '」。 「」。 「'」。$值 '國籍'。 「 '」。 「」。 「'」。$值 '性別'。 「」「。 」「。」' 「。」$ value ['出生日期']。「'」。「,」。「'」。$ value ['出生時間']。「'」。「,」。「'」。$ value [日期/時間']。''「。」,「。」'「。$ value ['PHP Coder']。」'「。」,「。」'「。$ value ['Sanity%Age']。」 「) 「」。」; '但是,當列順序不變時(在Excel中),這是很好的。 $ fieldset保存列表。但我的excel可能按列的順序不同,但名稱是一致的 – KillABug