如何用PhpSpreadsheet修改模板文件中图表的数据源
解决PhpSpreadsheet图表数据源修改及
getDataSource()报错问题 错误原因说明
getDataSource()是DataSeriesValues类的专属方法,不能直接在Chart对象上调用——这就是你触发"undefined method"错误的核心原因。要修改图表数据源,你需要先获取图表关联的数据系列,再遍历其中的DataSeriesValues实例进行调整。
具体实现步骤
1. 遍历图表数据系列,修改数据源范围
假设你已经正确定位到标题为Chart_12的$chart对象,按以下代码修改数据源:
use PhpOffice\PhpSpreadsheet\Chart\DataSeriesValues; // 获取图表绘图区域 $plotArea = $chart->getPlotArea(); // 获取所有数据系列组 $plotGroups = $plotArea->getPlotGroups(); foreach ($plotGroups as $plotGroup) { // 获取当前系列组的数据源 $dataSeries = $plotGroup->getDataSource(); // 获取系列内的所有值对象(包含标题行、数据行) $dataSeriesValues = $dataSeries->getDataSeriesValues(); foreach ($dataSeriesValues as $dsv) { // 根据原数据源范围匹配修改 $currentFormula = $dsv->getFormula(); switch ($currentFormula) { case '=RawData!$A$1:$H$1': $dsv->setFormula('=RawData!$A$1:$M$1'); break; case '=RawData!$A$2:$H$2': $dsv->setFormula('=RawData!$A$2:$M$2'); break; } // 也可通过数据类型判断(标题行通常为字符串,数据行通常为数值) // if ($dsv->getDataType() === DataSeriesValues::DATASERIES_TYPE_STRING) { // $dsv->setFormula('=RawData!$A$1:$M$1'); // } elseif ($dsv->getDataType() === DataSeriesValues::DATASERIES_TYPE_NUMBER) { // $dsv->setFormula('=RawData!$A$2:$M$2'); // } } }
2. 设置图表自动调整尺寸
修改数据源后,可通过以下方式让图表适配新的范围:
// 开启按比例自动调整 $chart->setResizeProportional(true); // 若需要手动按列数比例调整宽度(从8列扩展到13列) $originalWidth = $chart->getWidth(); $chart->setWidth($originalWidth * (13 / 8)); // 高度可保持原比例或按需调整 $chart->setHeight($chart->getHeight());
额外注意事项
- 确保使用最新版本的PhpSpreadsheet,旧版本的Chart API可能存在差异
- 若图表包含多个数据系列,需确保遍历所有相关的
DataSeriesValues对象 - 修改完成后,务必通过正确的Writer类保存Excel文件(如
XlsxWriter)
内容的提问来源于stack exchange,提问作者rolinger
相关产品推荐
相关产品推荐

