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

如何使用PHPSpreadSheet基于带货币格式的数据绘制图表?

解决PhpSpreadSheet读取带货币符号数据生成图表的问题

问题核心在于:Excel中带$符号的单元格内容默认是文本格式,而非数值格式,PhpSpreadSheet的DATASERIES_TYPE_NUMBER只识别数值类型数据,所以直接引用会失败。需要先将文本格式的货币数据转换为数值格式,再生成图表。

解决方案步骤

  • 遍历目标单元格,提取纯数字内容(去除$符号,替换逗号为小数点适配浮点转换)
  • 将转换后的数值写回单元格,并设置对应的货币格式
  • 基于转换后的数值单元格生成图表数据系列

修改后的完整代码示例

$toLoad = 'test.xlsx';
$loaded = IOFactory::load($toLoad);
$worksheet = $loaded->getSheetByName('test');

// 处理A列的货币文本,转换为数值
$highestRow = $worksheet->getHighestRow();
for ($row = 1; $row <= $highestRow; $row++) {
    $cell = $worksheet->getCell('A' . $row);
    $cellValue = $cell->getValue();
    
    // 去除$符号,替换逗号为小数点(适配欧洲小数格式)
    $numericValue = str_replace(['$', ','], ['', '.'], $cellValue);
    // 转换为浮点数值
    $numericValue = (float)$numericValue;
    
    // 将数值写回单元格,并设置货币格式
    $cell->setValue($numericValue);
    $cell->getStyle()->getNumberFormat()->setFormatCode(StyleNumberFormat::FORMAT_CURRENCY_USD_SIMPLE);
}

// 处理B列同理(如果需要)
for ($row = 1; $row <= $highestRow; $row++) {
    $cell = $worksheet->getCell('B' . $row);
    $cellValue = $cell->getValue();
    $numericValue = str_replace(['$', ','], ['', '.'], $cellValue);
    $numericValue = (float)$numericValue;
    $cell->setValue($numericValue);
    $cell->getStyle()->getNumberFormat()->setFormatCode(StyleNumberFormat::FORMAT_CURRENCY_USD_SIMPLE);
}

// 现在可以正常生成数据系列
$dataSeriesValues1 = [
    new DataSeriesValues(StyleNumberFormat::DATASERIES_TYPE_NUMBER, 'test!$A$1:$A$2', null, 2),
];

// 后续图表生成代码...
$writer = new Xlsx($loaded);
// $writer->save(...);

关键说明

  • 仅设置单元格格式(如FORMAT_ACCOUNTING_EUR)无法解决问题,因为底层数据还是文本类型,必须先将内容转换为数值
  • 若你的Excel使用的是其他小数分隔符(如点),只需调整str_replace中的替换规则即可

内容的提问来源于stack exchange,提问作者user14402059

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 09:32:39