如何使用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
相关产品推荐
相关产品推荐

