我的页面上有很多复选框(+-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
是数据库查询的结果(包含我要插入的原始数据),然后获取graphColumns
和dataColumns
数组的第一个元素,并确保它不能被另一个函数调用使用不再需要,因为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
);
这将按我的意愿很好地插入数据,在这一点上,为了制作线图,我需要定义dataSeriesLabels
,xAxisTickValues
和dataSeriesValues
。
这就是我被困住的地方。
为了创建图形,我需要定义几个变量,如下所示:
$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等)