PHPExcel跳过Excel行

时间:2014-09-26 18:28:11

标签: php phpexcel

我已经使用了PHPExcel,但我发现在Excel电子表格中阅读时似乎跳过了一些行。我有一个11857行的文件,看起来只有11814被读取 - 很多人被处理写入数据库。程序运行时我没有收到任何错误。我写了第二个程序,再次读取Excel,并查找数据库中的每一行....缺少的48行,第二个检查程序找到25.我想知道是否有更好的方法这样我就得到了所有记录?它似乎也发生在一个大约有4,000行的文件中(我认为这可能是由于大小)。我只想要某些字段,所以我通过读取第一行找到它们的列位置,然后浏览文件的其余部分并将这些字段写入数据库(除非它已经在那里)。有些输入没有Id,所以如果没有提供ID,我会查找名称。我的代码如下:

$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]."' )");       
    }
}

1 个答案:

答案 0 :(得分: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;
}