PHPExcel 读取电子表格文件的高级选项详解
PHPExcel ARCHIVED 项目地址: https://gitcode.com/gh_mirrors/ph/PHPExcel
前言
在使用 PHPExcel 处理电子表格文件时,读取操作是最基础也是最重要的环节之一。本文将深入探讨 PHPExcel 提供的各种读取选项,帮助开发者根据实际需求灵活配置读取行为,提升处理效率和精确度。
一、仅读取单元格数据
1.1 功能说明
当只需要获取单元格的值而不关心格式信息时,可以使用 setReadDataOnly(true)
方法。这种方法能显著减少内存消耗,特别适合处理大型文件。
$objReader = PHPExcel_IOFactory::createReader('Excel5');
$objReader->setReadDataOnly(true);
$objPHPExcel = $objReader->load('example.xls');
1.2 注意事项
- 日期/时间处理:Excel 将日期存储为数值,仅通过格式掩码区分。在只读数据模式下,这些格式信息不会被读取,导致日期可能被误认为普通数字。
- Gnumeric 特殊处理:Gnumeric 读取器会额外读取日期格式掩码,这是与其他读取器的不同之处。
1.3 支持情况
| 读取器类型 | 支持 | 读取器类型 | 支持 | |--------------|------|--------------|------| | Excel2007 | 是 | Excel5 | 是 | | Excel2003XML | 是 | OOCalc | 是 | | SYLK | 否 | Gnumeric | 是 | | CSV | 否 | HTML | 否 |
二、选择性读取工作表
2.1 读取单个工作表
$objReader->setLoadSheetsOnly('Sheet1');
2.2 读取多个工作表
$objReader->setLoadSheetsOnly(['Sheet1', 'Sheet3']);
2.3 重置为读取全部
$objReader->setLoadAllSheets();
2.4 支持情况
与"仅读取数据"的支持矩阵相同。
三、高级读取过滤器
3.1 基础实现
创建实现 PHPExcel_Reader_IReadFilter
接口的类:
class MyReadFilter implements PHPExcel_Reader_IReadFilter {
public function readCell($column, $row, $worksheetName = '') {
return ($row >= 1 && $row <= 10) &&
in_array($column, range('A','D'));
}
}
3.2 通用实现
更灵活的过滤器实现:
class RangeReadFilter implements PHPExcel_Reader_IReadFilter {
private $startRow, $endRow, $columns;
public function __construct($startRow, $endRow, $columns) {
$this->startRow = $startRow;
$this->endRow = $endRow;
$this->columns = $columns;
}
public function readCell($column, $row, $worksheetName = '') {
return ($row >= $this->startRow && $row <= $this->endRow) &&
in_array($column, $this->columns);
}
}
3.3 分块读取大文件
内存优化方案:
class ChunkReadFilter implements PHPExcel_Reader_IReadFilter {
private $startRow, $endRow;
public function setRows($startRow, $chunkSize) {
$this->startRow = $startRow;
$this->endRow = $startRow + $chunkSize;
}
public function readCell($column, $row, $worksheetName = '') {
return ($row == 1) || ($row >= $this->startRow && $row < $this->endRow);
}
}
// 使用示例
$chunkSize = 2048;
$filter = new ChunkReadFilter();
$objReader->setReadFilter($filter);
for ($startRow = 2; $startRow <= 65536; $startRow += $chunkSize) {
$filter->setRows($startRow, $chunkSize);
$objPHPExcel = $objReader->load($inputFileName);
// 处理数据...
}
3.4 支持情况
SYLK 和 HTML 读取器不支持此功能,其余均支持。
四、合并多个文件
4.1 实现方法
$objReader->setSheetIndex(0);
$objPHPExcel = $objReader->load($file1);
$objReader->setSheetIndex(1);
$objReader->loadIntoExisting($file2, $objPHPExcel);
4.2 注意事项
- CSV 文件不能合并到同一工作表
- 相同索引会覆盖而非追加
4.3 支持情况
仅 SYLK 和 CSV 读取器支持此功能。
五、处理大CSV文件
5.1 分工作表存储
$chunkSize = 65530;
$sheet = 0;
for ($startRow = 2; $startRow <= 1000000; $startRow += $chunkSize) {
$filter->setRows($startRow, $chunkSize);
$objReader->setSheetIndex($sheet++);
$objReader->loadIntoExisting($inputFileName, $objPHPExcel);
$objPHPExcel->getActiveSheet()->setTitle('Chunk #'.$sheet);
}
5.2 连续模式
setContiguous(true)
影响单元格定位方式,建议根据需求选择。
六、特殊分隔符文件
6.1 配置方法
$objReader->setDelimiter("\t"); // Tab分隔
$objReader->setDelimiter("|"); // 竖线分隔
6.2 其他设置
$objReader->setEnclosure('"');
$objReader->setLineEnding("\r\n");
$objReader->setInputEncoding('UTF-8');
七、高级值绑定器
7.1 功能说明
自动识别并转换特殊格式数据:
- 日期/时间 → Excel时间戳
- "TRUE"/"FALSE" → 布尔值
- "75%" → 百分比
- 科学计数法 → 浮点数
7.2 实现原理
通过实现 PHPExcel_Cell_IValueBinder
接口,在读取过程中对原始值进行智能转换。
结语
PHPExcel 提供了丰富的读取配置选项,开发者可以根据实际场景组合使用这些功能,在数据处理效率、内存消耗和功能需求之间找到最佳平衡点。特别是在处理大型文件时,合理使用读取过滤器和分块读取技术可以显著提升性能。
PHPExcel ARCHIVED 项目地址: https://gitcode.com/gh_mirrors/ph/PHPExcel
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考