PHPExcel: график работает в LibreOffice, но не в Excel


В настоящее время я использую PHPExcel (v1.8.0) для создания файла xlxs с данными и графом.

Он хорошо работает, когда я открываю файл на LibreOffice, но в Excel он выдает и ошибку : "Excel нашел нечитаемое содержимое .. "

Когда я "восстанавливаю" файл в Excel, у меня есть мои данные, но не диаграмма, и это сообщение : "удалена часть: /xl/чертежи/drawing1.xml часть. (Рисунок формы)"

Странный факт: когда я сохраняю как .xls из LibreOffice, Я могу прочитать файл с диаграммой в Excel.

Вы можете скачать пример файла на моем DropBox: скачать здесь

Вот весь код для генерации my *.xlsx файл:

<?php

require_once('PHPExcel.php');


/* increments $nb times a column letter */
function getCol($col, $nb) {
    for ($i = 0; $i < $nb; $i++) {
        $col++;
    }
    return $col;
}

$objPHPExcel = new PHPExcel();
$objWorksheet = $objPHPExcel->getActiveSheet();

$sheetlabels = array("Groupe d'activité", "Données réelles", "Données simulées");
$sheetdatas = array();
$sheetdatas[] = array_map("utf8_encode", $sheetlabels);
foreach ($groups as $k => $group) {
    $sheetdatas[] = array($group, $data_real[$k]*1, $data_simulated[$k]*1);
}
$sheetdatas[] = array("Total", $total_real*1, $total_simulated*1);


$nbdatas = count($groups);
$startCol = 'B';
$startLine = 25;

$objWorksheet->fromArray($sheetdatas, null, ($startCol . $startLine));

$endCol = getCol($startCol, count($sheetlabels)-1);
foreach(range($startCol, $endCol) as $columnID) {
    $objWorksheet->getColumnDimension($columnID)->setAutoSize(true);
}

$currentLine = $startLine + count($groups) +1;
$objWorksheet->getStyle($startCol . $currentLine . ':' . $endCol . $currentLine)->getFont()->setBold(true);

$styleArray = array(
    'borders' => array(
        'allborders' => array(
            'style' => PHPExcel_Style_Border::BORDER_THIN
        ),
    ),
);
$objWorksheet->getStyle($startCol . $startLine . ':' . $endCol . $currentLine)->applyFromArray($styleArray);


$currentCol = getCol($startCol, 1);
$currentLine = $startLine + 1;
$endLine = $startLine + count($groups) + 1;
$objWorksheet->getStyle($currentCol . $currentLine . ':' . $endCol . $endLine)->getNumberFormat()->setFormatCode('# ##0.00');

$currentCol = $startCol;
$dataSeriesLabels = array(
    new PHPExcel_Chart_DataSeriesValues('String', 'Worksheet!$' . (++$currentCol) . '$' . $startLine, NULL, 1), //  Données réelles
    new PHPExcel_Chart_DataSeriesValues('String', 'Worksheet!$' . (++$currentCol) . '$' . $startLine, NULL, 1)  //  Données simulées
);

$currentLine = $startLine + 1;
$xAxisTickValues = array(
    new PHPExcel_Chart_DataSeriesValues('String', 'Worksheet!$' . $startCol . '$' . $currentLine . ':$' . $startCol . '$' . ($currentLine + $nbdatas - 1), NULL, $nbdatas)  //  Tous les groups
);

$dataSeriesValues = array();
$currentCol = $startCol;
$currentLine = $startLine + 1;
foreach ($sheetlabels as $sheetlabel) {
    if ($sheetlabel) {
        $currentCol++;
        $dataSeriesValues[] = new PHPExcel_Chart_DataSeriesValues('Number', 'Worksheet!$' . $currentCol . '$' . $currentLine . ':$' . $currentCol . '$' . ($currentLine + $nbdatas - 1), NULL, $nbdatas);
    }
}

//  Build the dataseries
$series = new PHPExcel_Chart_DataSeries(
    PHPExcel_Chart_DataSeries::TYPE_BARCHART,       // plotType
    PHPExcel_Chart_DataSeries::GROUPING_CLUSTERED,  // plotGrouping
    range(0, count($dataSeriesValues)-1),           // plotOrder
    $dataSeriesLabels,                              // plotLabel
    $xAxisTickValues,                               // plotCategory
    $dataSeriesValues                               // plotValues
);

$plotArea = new PHPExcel_Chart_PlotArea(NULL, array($series));

$legend = new PHPExcel_Chart_Legend(PHPExcel_Chart_Legend::POSITION_RIGHT, NULL, false);
$title = new PHPExcel_Chart_Title('Consolidation ' . utf8_encode($label));

$chart = new PHPExcel_Chart(
    'chart1',       // name
    $title,         // title
    $legend,        // legend
    $plotArea,      // plotArea
    true,           // plotVisibleOnly
    0,              // displayBlanksAs
    NULL,           // xAxisLabel
    $yAxisLabel     // yAxisLabel
);

$chart->setTopLeftPosition('B2');
$chart->setBottomRightPosition('L22');

$objWorksheet->addChart($chart);


$filename = "export_" . $indicator_id . "_" . $date . ".xlsx";
$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007');
$objWriter->setIncludeCharts(true);
$objWriter->save($dir . '/' . $filename);

?>
Я понятия не имею, где я допустил ошибку в этот момент.

Резолюция

Хорошо, я понял, в чем проблема.

Похоже, что вы должны указать plotDirection, чтобы не иметь проблемы в Excel

$series = new PHPExcel_Chart_DataSeries(
            PHPExcel_Chart_DataSeries::TYPE_BARCHART,       // plotType
            PHPExcel_Chart_DataSeries::GROUPING_CLUSTERED,  // plotGrouping
            range(0, count($dataSeriesValues)-1),           // plotOrder
            $dataSeriesLabels,                              // plotLabel
            $xAxisTickValues,                               // plotCategory
            $dataSeriesValues                               // plotValues
        );
        $series->setPlotDirection(PHPExcel_Chart_DataSeries::DIRECTION_VERTICAL);

I сделал запрос pull к проекту GithHub, чтобы установить значение plotDirection по умолчанию.

1 2

1 ответ:

Разрешение

Хорошо, я понял, в чем проблема.

Похоже, что вы должны указать plotDirection , Чтобы не иметь проблемы в Excel

$series = new PHPExcel_Chart_DataSeries(
            PHPExcel_Chart_DataSeries::TYPE_BARCHART,       // plotType
            PHPExcel_Chart_DataSeries::GROUPING_CLUSTERED,  // plotGrouping
            range(0, count($dataSeriesValues)-1),           // plotOrder
            $dataSeriesLabels,                              // plotLabel
            $xAxisTickValues,                               // plotCategory
            $dataSeriesValues                               // plotValues
        );
        $series->setPlotDirection(PHPExcel_Chart_DataSeries::DIRECTION_VERTICAL);

Я запрос к проекту GithHub установить plotDirection значение по умолчанию.