如何更改使用phpexcel生成的折线图的样式?

时间:2015-09-24 14:27:49

标签: php phpexcel

我正在使用Github library中的示例生成折线图。

我想要的是为图表中的每一行设置几个自定义样式的选项,就像我们在excel表中手动执行一样:

在图表中选择Line,格式化数据系列,然后:

  • 标记选项>无
  • 线型>宽度> 2.5pt(默认为1pt)
  • 线型>平滑线

如何为折线图中生成的线设置以上三个选项? 到目前为止,这是我的代码,用于设置图表的布局和数据系列:

$series = new PHPExcel_Chart_DataSeries(
        PHPExcel_Chart_DataSeries::TYPE_LINECHART,
        PHPExcel_Chart_DataSeries::GROUPING_STANDARD,
        range(0, count($dataSeriesValues)-1),       
        $dataseriesLabels,                          
        $xAxisTickValues,                           
        $dataSeriesValues                       
    );

    $layout1 = new PHPExcel_Chart_Layout();
    $layout1->setShowVal(TRUE);

    $plotarea = new PHPExcel_Chart_PlotArea($layout1, array($series));

有人可以提供提示,因为我在示例中找不到它。

2 个答案:

答案 0 :(得分:8)

第一个问题是标记选项>无

在第287行的文件PHPExcel/Chart/Renderer/jpgraph.php中:

$marker = $this->_chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotValuesByIndex($i)->getPointMarker();

将其更改为

$marker = 'none';

要删除标记,请注意这是一个 hacky 修复,通常它会循环所有标记,并且工具中没有自行设置标记的功能。 (这就是为什么你在例子中找不到它)

您还可以在Excel2007/Chart.php line 792删除或修改代码,在这里您可以看到if ($plotSeriesMarker)代码,将其更改为"none"或只删除此部分。< / p>

关于第二个问题:线型&gt;宽度&gt; 2.5pt(默认为1pt)

在文件PHPExcel/Writer/Excel2007/Chart.php中 在函数_writePlotGroup的{​​{3}}处,您可以看到行绘图代码

if ($groupType == PHPExcel_Chart_DataSeries::TYPE_LINECHART) {
    $objWriter->startElement('c:spPr');
        $objWriter->startElement('a:ln');
            $objWriter->writeAttribute('w', 12700);
        $objWriter->endElement();
    $objWriter->endElement();
}

您可以在此处使用例如:

更改宽度
$objWriter->writeAttribute('w', '40000'); 

对于您的第三个问题:线型&gt;平滑线

PHPExcel_Chart_DataSeries的构造函数是

/**
* Create a new PHPExcel_Chart_DataSeries
*/
public function __construct($plotType = null, $plotGrouping = null, $plotOrder = array(), $plotLabel = array(), $plotCategory = array(), $plotValues = array(), $smoothLine = null, $plotStyle = null)

因此,在$dataSeriesValues之后,您可以定义smoothlineplotStyle值。
true传递给smoothline参数可为您提供流畅的线条样式。

如果由于某种原因无效,可以在Chart.php上找到line 781

$objWriter->writeAttribute('val', (integer) $plotGroup->getSmoothLine() );

将此更改为

$objWriter->writeAttribute('val', 1 );

它应该可以肯定。

答案 1 :(得分:2)

在此回复时解决您的第一个问题;标记选项&gt;无很简单,不涉及修改基本代码。创建$dataSeriesValues个对象(第86行)时,您可以定义所需的标记类型或“无”。

$dataSeriesValues = array(
new PHPExcel_Chart_DataSeriesValues('Number', 'Worksheet!$B$2:$B$5', null, 4, array(), 'none'),
new PHPExcel_Chart_DataSeriesValues('Number', 'Worksheet!$C$2:$C$5', null, 4, array(), 'none'),
new PHPExcel_Chart_DataSeriesValues('Number', 'Worksheet!$D$2:$D$5', null, 4, array(), 'none'),
);