У меня есть страница с множеством флажков (+ - 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 и т. Д.)