PHPExcel сохранить CSV добавляет веб-страницу HTML, а также - PullRequest
3 голосов
/ 27 июля 2011

У меня есть веб-страница с радиогруппой в качестве параметров для формата файла, который вы хотите сохранить.Варианты:

  • .xls
  • .xlsx
  • .csv

Все работают, кроме .csv, поскольку он также добавляетHTML-страницу внизу файла.

Вот что я пытаюсь (фрагменты кода, чтобы показать функциональность):

// Creating the format
$data = $this->getQueryResults();

$objPHPExcel = new PHPExcel();
$objPHPExcel->getActiveSheet()->setTitle("Report"); 

$objPHPExcel->getProperties()->setCreator("me");     
$objPHPExcel->getProperties()->setLastModifiedBy("me");                 
$objPHPExcel->getProperties()->setSubject("Report Stuff");     
$objPHPExcel->getProperties()->setDescription("Report Stuff");

// Next I iterate through the data array
$objPHPExcel->getActiveSheet()->setCellValue($col.$rowNumber,$cell);
$objPHPExcel->getActiveSheet()->getColumnDimension($col)->setAutoSize(true);

// check the radio option selected for the file format
if($this->radioXLS->Checked) {
    $objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel5');

    header('Content-Type: application/vnd.ms-excel');
    header('Content-Disposition: attachment;filename="'.$excel_name.'.xls"');
    header('Cache-Control: max-age=0');
}

if($this->radioXLSX->Checked) {
    $objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007');

    header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
    header('Content-Disposition: attachment;filename="'.$excel_name.'.xlsx"');
    header('Cache-Control: max-age=0');
}

if($this->radioCSV->Checked) {
    ob_end_clean(); // add/removing this does nothing
    $objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'CSV');
    $objWriter->setDelimiter(',');
    $objWriter->setEnclosure('');
    $objWriter->setLineEnding("\r\n");
    $objWriter->setSheetIndex(0);
    ob_end_clean(); // add/removing this does nothing

    header('Content-Type: text/csv');
    header('Content-Disposition: attachment;filename="'.$excel_name.'.csv"');
    header('Cache-Control: max-age=0');
}

$objWriter->save('php://output');

Любые мысли о том, почему он добавляет страницу HTML кфайл .csv?

Если заметить, это проект Прадо, если это имеет значение

ОБНОВЛЕНИЕ:

Чуть больше ...

Iиметь веб-страницу, которая генерирует отчет в формате таблицы (думаю, таблица / сетка).На той же странице у меня есть возможность сохранить дату в формате табулатуры в Excel .xls (почему-то .xlsx сейчас не работает, тьфу ...).Пользователь может сохранить файл в формате .xls .xlsx .csv, если щелкнуть файл, загруженный с этой страницы.

Это приведет к добавлению уже выведенной веб-страницы в вывод с помощью: php://output?

ОБНОВЛЕНИЕ - Решение:

Да, после просмотра файлов Excel также добавляется веб-страница HTML.Я также посмотрел на функции выходного буфера PHP, но все еще ничего не работает

    while(ob_get_level() > 0) {
        ob_end_clean();
    }

    if($this->radioCSV->Checked) {                        
        header('Content-Type: text/csv');
        header('Content-Disposition: attachment;filename="'.$excel_name.'.csv"');
        header('Cache-Control: max-age=0');

        $objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'CSV');
        $objWriter->setDelimiter(',');
        $objWriter->setEnclosure('');
        $objWriter->setLineEnding("\r\n");
        $objWriter->setSheetIndex(0);
    } elseif($this->radioXLSX->Checked) {
        header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
        header("Cache-Control: no-store, no-cache, must-revalidate");
        header("Cache-Control: post-check=0, pre-check=0", false);
        header("Pragma: no-cache");
        header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
        header('Content-Disposition: attachment;filename="'.$excel_name.'.xlsx"');
        header('Cache-Control: max-age=0');

        $objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007');
    } else {
        header('Content-Type: application/vnd.ms-excel');
        header('Content-Disposition: attachment;filename="'.$excel_name.'.xls"');
        header('Cache-Control: max-age=0');

        $objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel5');
    } 

    $objWriter->save('php://output');
    exit();

Ответы [ 2 ]

5 голосов
/ 27 июля 2011

Запись в php://output точно такая же, как и в простом echo утверждении. Вывод $objWriter->save() будет добавлен ко всему, что повторяется или находится вне блоков PHP (<?php ... ?>).


Пример:

  • Это вправо :

    <?php
    
    $objPHPExcel = new PHPExcel();
    $objPHPExcel->getActiveSheet()->setTitle("Report"); 
    // ...
    $objWriter->save('php://output');
    
    ?>
    
  • Это неправильно :

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html lang="es">
    <head><title>Export to Excel</title>
    </head>
    <body>
    <?php
    
    echo '<h1>Export to Excel</h1>';
    
    $objPHPExcel = new PHPExcel();
    $objPHPExcel->getActiveSheet()->setTitle("Report"); 
    // ...
    $objWriter->save('php://output');
    
    ?>
    </body>
    </html>
    
3 голосов
/ 27 июля 2011

Вы убедились, что файлы Excel не содержат HTML? Они могут просто игнорироваться Excel. Меняет ли что-либо добавление exit(); после последней строки?

...