在phpspreadsheet库中动态导出图形

时间:2019-02-25 11:59:17

标签: php excel phpexcel phpspreadsheet

我的页面上有很多复选框(+-40),每个复选框代表一个用户可以导出到Excel的图形(为此,我使用phpspreadsheet库)。

某些图形将是带有1条线的线图,其他图形将具有多条线,将有饼图,列表,...各种图形和数据。

请务必注意,我的导出工作表将包含不同的工作表,每个类别一个,仅包含图形。还有1个“数据”标签,其中包含在单个标签中导出的每个图形的原始数据(无论类别如何)。

我坚持要动态定义导出的每个图形的标签和数据。由于我不希望有太多的空格(例如,当我对每个图形进行硬编码时,他在Excel工作表中的位置都是自己的,而用户决定仅导出最后一个图形,因此我希望将其显示在最左侧,而不是全部显示在末尾有很多空白)。

我决定用固定的列跨度预先定义范围,以便我可以容纳这些图中的最小数据集,但也可以容纳最大数据集,因为有些数据集有2列,而另一些数据集则有4或5列。 (这不是理想的方法,但是我不确定如何使范围也变得动态)。

我将用代码示例进行解释:

我定义了2个变量,它们指示所有范围。

    //Graphs are placed on category sheets, so we don't need more than 8 graphs per sheet
        $graphColumns = [
             'A2:H15', 'J2:Q15', 'A17:H30',
             'J17:Q30', 'S2:Z15', 'AB2:AI15',
             'S17:Z30', 'AB17:AI30'
        ];
        //All raw data for each graph (+- 40 now) will be exported to the raw data sheet
        $dataColumns = [
             'A3', 'G3', 'M3', 'S3', 'Y3', 'AE3', 'AK3', 'AQ3',
             'AW3', 'BC3', 'BI3', 'BO3', 'BU3', 'CA3', 'CG3', 'CM3',
             'CS3', 'CY3', 'DE3', 'DK3', 'DQ3', 'DW3', 'EC3', 'EI3',
             'EO3', 'EU3', 'FA3', 'FG3', 'FM3', 'FS3', 'FY3', 'GE3'
        ];

这时,我创建了所有工作表(每个类别一个,原始数据一个)。

然后我为要导出的每个图调用一个函数,如下所示:

drawAmountNewVacancies($vacanciesSheet, $rawDataSheet, $result, array_shift($graphColumns), array_shift($dataColumns));

$vacanciesSheet包含对需要在其中插入图形的工作表的引用,$rawDataSheet包含对我要插入原​​始数据的工作表的引用,$result是数据库查询的结果(包含我要插入的原始数据),然后获取graphColumnsdataColumns数组的第一个元素,并确保它不能被另一个函数调用使用不再需要,因为array_shift删除了它们。

对于这个特定的图形,我知道我将有2列,一列包含日期,一列包含总额。

因此,我创建了一个多维数组,并将其插入位置array_shift($dataColumns)(在此示例中为A3),如下所示:

$rawDataArray = [];
    $rawDataArray[0][0] = '';
    $rawDataArray[0][1] = 'Totaal';
    $i = 1;
    foreach ($queryResult as $res) {
        $rawDataArray[$i][0] = $res->date;
        $rawDataArray[$i][1] = (int)$res->total_amount;
        $i++;
    }

    $datasheet->fromArray(
        $rawDataArray,
        '',
        $dataColumn
    );

这将按我的意愿很好地插入数据,在这一点上,为了制作线图,我需要定义dataSeriesLabelsxAxisTickValuesdataSeriesValues

这就是我被困住的地方。

为了创建图形,我需要定义几个变量,如下所示:

$dataSeriesLabels = [
        new DataSeriesValues(DataSeriesValues::DATASERIES_TYPE_STRING, 'Ruwe data!$B$3', null, 1)
    ];
    $xAxisTickValues = [
        new DataSeriesValues(DataSeriesValues::DATASERIES_TYPE_STRING, 'Vacatures!$A$3:$A$55', null, 4)
    ];
    $dataSeriesValues = [
        new DataSeriesValues(DataSeriesValues::DATASERIES_TYPE_NUMBER, 'Vacatures!$B$3:$B$55', null, 4)
    ];

如何告诉图书馆在哪里寻找数据?由于我只有一个预先确定的起点(A3)(并用fromArray插入),所以我没有B列的上下文(可能还有C,D等)

0 个答案:

没有答案