在phpspreadsheet库中动态导出图形
我有一个带有许多复选框(+-40)的页面,每个复选框代表一个用户可以导出到Excel的图形(我使用PHPSReadSheet库进行此操作) 有些图将是带有一条线的线图,其他图将有多条线,将有饼图、列表。。。各种图形和数据 需要注意的是,我的导出工作表将包含不同的工作表,每个类别一个工作表,其中只包含图形。和1个“数据”选项卡,其中将包含在单个选项卡中导出的每个图形的原始数据(不考虑类别) 我一直在为每个导出的图形动态定义标签和数据。因为我不需要太多的空白(例如,当我硬编码每个图形在Excel工作表中的位置,并且用户决定只导出最后一个图形时,我希望它显示在最左边,而不是完全显示在最后,之前有很多空白) 我决定使用固定的列跨度预先定义范围,这样我就可以容纳这些图中最小但也是最大的数据集,因为有些数据集将有2列,而其他数据集将有4或5列。(这并不理想,但我不确定如何使范围也具有动态性) 我将用代码示例解释: 我定义了两个变量,它们表示所有变量的范围在phpspreadsheet库中动态导出图形,php,excel,phpexcel,phpspreadsheet,Php,Excel,Phpexcel,Phpspreadsheet,我有一个带有许多复选框(+-40)的页面,每个复选框代表一个用户可以导出到Excel的图形(我使用PHPSReadSheet库进行此操作) 有些图将是带有一条线的线图,其他图将有多条线,将有饼图、列表。。。各种图形和数据 需要注意的是,我的导出工作表将包含不同的工作表,每个类别一个工作表,其中只包含图形。和1个“数据”选项卡,其中将包含在单个选项卡中导出的每个图形的原始数据(不考虑类别) 我一直在为每个导出的图形动态定义标签和数据。因为我不需要太多的空白(例如,当我硬编码每个图形在Excel工作
//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));
$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
);
$vacancessheet
包含对需要插入图形的工作表的引用,$rawDataSheet
包含对我要插入原始数据的工作表的引用,$result
是我的数据库查询的结果(包含我要插入的原始数据),然后取graphColumns
和dataColumns
数组的第一个元素,确保它不能再被另一个函数调用使用,因为array\u shift会删除它们
对于这个特定的图表,我知道我将有两列,一列包含日期,另一列包含总金额
因此,我创建了一个多维数组,并将其插入位置array\u shift($dataColumns)
(本例中为A3),如下所示:
drawAmountNewVacancies($vacanciesSheet, $rawDataSheet, $result, array_shift($graphColumns), array_shift($dataColumns));
$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)(并用数组中的插入),因此我没有B列的上下文(可能还有C、D等)