使用CodeIgniter和PHPExcel从ajax响应处理文件下载的任何方法

时间:2016-11-11 13:03:25

标签: php jquery ajax codeigniter phpexcel

我正在努力实现我想要的东西,我不确定它是否可能。我正在使用CodeIgniterPHP作为我的网络应用程序。我的主视图允许用户查询数据库,并在页面上的表格中生成和显示结果。然后,用户将查看该表,并提供下载为xlsx Excel文件的选项。我正在使用ajax帖子将表数据发送到将创建Excel文件的PHP controller。我还需要在所有浏览器中工作,尤其是Safari,因为客户端将从Ipads和桌面计算机访问应用程序。

我的主页ajax帖子:(t是生成的表的id)

$("#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);
        }             
    });
});

我的控制器功能:

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);
}

问题是处理ajax响应我已经读过它无法从ajax下载文件。我尝试的一切都不起作用响应是我假设的二进制编码数据是excel文件。这个问题有解决方法吗?我决定使用ajax,因为表可以根据当前查询动态更改,并且需要相应地发送到服务器。谢谢你的帮助。

EDIT 在链接的问题中,它是关于提交表单而不是触发下载。我没有提交任何表单,只是将html表传递给PHP来构建Excel文件。我没有看到这与我的问题有什么关系。我误解了吗?

2 个答案:

答案 0 :(得分:0)

我知道有两种可能性

1。将构建的表格存储在浏览器的localStorage

<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>

//在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。解决方案,将它们存储在$_SESSION这样的

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

重定向到您要打印的页面

像这样得到表

        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

答案 1 :(得分:0)

提交表单是您触发文件下载的最佳方式... 即使你没有表格,也可以创建一个。

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()

然而,有一种替代方法可以保存ajax响应,即通过blob响应创建一个带有对象url的链接,设置下载属性并触发一次点击(在IE中你需要调用navigator.saveOrOpenBlob)<登记/> 有一个很好的lib被称为FileSaver来抽象出所有讨厌的供应商细节

您使用它的方式是:

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))
})

但它不如提交表单并从可以发送Content-Disposition标头的服务器获得一些帮助,因为并非所有浏览器(主要是safari)都支持链接中的下载属性... < / p>