Как удалить дублирующиеся строки с PHPExcel

Здравствуйте, дорогие мои спасители,

Несколько дней назад я открыл поток, спрашивая способ поиска / фильтрации строк по значению ячейки с помощью PHPExcel. Разработчик из этого сообщества спас мой день (еще раз спасибо, человек !!!). С тех пор я боролся с другим вопросом.
¿Можно ли удалить все дублирующиеся строки с помощью PHPExcel?
Поставить вас в положение вот мой пример таблицы:

Хочу показать все строки, имеющие «I1 / 027» в своей ячейке (СДЕЛАНО!), Но без повторяющихся строк:

Hours | Place | Name
------|-------|-----------------
3     |I1/027 | example1   //------> Want to add it to my list!!!
6     |I2/025 | example2   //------> Ignore this (no I1/027)
7     |I1/030 | example3   //------> Ignore this (no I1/027)
2     |I1/027 | example4   //------> Want to add it to my list!!!
3     |I1/027 | example1   //------> Don't want this row, it's repeated!!!

И код phpexcel:

  <?php if(isset($_FILES['file']['name'])) { ?>
<!-- Container progress bar -->
<div id="progress" style="width:500px;border:1px solid #ccc;"></div>
<!-- progress info -->
<div id="information" style="width"></div>

<?php require_once 'reader/Classes/PHPExcel/IOFactory.php';
//Extra functions
function get_cell($cell, $objPHPExcel){
//Cell selection
$objCell = ($objPHPExcel->getActiveSheet()->getCell($cell));
//taking cell value
return $objCell->getvalue();
}
function pp(&$var){
$var = chr(ord($var)+1);
return true;
}
//==========Displaying Code
$name     = $_FILES['file']['name'];
$tname    = $_FILES['file']['tmp_name'];
$type     = $_FILES['file']['type'];

if($type == 'application/vnd.ms-excel')
{ // excel 97 extension
$ext = 'xls';
}
else if($type == 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet')
{ // excel 2007 and 2010 extensions
$ext = 'xlsx';
}else
{ // invalid extension
echo -1;
exit();
}
$xlsx = 'Excel2007';
$xls  = 'Excel5';

//read creator
$objReader = PHPExcel_IOFactory::createReader($$ext);
//loading
$objPHPExcel = $objReader->load($tname);

$dim = $objPHPExcel->getActiveSheet()->calculateWorksheetDimension();
// put $start and $end array
list($start, $end) = explode(':', $dim);

if(!preg_match('#([A-Z]+)([0-9]+)#', $start, $rslt)){
return false;
}
list($start, $start_h, $start_v) = $rslt;
if(!preg_match('#([A-Z]+)([0-9]+)#', $end, $rslt)){
return false;
}
list($end, $end_h, $end_v) = $rslt;

//starting to read excel doc
$table = "<table class='tabla'>";
for($v=$start_v; $v<=$end_v; $v++){
// calculate progress bar
$percent = intval($v/$end_v * 100)."%";
// progress bar update
echo '<script language="javascript">
document.getElementById("progress").innerHTML="<div style=\"width:'.$percent.';background-color:#ddd;\">&nbsp;'.$percent.'</div>";
document.getElementById("information").innerHTML="'.$v.' files processed.";</script>';

// buffer flush
echo str_repeat(' ',1024*64);
// send exit to navigator
flush();
sleep(0.25);

//horizontal reading
$tempRow= "<tr>";
$contentFound=false;

for($h=$start_h; ord($h)<=ord($end_h); pp($h)){
$cellValue = get_cell($h.$v, $objPHPExcel);
$tempRow.= "<td>";
if($cellValue !== null){
if($cellValue=="I1/027") $contentFound=true;
$tempRow.= $cellValue;
}
$tempRow.= "</td>";
}
$tempRow.= "</tr>";

if($contentFound) $table.=$tempRow;
}
// process completed
echo '<script language="javascript">document.getElementById("information").innerHTML="Process completed"</script><br>';
echo $table;
}?>

Нашел эту функцию я пытаюсь эксплуатировать, но без удачи:

function removeDuplicates($inputFileName, $objPHPExcel) {
$worksheet = $objPHPExcel->getActiveSheet();
$urn = array();

foreach ($worksheet->getRowIterator() as $row) {
$rowIndex = $row->getRowIndex();
$cellValue = $worksheet->getCell('A'.$rowIndex)->getValue();
array_push($urn, $cellValue);
}
$numberOfURNs = count($urn);

for ($rowIndex = $numberOfURNs; $rowIndex != 1; $rowIndex--) {
$cellValue = $worksheet->getCell('A'.$rowIndex)->getValue();

for ($i = $rowIndex - 2; $i != 0; $i--) {
if ($urn[$i] == $cellValue) {
$worksheet->removeRow($rowIndex);
$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'CSV');
$objWriter->save($inputFileName);
break;
}
}
}
return $objPHPExcel = checkExtension($inputFileName);
}

Заранее большое спасибо!!

1

Решение

Есть несколько решений. Все они имеют некоторые недостатки. Вы можете сравнить все строки со всеми строками в файле Excel, что означает, что вам нужно пройти весь файл для каждой строки. Если у вас 1000 строк, это 1000 * 1000 сравнений. Время выполнения равно O (n ^ 2), если вы знакомы с этой нотацией, что в основном означает, что она станет медленной, как ад, если количество строк увеличится.

Вы можете прочитать все значения в массив массивов и позволить PHP делать сложные вещи, используя array_unique. Пример использования его с многомерными массивами представлен в документах PHP. Это работает путем сериализации внутреннего массива, затем с помощью array_unqie и повторной десериализации. Я не знаю, как реализованы функции массива в PHP, но сериализация / десериализация, вероятно, занимает много времени. Кроме того, все значения присутствуют в памяти, что может стать проблемой, если ваши файлы Excel довольно большие.

Третья возможность, которую я могу изобразить, — это вставить все данные в базу данных, а затем позволить базе данных выполнить проверку на наличие дубликатов с помощью отдельного ключевого слова. Поэтому просто импортируйте его в таблицу импорта, а затем используйте оператор вставки из выбора, чтобы вставить его в правильную таблицу без дубликатов. После этого снова удалите содержимое таблицы импорта. Я думаю, что это было бы моим предпочтительным решением, если данные все равно должны быть вставлены в базу данных.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]