如何使用PHPExcel删除重复的行
How to delete duplicated rows with 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;'"> '.$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);
}
提前感谢!!
有多种解决方案。它们都有一些缺点。您可以将所有行与excel文件中的所有行进行比较,这意味着您需要遍历每一行的整个文件。如果有1000行,则为1000*1000个比较。如果你熟悉这个符号,运行时是O(n^2),这基本上意味着如果你的行数增加,它会变得非常慢。
您可以将所有的值读取到一个数组中,并让PHP使用array_unique来完成困难的工作。PHP文档中提供了一个将其用于多维数组的示例。它的工作方式是序列化内部数组,然后使用array_unqie并再次反序列化。我不知道PHP中的数组函数是如何实现的,但序列化/反序列化可能需要很多时间。此外,所有的值都存在于内存中,如果Excel文件很大,这可能会成为一个问题。
我可以想象的第三种可能性是将所有数据插入数据库,然后让数据库使用distinct关键字进行重复检查。因此,只需将其导入到导入表中,然后使用insert-from-select语句将其插入到正确的表中,而不重复。然后再次删除导入表的内容。如果数据无论如何都必须插入数据库中,我认为这将是我首选的解决方案
相关文章:
- 删除“;使用javascript从pentaho中的一列中选择“[”
- 如何删除不使用getElementById的特定元素
- 删除除使用 jQuery 单击的列表项之外的所有其他列表项
- 浏览器如何删除不再使用的本地存储
- 从页面中删除未使用的 css 和 javascript
- 删除未使用资产的繁重任务、脚本或应用程序
- HTML 正文加载函数需要删除并使用 cookie 执行相同的函数,但只能进行第一次访问
- 从 JavaScript 文件中删除未使用的函数
- 如何从格式化为“0”的日期中删除未使用的零;0d 0h 23m 4s”;
- 级联删除无法使用Breeze
- 如何使用Babel删除未使用的自引用绑定
- 强制typescript不要删除未使用的引用
- 这只会删除表中的第一行.我希望它删除我使用jQuery和html单击的任何行
- 删除要使用Jquery输入的文本光标
- 如何在会话中删除项目使用javascript的编码器
- 如何添加/删除类使用子弹和箭头
- Angular-如何从DOM中删除我使用$compile的元素
- 如何从包含
的文本中删除星号(*)使用jquery - 使用JSON回复从列表中删除,使用jQuery
- 如何删除数据库使用数组方法DELETE