You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 04:15:02