2014-09-26 139 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; 
}