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]."')");
}
}
那麼你有什麼樣的調試方法來查看行丟失的位置?是否在for($ row = 2; $ row <= $ highestRow; ++ $ row){'或addPartner($ row)''中的某處? – 2014-09-26 19:39:10
還沒有。不知道我是否正確使用閱讀器的功能,或者是否有更好的方法來瀏覽表格。這是我第一次使用PHPExcel的經驗,我以別人的方式使用它(這可能是錯誤的) – user3861284 2014-09-26 19:54:25
好吧,通過讀取數據的行循環方式沒有明顯的問題;雖然你的'$ objReader-> setReadFilter(新MyReadFilter());'可以設置加載器忽略某些行 – 2014-09-26 20:09:07