无法使用Import类时,如何通过Maatwebsite Excel获取公式计算结果?
解决Excel公式计算结果无法获取的问题
由于你无法使用Import类和WithCalculatedFormulas特性,可以直接借助Maatwebsite Excel底层依赖的PhpSpreadsheet来实现公式计算,无需依赖自定义Import类。
实现步骤与代码示例
- 直接使用PhpSpreadsheet的IOFactory读取Excel文件,获取Spreadsheet实例
- 启用公式计算缓存(提升性能),然后通过单元格的
getCalculatedValue()方法获取计算结果
use PhpOffice\PhpSpreadsheet\IOFactory; use PhpOffice\PhpSpreadsheet\Calculation\Calculation; // 假设$item是上传的文件对象,先获取文件真实路径 $filePath = $item->getRealPath(); // 加载Excel文件到Spreadsheet实例 $spreadsheet = IOFactory::load($filePath); // 初始化计算实例并启用缓存 $calculation = Calculation::getInstance($spreadsheet); $calculation->enableCalculationCache(); // 获取活动工作表(可根据需求指定工作表名称或索引) $worksheet = $spreadsheet->getActiveSheet(); // 遍历工作表的行与单元格,获取计算后的值 $processedData = []; foreach ($worksheet->getRowIterator() as $row) { $rowData = []; $cellIterator = $row->getCellIterator(); $cellIterator->setIterateOnlyExistingCells(false); // 遍历所有单元格(包括空单元格) foreach ($cellIterator as $cell) { // 获取公式计算后的结果,普通单元格会直接返回原值 $rowData[] = $cell->getCalculatedValue(); } $processedData[] = $rowData; } // 转换为集合(如果需要保持原有的集合操作习惯) $theCollection = collect($processedData);
关键说明
getCalculatedValue()方法会自动区分普通单元格和公式单元格:普通单元格直接返回原始值,公式单元格返回计算后的结果- 如果需要处理多个工作表,可以通过
$spreadsheet->getSheetIterator()遍历所有工作表 - 启用计算缓存可以避免重复计算相同公式,提升大文件处理效率
内容的提问来源于stack exchange,提问作者molly
相关产品推荐
相关产品推荐

