Я немного использовал PHPExcel, но обнаружил, что он пропускает некоторые строки при чтении в электронной таблице Excel. У меня есть файл со 11857 строками, и кажется, что только 11814 были прочитаны — хорошо, что многие были обработаны для записи в базу данных. Я не получаю никаких ошибок при запуске моей программы. Я написал вторую программу, чтобы снова прочитать Excel и найти каждую строку в базе данных …. из 48 пропущенных строк вторая программа проверки нашла 25. Мне интересно, есть ли лучший способ сделать это? это так я получаю все записи? Кажется, это также происходит с файлом, содержащим около 4000 строк (я подумал, что это могло быть из-за размера). Мне нужны только определенные поля, поэтому я нахожу их положение в столбце, читая первую строку, затем просматриваю оставшуюся часть файла и записываю эти поля в базу данных (если она там еще не существует). У некоторых входных данных нет идентификатора, поэтому я ищу имя, если идентификатор не указан. Мой код ниже:
$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]."' )");
}
}
Я сделал небольшую функцию для возврата правильно экранированной строки … перед вставкой я вызываю эту функцию для двух полей, которые могут содержать апостроф. Затем используйте возвращенные строки для вставки. Я перезапустил свою загрузочную программу, и теперь ВСЕ записи загружаются. Спасибо за помощь!
function cleanString($input){
$mysqli = new mysqli(DBHOST, DBUSER, DBPASS, DBNAME);
$mysqli->set_charset("utf8");
$output = mysqli_real_escape_string($mysqli, $input);
return $output;
}
Других решений пока нет …