phpoffice读取了excel已经删除的行,我应该如何处理不允许读取到已经删除的行
时间: 2024-01-28 21:04:36 浏览: 119
excel上导入使用的phpoffice包
在使用phpoffice读取excel中的已删除行数据时,可以通过设置读取过滤器来忽略已删除的行数据,具体的处理方法如下:
1.在读取excel文件前,设置读取过滤器:
```
$reader = \PhpOffice\PhpSpreadsheet\IOFactory::createReader($this->file_type);
$reader->setReadEmptyCells(false);
$reader->setReadDataOnly(true);
$reader->setLoadSheetsOnly($this->sheet_name);
$reader->setReadFilter(new MyReadFilter());
$spreadsheet = $reader->load($this->file_path);
```
2.自定义读取过滤器MyReadFilter,判断当前行是否已被删除:
```
use PhpOffice\PhpSpreadsheet\Reader\IReadFilter;
class MyReadFilter implements IReadFilter
{
/**
* @param string $column
* @param int $row
* @param string $worksheetName
* @return bool
*/
public function readCell($column, $row, $worksheetName = '')
{
// 获取当前工作表对象
$worksheet = $this->getWorksheetByName($worksheetName);
// 判断当前行是否已被删除
if (!$worksheet->getRowDimension($row)->getVisible()) {
return false;
}
return true;
}
/**
* 根据工作表名称获取工作表对象
*
* @param string $sheetName 工作表名称
* @return \PhpOffice\PhpSpreadsheet\Worksheet\Worksheet|null
*/
private function getWorksheetByName($sheetName)
{
// 从全局变量中获取工作表列表
global $WORKSHEETS;
$worksheet = null;
// 根据工作表名称查找对应的工作表对象
foreach ($WORKSHEETS as $s) {
if ($s->getTitle() == $sheetName) {
$worksheet = $s;
break;
}
}
return $worksheet;
}
}
```
注意:
- 在自定义的读取过滤器中,需要实现IReadFilter接口,并实现readCell方法;
- 在readCell方法中,通过getRowDimension方法来获取指定行的行维度对象,然后判断行维度对象的visible属性是否为true,如果为false,则说明该行已被删除,返回false,否则返回true;
- 在getWorksheetByName方法中,通过工作表名称来获取对应的工作表对象。在全局变量$WORKSHEETS中保存了所有的工作表对象,可以在读取excel文件时将其保存在该变量中,然后在读取过滤器中使用。
阅读全文