2016-11-11 2 views
0

Ich habe Probleme mit dem Erzielen, was ich will und bin mir nicht sicher, ob es möglich ist. Ich verwende CodeIgniter und PHP für meine Webanwendung. In meiner Home-Ansicht können Benutzer eine Datenbank abfragen, und die Ergebnisse werden in der Tabellenform auf der Seite generiert und angezeigt. Der Benutzer wird dann die Tabelle überprüfen und die Option zum Herunterladen als xlsx Excel-Datei zur Verfügung gestellt werden. Ich verwende einen Ajax-Post, um die Tabellendaten an meine PHP controller zu senden, die die Excel-Datei erstellen wird. Ich brauche das auch in allen Browsern, besonders in Safari, da der Client sowohl von Ipads als auch von Desktop-Computern auf die Anwendung zugreift.Jede Möglichkeit, Datei-Download von Ajax-Antwort mit CodeIgniter und PHPExcel

My home ajax Beitrag: (t ist die ID der erzeugten Tabelle)

$("#btnExport").click(function() { 
    $.ajax({ 
     type: "POST", 
     url: '<?php echo base_url();?>index.php/Home/excel', 
     datatype: 'html', 
     data: { 
      'queryData': $("#t").html()}, 
     success: function (response) { 
      alert(response); 
     }    
    }); 
}); 

Meine Reglerfunktion:

public function excel() 
{ 
    $this->load->library('excel'); 
    $filename = "data"; 
    $table = $this->input->post('queryData'); 
    $objPHPExcel = new PHPExcel(); 
    $tmpfile = time().'.html'; 
    file_put_contents($tmpfile,$table); 
    $objReader = PHPExcel_IOFactory::createReader('HTML'); 
    $objPHPExcel = $objReader->load($tmpfile); 

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

    $objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007'); 
    $objWriter->save('php://output');  
    unlink($tmpfile); 
} 

Das Problem ist der Umgang mit der Ajax-Antwort, die ich gelesen habe, Es ist unmöglich, eine Datei von Ajax herunterzuladen. Alles, was ich versucht habe funktioniert nicht Die Antwort ist binär codierte Daten Ich nehme an, ist die Excel-Datei. Gibt es eine Problemumgehung für dieses Problem? Ich entschied mich für Ajax, da sich die Tabelle bei der aktuellen Abfrage dynamisch ändern kann und entsprechend an den Server gesendet werden muss. Danke für jede Hilfe.

BEARBEITEN In der verknüpften Frage geht es darum, Formulare zu senden und keinen Download auszulösen. Ich übergebe keine Formulare, sondern übergebe nur eine HTML-Tabelle an die PHP, um die Excel-Datei zu erstellen. Ich sehe nicht, wie das für mein Problem relevant ist. Missverständnis ich?

+0

Mögliche Duplikate von [ jQuery Ajax POST Beispiel mit PHP] (http://stackoverflow.com/questions/5004233/jquery-ajax-post-example-with-php) –

+0

konstruieren Sie Tabelle in Controller? – EaBangalore

+0

@EaBangalore Ja, die Tabelle wird in verschiedenen Funktionen innerhalb desselben Controllers erstellt. – ees3

Antwort

0

Einreichen ein Formulars drucken wollen, sind die besten Sie können eine Datei herunterladen auslösen tun ... Es ist besser, einen zu erstellen, auch wenn Sie kein Formular haben.

var baseUrl = '<?php echo base_url();?>' 

var $form = $(`<form method="post" hidden action="${baseUrl}index.php/Home/excel"><textarea name="queryData">`) 
$form.find('textarea').val($("#t").html()) 
$form.appendTo('body').submit() 

Es gibt jedoch eine Alternative zu Ajax Antworten zu speichern und das ist durch eine Verknüpfung mit einer Objekt-URL von einer Blob Antwort erstellen, die Einstellung des Download-Attributs und lösen einen Klick (in IE Sie müssen navigator.saveOrOpenBlob nennen)
es gibt eine gute lib gibt, die FileSaver zu abstrahieren alle bösen Anbieter Besonderheiten

Die Art und Weise aufgerufen wird, würden Sie es verwenden, um dies zu tun ist:

fetch(url, {method: 'post', body: data}) 
.then(res => { 
    var cd = res.header.get('Content-Disposition') 
    var filename = cd.match(/filename="(.+)"/)[1] 

    return res.blob().then(blob => saveAs(blob, filename)) 
}) 

Aber es ist nicht so gut wie das Senden eines Formulars und ein wenig Hilfe von einem Server, der einen Content-Disposition-Header senden kann, da nicht alle Browser (hauptsächlich Safari) das Download-Attribut in Links unterstützen.

0

gibt es 2 Möglichkeiten, die ich

1. Laden der konstruierte Tabelle in localStorage Ihres Browsers wissen

<div id="myTable"> 
    <table> 
    <tr> 
    <th>A</th> 
    <th>B</th> 
    </tr> 
    <tr> 
     <td>Value for column A</td> 
     <td>Value for column B</td> 
    </tr> 
</table> 
</div> 

// in jquery

 $(document).ready(function(){ 
      alert('nothing'); 

      if (typeof(Storage) !== "undefined") { 
       // Code for localStorage/sessionStorage. 



       var table = $('#myTable').html(); 

       localStorage.setItem("storedTable",table); 



      } else { 

       console.log('no support'); 
       // Sorry! No Web Storage support.. 
      } 

     }); 

// now you can get the table in the next page like this 

var table = localStorage.getItem("storedTable"); 

2. Lösung, speichern Sie sie in der $_SESSION wie diese

session_start() 
    $_SESSION["myTable"] = $yourConstructedTable 

Umleitung auf die Seite, wo Sie

den Tisch bekommen, wie so

 session_start(); 
header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'); 

     $table = $_SESSION["myTable"]; 
     unset($_SESSION["myTable"]); // don't forget to unset the session 

    // rest of your code 
+0

Entschuldigung für das Gestern Gestern habe ich keine Antwort, also habe ich heute gepostet – EaBangalore

Verwandte Themen