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