简体   繁体   English

PHPExcel无法使用Ajax生成工作表

[英]PHPExcel not generating sheet with Ajax

I am using PHPExcel for creating excel sheets but I am facing issue with Ajax. 我正在使用PHPExcel创建Excel工作表,但是我面临Ajax的问题​​。 In Ajax I am not able to generate sheet when Ajax is succeeded. 在Ajax中,当Ajax成功时,我无法生成工作表。 In my current code without Ajax implantation sheet is generating and every time asking to save as option window. 在我当前没有Ajax的代码中,正在生成植入表,每次都要求另存为选项窗口。

Code without Ajax (Working): 不带Ajax的代码(有效):

/** Error reporting */
error_reporting(E_ALL);
ini_set('display_errors', TRUE);
ini_set('display_startup_errors', TRUE);
date_default_timezone_set('Europe/London');

define('EOL',(PHP_SAPI == 'cli') ? PHP_EOL : '<br />');

/** Include PHPExcel */
require_once dirname(__FILE__) . '/../Classes/PHPExcel.php';

// Create new PHPExcel object
$objPHPExcel = new PHPExcel();

// Create new PHPExcel object
$objPHPExcel = new PHPExcel();

// Create a first sheet, representing sales data
$objPHPExcel->setActiveSheetIndex(0);
$objPHPExcel->getActiveSheet()->setCellValue('A1', 'Something');

// Rename sheet
$objPHPExcel->getActiveSheet()->setTitle('Name of Sheet 1');

// Create a new worksheet, after the default sheet
$objPHPExcel->createSheet();

// Add some data to the second sheet, resembling some different data types
$objPHPExcel->setActiveSheetIndex(1);
$objPHPExcel->getActiveSheet()->setCellValue('A1', 'More data');

// Rename 2nd sheet
$objPHPExcel->getActiveSheet()->setTitle('Second sheet');

// Set active sheet index to the first sheet, so Excel opens this as the first sheet
$objPHPExcel->setActiveSheetIndex(0);


header('Content-Type: application/vnd.ms-excel');
header('Content-Disposition: attachment;filename="name_of_file_'.date('Y/m/d H:i:s').'.xlsx"');
header('Cache-Control: max-age=0');
$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel5');
$objWriter->save('php://output');

Code with Ajax (Not Working): 使用Ajax的代码(不起作用):

HTML: HTML:

<a href="javascript:void(0);" id="create">Create</a>

jQuery Ajax: jQuery Ajax:

<script type="text/javascript">
    $('#create').click(function() {

        $.ajax({
            type: "POST",
            url: "http://localhost/testing/PHPExcel_1.8.0_doc/Examples/create.php",
            data: "",
            success: function (html) {

            }
        });     

    });
</script>

Create.php Create.php

<?php
    /** Error reporting */
    error_reporting(E_ALL);
    ini_set('display_errors', TRUE);
    ini_set('display_startup_errors', TRUE);

    define('EOL',(PHP_SAPI == 'cli') ? PHP_EOL : '<br />');

    /** Include PHPExcel */
    require_once dirname(__FILE__) . '/../Classes/PHPExcel.php';

    // Create new PHPExcel object
    $objPHPExcel = new PHPExcel();

    // Create a first sheet, representing sales data
    $objPHPExcel->setActiveSheetIndex(0);
    $objPHPExcel->getActiveSheet()->setCellValue('A1', 'Something');

    // Rename sheet
    $objPHPExcel->getActiveSheet()->setTitle('Name of Sheet 1');

    // Create a new worksheet, after the default sheet
    $objPHPExcel->createSheet();

    // Add some data to the second sheet, resembling some different data types
    $objPHPExcel->setActiveSheetIndex(1);
    $objPHPExcel->getActiveSheet()->setCellValue('A1', 'More data');

    // Rename 2nd sheet
    $objPHPExcel->getActiveSheet()->setTitle('Second sheet');

    // Redirect output to a client’s web browser (Excel5)
    header('Content-Type: application/vnd.ms-excel');
    header('Content-Disposition: attachment;filename="name_of_file_'.date('Y/m/d H:i:s').'.xlsx"');
    header('Cache-Control: max-age=0');
    $objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel5');
    $objWriter->save('php://output');
?>

Getting this response: 得到这个回应:

在此处输入图片说明

Any Idea? 任何想法? Why sheet is not generating and why save as window is not opening. 为什么不生成工作表,为什么不打开另存为窗口。

Thanks. 谢谢。

If you are using ajax to generate file, you need to follow these steps: 如果使用ajax生成文件,则需要执行以下步骤:

  1. Send request to server/PHP to generate the file. 向服务器/ PHP发送请求以生成文件。 Save that file & send file name in response. 保存该文件并发送文件名作为响应。
  2. Upon receiving filename in success callback, redirect your browser to any php file which shows the actual geneared file (with headers)ie window.location.href='downloadFile.php?filename=abcd.pdf' 在成功回调中收到文件名后,将您的浏览器重定向到任何显示实际类属文件(带有标题)的php文件,例如window.location.href='downloadFile.php?filename=abcd.pdf'

Try this: 尝试这个:

<script type="text/javascript">
    $('#create').click(function() {

        $.ajax({
            url: "",
            beforeSend: function() {
            location.href = "http://localhost/testing/PHPExcel_1.8.0_doc/Examples/create.php";
            },
            success: function (html) {

            }
        });     

    });
</script>

Try this: 尝试这个:

PHP Code --> Return Array PHP代码->返回数组

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


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

        $objWriter = new PHPExcel_Writer_Excel5($objPHPExcel);

        $objWriter->save("php://output");
        $xlsData = ob_get_contents();
        ob_end_clean();

        $objPHPExcel->disconnectWorksheets();
        unset($objPHPExcel);


        $response =  array(
            'status' => true,
            'file' => "data:application/vnd.ms-excel;base64,".base64_encode($xlsData),
            'log' => $log_mensaje
        );

JQUERY CODE JQUERY代码

function crear_reporte_turno(id){ 函数crear_reporte_turno(id){

  var $mensaje = "¿Está seguro de Crear el Reporte del Turno?";
  var $form = $('<div></div>');
  $form.append('<p>'+$mensaje+'</p>');

  BootstrapDialog.show({
    title: 'Consulta',
    //type: BootstrapDialog.TYPE_DANGER,
    size: BootstrapDialog.SIZE_SMALL,
    message: $form,
    autospin: true,
    buttons: [{
        label: 'Continuar',
        cssClass: 'btn-primary',
        autospin: true,
        action: function(dialogRef){

            dialogRef.enableButtons(false);
            dialogRef.setClosable(false);

            url = '<?php echo $url_ruta_controlador . 'crear_reporte_turno/'; ?>' + id;

            $.post(url,{'id_turno' : id}, function(respuesta){

                dialogRef.close();

                var titulo = "Reporte Turno";
                var mensaje = "";
                var tipo_mensaje = "";
                var $form = $('<div></div>');

                if(respuesta.status){
                    mensaje = "Se ha creado el reporte del turno correctamente.";
                    tipo_mensaje = BootstrapDialog.TYPE_SUCCESS;

                    var $a = $("<a>");
                    $a.attr("href",respuesta.file);

                    $form.append('<p>'+mensaje+'</p>');                 
                    $form.append($a);   

                    var nombre_archivo = "reporte_turno_" + id + ".xls";

                    $a.attr("download",nombre_archivo);
                    $a[0].click();
                    $a.remove();

                    console.log(respuesta.log);


                } else {
                    mensaje = "Se ha producido un error al crear el reporte del turno.";
                    tipo_mensaje = BootstrapDialog.TYPE_DANGER;

                    $form.append('<p>'+mensaje+'</p>'); 
                }

                BootstrapDialog.show({
                    title: titulo,
                    type: tipo_mensaje,
                    message: $form,
                    buttons: [{
                        label: 'Cerrar',
                        action: function(dialogRef){
                            dialogRef.close();
                        }
                    }]
                });

               },'json').fail(function(){

                dialogRef.close();

                var titulo = "Reporte Turno";
                var mensaje = "";
                var tipo_mensaje = "";
                var $form = $('<div></div>');

                mensaje = "Se ha producido un error al crear el reporte del turno.";
                tipo_mensaje = BootstrapDialog.TYPE_DANGER;
                $form.append('<p>'+mensaje+'</p>'); 

                BootstrapDialog.show({
                    title: titulo,
                    type: tipo_mensaje,
                    message: $form,
                    buttons: [{
                        label: 'Cerrar',
                        action: function(dialogRef){
                            dialogRef.close();
                        }
                    }]
                });

              });
            return; 
            }
        },
        {
          label: 'Cancelar',
          action: function(dialogRef){
          dialogRef.close();

        }
      }]      
    }); 
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM