我已经使用了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]."' )");
}
}
答案 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;
}