我正在努力实现我想要的东西,我不确定它是否可能。我正在使用CodeIgniter
和PHP
作为我的网络应用程序。我的主视图允许用户查询数据库,并在页面上的表格中生成和显示结果。然后,用户将查看该表,并提供下载为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文件。我没有看到这与我的问题有什么关系。我误解了吗?
答案 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>