使用Laravel Excel Import导入.ods文件如何获取价格数值与货币符号?
Laravel Excel导入.ods文件同时获取价格数值与货币符号的可行方案
问题核心原因:.ods文件里的货币符号属于单元格格式渲染属性,并非单元格存储的原始数值,Laravel Excel默认只会读取单元格的原始存储值,所以会丢失货币符号,可通过以下方案解决:
- 方案1:自定义值绑定器读取格式化后的单元格内容
Laravel Excel底层依赖PhpSpreadsheet处理电子表格,你可以在Import类中关闭默认的值格式化,直接读取单元格渲染后的完整文本,代码示例:
// 在你的Import类中添加以下逻辑 use PhpOffice\PhpSpreadsheet\Cell\Cell; use Maatwebsite\Excel\Concerns\ToModel; use Maatwebsite\Excel\Concerns\WithCustomValueBinder; use PhpOffice\PhpSpreadsheet\Cell\DefaultValueBinder; class PriceImport extends DefaultValueBinder implements ToModel, WithCustomValueBinder { public function model(array $row) { // 此时row里的价格列已经是带货币符号的完整字符串,比如 "$129.99" $priceText = $row[/* 替换为价格列的对应索引 */]; // 拆分数值和货币符号 preg_match('/([^\d,.]+)?([\d,.]+)/', $priceText, $matches); $currencySymbol = $matches[1] ?? ''; $priceValue = (float)str_replace(',', '', $matches[2] ?? 0); return new YourModel([ 'price' => $priceValue, 'currency' => $currencySymbol, ]); } // 重写绑定逻辑,读取格式化后的值 public function bindValue(Cell $cell, $value) { if ($cell->getColumn() === 'A') { // 替换为你的价格列对应列号 $formattedValue = $cell->getFormattedValue(); $cell->setValue($formattedValue); return true; } return parent::bindValue($cell, $value); } }
- 方案2:提前转换.ods价格列为文本格式
如果文件数量不多,可以手动在Office软件中打开.ods文件,选中价格列,将单元格格式从「货币」修改为「文本」,此时货币符号会直接成为单元格内容的一部分,导入时直接读取原始值即可拿到完整内容,不需要修改代码。 - 方案3:预设货币映射规则拼接
如果你的业务中货币类型是固定的、或者文件中存在单独的货币标识列,可以直接读取价格数值后,根据对应规则拼接货币符号,这种方式性能最高、兼容性最好,不需要依赖电子表格的格式读取能力。
注意事项
使用方案1时需要注意:部分版本的PhpSpreadsheet对.ods格式的自定义格式读取存在兼容问题,如果读取结果不符合预期,可以先升级
phpoffice/phpspreadsheet依赖到最新稳定版再测试。
内容的提问来源于stack exchange,提问作者Harry
相关产品推荐
相关产品推荐

