2017-03-03 1 views
2

Ich würde gerne um Ihre Hilfe bitten.PHP Excel und Codeigniter

Ich mache ein Projekt mit CodeIgniter und ich muss neben den Charts, die ich mache, Excel-Dateien generieren. Ich verwende PHPExcel, um die Excel-Dateien zu generieren.

Ich habe den Klassenordner im Ordner "third_party" des Projekts hinzugefügt. Excel.php in den Bibliotheken-Ordner des Projektes mit den Codes

ich eine Datei erstellt genannt:

<?php 
if (!defined('BASEPATH')) exit('No direct script access allowed'); 

require_once APPPATH."/third_party/Classes/PHPExcel.php"; 
class Excel extends PHPExcel { 
    public function __construct() { 
     parent::__construct(); 
    } 
} 

Meiner Ansicht Datei verwenden ich Ajax die Daten zu senden und es Prozess in der Steuerung, die ist wo ich die Codes für das PHPExcel platziert habe. Hier ist mein Code in der Ansicht:

$("#excel").click(function(){ 
      var fromDate = $("#fromDate").val(); 
      var toDate = $("#toDate").val(); 

      var dataString = "fromDate="+fromDate+"&toDate="+toDate; 

      $.ajax({ 
      //url of the function 
       url: '<?php echo base_url(); ?>index.php/charts/excel', 
          //set type post 
       type: 'POST', 
          //get the data from the input field 
       data: dataString, 
       success:function(data) 
       { 
        alert(data); 
       } 
      }); 
    }); 

Hier ist mein Code in der Steuerung:

public function excel() 
{ 
    $this->load->library('Excel'); 
    //activate worksheet number 1 
    $this->excel->setActiveSheetIndex(0); 
    //name the worksheet 
    $this->excel->getActiveSheet()->setTitle('Users list'); 

    $sDate = $this->input->post('fromDate');//date_create_from_format('Y-m-d', $_POST['fromDate']); 
    $eDate = $this->input->post('toDate');//date_create_from_format('Y-m-d', $_POST['toDate']); 
    $data = $this->Charts_model->hello($sDate,$eDate); 

    // read data to active sheet 
    //print_r($data); 

    $row = 1; 
    foreach($data as $r){ 
     $this->excel->getActiveSheet()->fromArray(array($r->emp_id, $r->emp_stat, $r->isActive, $r->dateStarted), null, 'A'.$row); 
     $row++; 
    } 


    $filename='just_some_random_name.xls'; //save our workbook as this file name 

    header('Content-Type: application/vnd.ms-excel'); //mime type 

    header('Content-Disposition: attachment;filename="'.$filename.'"'); //tell browser what's the file name 

    header('Cache-Control: max-age=0'); //no cache 

    //save it to Excel5 format (excel 2003 .XLS file), change this to 'Excel2007' (and adjust the filename extension, also the header mime type) 
    //if you want to save it as .XLSX Excel 2007 format 

    $objWriter = PHPExcel_IOFactory::createWriter($this->excel, 'Excel5'); 

    //force user to download the Excel file without writing it to server's HD 
    $objWriter->save('php://output'); 
} 

Der Controller scheint zu funktionieren, aber tut es herunterladen jede Excel-Datei.

Also habe ich versucht, die von der Steuerung zurückgegebene Daten und this ist, wie es aussieht, wenn alarmiert.

Ich hoffe, Sie könnten mir mit diesem helfen. Dank

UPDATE

Das Problem ist gelöst. Es stellt sich heraus, dass es bereits die Datei herunterlädt. Als ich das Verzeichnis überprüft habe, existiert die Datei.

Was ich getan habe ist, dass ich ein Anker-Tag hinzugefügt, die ausgelöst wird, wenn der Export erfolgreich ist, so dass es mich auffordern kann, dass die Datei tatsächlich heruntergeladen und unter der Seite zu sehen ist.

$("#someid").trigger("click").attr("target", "_blank"); 

Der Anker-Tag sieht wie folgt aus:

<a href="<?php echo base_url(); ?>/directoryofthefile/somename.xls" style="display: none;"> 
<input type="button" id="someid" value="Test" class="btn btn-success"> 
</a> 
+0

In Zukunft Debug mit 'console.log()' anstelle von 'alert()'. Es ist eine bessere Angewohnheit und ist interaktiv. – Goose

Antwort

1

Extrahiert aus php.net:

Wenn Sie der Benutzer möchten Sie dazu aufgefordert werden, um die Daten zu speichern, die Sie senden, wie ein generierte PDF-Datei, können Sie den Header »Content-Disposition« verwenden, um einen empfohlenen Dateinamen anzugeben und den Browser zum Anzeigen des Speicherdialogs zu zwingen.

<?php 
// We'll be outputting a PDF 
header('Content-Type: application/pdf'); 

// It will be called downloaded.pdf 
header('Content-Disposition: attachment; filename="downloaded.pdf"'); 

// The PDF source is in original.pdf 
readfile('original.pdf'); 
?> 

, dass an Ihrem Code Rechnet man, denke ich, du bist nur die Readfile fehlt() Berufung. Versuchen Sie, es hinzuzufügen, sobald die Datei erstellt wurde. Viel Glück