Динамический экспорт графиков в библиотеку phpspreadsheet - PullRequest
0 голосов
/ 25 февраля 2019

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...