2014-09-26 116 views
1

我已經使用PHPExcel只是一點點,但我發現它似乎在Excel電子表格中閱讀時跳過一些行。我有一個帶有11857行的文件,似乎只有11814個文件被讀取 - 很多文件都是爲了寫入數據庫而被處理的。我的程序運行時沒有遇到任何錯誤。我寫了第二個程序,再次閱讀Excel並查找數據庫中的每一行....缺少48行,第二個檢查程序找到25.我想知道是否有更好的方法這讓我得到所有記錄?它似乎也發生在一個文件中約有4000行(我認爲這可能是由於大小)。我只想要某些字段,所以我通過讀取第一行來找到它們的列位置,然後遍歷文件的其餘部分並將這些字段寫入數據庫(除非它已經在那裏)。有些輸入沒有ID,所以如果沒有ID提供,我會查找名稱。我的代碼如下:PHPExcel跳過Excel行

$objReader = PHPExcel_IOFactory::createReader('Excel2007'); 
$objReader->setReadFilter(new MyReadFilter()); 
$objPHPExcel = $objReader->load($fileName); 

$objWorksheet = $objPHPExcel->getActiveSheet(); 
$highestRow = $objWorksheet->getHighestRow(); 
$highestColumn = $objWorksheet->getHighestColumn(); 
$highestColumnIndex = PHPExcel_Cell::columnIndexFromString($highestColumn); 


$colHeaderArray = array(); 
$numberHeaderArray = array(); 

for ($row = 1; $row <= 1; ++$row) { 
    for ($col = 0; $col <= $highestColumnIndex; ++$col) { 
     $rows[$col] = $objWorksheet->getCellByColumnAndRow($col, $row)->getValue(); 
     $colHeaderArray[] = $rows[$col]; 
     $numberHeaderArray[] = "field".str_pad($col+1, 2, "0", STR_PAD_LEFT); 
    } 

    $partId = array_search('PartnerId', $rows); 
    $partName = array_search('PartnerName', $rows); 
    $status = array_search('status', $rows); 
    $city = array_search('city', $rows); 
    array_pop($colHeaderArray); 
    array_pop($numberHeaderArray); 
} 

$dataRows = array(); 

for ($row = 2; $row <= $highestRow; ++$row) { 
    $myDataArray = array(); 
    $dataRows[0] = $objWorksheet->getCellByColumnAndRow($partId, $row)->getValue(); 
    $dataRows[1] = $objWorksheet->getCellByColumnAndRow($partName, $row)->getValue(); 
    $dataRows[2] = $objWorksheet->getCellByColumnAndRow($status, $row)->getValue(); 
    $dataRows[3] = $objWorksheet->getCellByColumnAndRow($city, $row)->getValue(); 
    $myDataArray[]= $dataRows; 
    addPartner($dataRows); 
    array_pop($myDataArray); 
} 

function addPartner($row) { 
    $mysqli = new mysqli(DBHOST, DBUSER, DBPASS, DBNAME); 
    $mysqli->set_charset("utf8"); 
    $err = ''; 

    if ($row[0] == '') { 
    //echo "empty ID"; 
     $result = $mysqli->query("SELECT * FROM partners WHERE partnerName = '".$row[1]."' "); 
     $err = "name already in"; 
    } else { 
     //echo "not empty ID"; 
     $result = $mysqli->query("SELECT * FROM partners WHERE partnerId = '".$row[0]."' "); 
     $err = "number already in"; 
    } 

    if ($result->num_rows > 0) { 
     $result = $mysqli->query("INSERT INTO partnererror (id, name, comment) VALUES ('".$row[0]."', '".$row[1]."', '".$err."')"); 
     return; 
    } else { 
     $result = $mysqli->query("INSERT INTO partners (partnerId, partnerName, status, city) VALUES ('".$row[0]."', '".$row[1]."', '".$row[2]."', '".$row[3]."')");  
    } 
} 
+0

那麼你有什麼樣的調試方法來查看行丟失的位置?是否在for($ row = 2; $ row <= $ highestRow; ++ $ row){'或addPartner($ row)''中的某處? – 2014-09-26 19:39:10

+0

還沒有。不知道我是否正確使用閱讀器的功能,或者是否有更好的方法來瀏覽表格。這是我第一次使用PHPExcel的經驗,我以別人的方式使用它(這可能是錯誤的) – user3861284 2014-09-26 19:54:25

+0

好吧,通過讀取數據的行循環方式沒有明顯的問題;雖然你的'$ objReader-> setReadFilter(新MyReadFilter());'可以設置加載器忽略某些行 – 2014-09-26 20:09:07

回答

0

我做了一個小函數返回一個正確轉義字符串返回....我的INSERT之前,我調用此函數的兩個字段可能在他們的撇號。然後使用返回的字符串作爲INSERT。我重新執行了我的加載程序,現在所有記錄都正在上傳。感謝您的幫助!

function cleanString($input){ 
    $mysqli = new mysqli(DBHOST, DBUSER, DBPASS, DBNAME);  
    $mysqli->set_charset("utf8"); 
    $output = mysqli_real_escape_string($mysqli, $input); 
    return $output; 
}