ajax导出excel文件并增加等待动画效果

html:

  <button class="btn btn-default" οnclick="logToExcel('{:url('userLogToExcel',['day' => '3'])}')">3天日志导出</button>

js:

function logToExcel(url){
$('.masking').show();
$.ajax({
url:url,
type:"post",
processData : false,
contentType : false ,
success:function (data) {
if(data.result){
var form=$("<form>");//定义一个form表单
form.attr("style","display:none");
form.attr("target","");
form.attr("method","post");
form.attr("action",data.data);//请求地址
$("body").append(form);//将表单放置在web中
//传递参数
var input1 = $("<input>");
input1.attr("type", "hidden");
input1.attr("name", "fileName");
input1.attr("value", data.fileName);
form.append(input1);

var input2 = $("<input>");
input2.attr("type", "hidden");
input2.attr("name", "fileDir");
input2.attr("value", data.fileDir);
form.append(input2);

form.submit().remove();//表单提交
$('.masking').hide();
}else{
alert(data.msg);
}
}
})
}

php:
/**
* 用户操作日志导出Excel表
* @internal param int $day 导出日志时间
* @return \think\response\Json
* @reviewer
*/
public function userLogToExcel(){
set_time_limit(0);
$time = date('Y-m-d',time());
$fileName = 'userlog-' . $time;
$day = Request::instance()->param('day');
//$day = input('day');
if ($day == '7'){
$start_time = strtotime('-7 day');
}else{
$start_time = strtotime('-3 day');
}
$startTime = date('Y-m-d',$start_time);
$endTime = date('Y-m-d H:i:s',time());
$userID = '';
$firstRow = '';
$listRows = '';
$logUser = new UserLog();
$list = $logUser->getLogList($userID,$startTime,$endTime,$firstRow, $listRows);
$listID = array();
foreach ($list as $k => $v){
$listID[$k] = $v['user_id'];
}
$listId = array_unique($listID);
$userDetail = new UserInfo();
$userData = $userDetail->getUserInfo($listId);
$userInfo = [];
foreach ($userData as $key => $value){
$userInfo[$value['user_id']] = $value;
}
$taskData = [];
foreach ($list as $k => $v){
$taskData[$k] = [
$k+1,
$userInfo[$v['user_id']]['user_name'],
$userInfo[$v['user_id']]['real_name'],
$v['log_info'],
$v['log_ip'],
$v['log_area'],
$v['log_url'],
$v['log_time'],
];
}
$taskNewData = ['序号', '用户名', '真实名', '操作信息', 'ip地址', '登陆地', '操作url','操作时间'];
array_unshift($taskData, $taskNewData);
$filePath = ROOT_PATH . 'public' . DS . 'static' . DS . 'file' . DS . 'tmp' . DS;

try{
Excel::generateExcel($fileName, $taskData, false, $filePath);
}catch (\Exception $e){
return json(['result' => false, 'msg' => '日志导出失败']);
}
return json(['result' => true, 'fileName' => $fileName.'.xlsx', 'fileDir' => $filePath, 'data' => '/admin/log_user/sendFile']);
}

/**
* 将服务器文件发送到浏览器
* @internal param $fileDir 文件路径
* @internal param $fileName 文件名称
* @return Excel
*/
public function sendFile()
{
$fileDir = Request::instance()->param('fileDir');
$fileName = Request::instance()->param('fileName');
$fileName = iconv('gbk','utf-8', $fileName);
//检查文件是否存在
if (!file_exists($fileDir . $fileName)) {
echo "<meta http-equiv='refresh' content='3; url={$_SERVER['HTTP_REFERER']}'>";
echo "文件不存在";
exit();
} else {
//打开文件
$file = fopen($fileDir . $fileName, "r");
//输入文件标签
Header("Content-type: application/octet-stream");
Header("Accept-Ranges: bytes");
Header("Accept-Length: " . filesize($fileDir . $fileName));
Header("Content-Disposition: attachment; filename=" . $fileName);
//输出文件内容
//读取文件内容并直接输出到浏览器
echo fread($file, filesize($fileDir . $fileName));
fclose($file);
exit();
}
}


转载于:https://www.cnblogs.com/zzeng347/p/8046674.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 可以使用以下步骤实现Ajax导出Excel文件: 1.前端发送Ajax请求,后端返回Excel文件流。 ```javascript $.ajax({ url: '/export/excel', type: 'POST', dataType: 'json', data: { // 请求参数 }, success: function (result) { // 返回的数据是Excel文件流,可以进行下载 var blob = new Blob([result], { type: 'application/vnd.ms-excel' }); var fileName = 'export.xlsx'; if (window.navigator.msSaveOrOpenBlob) { navigator.msSaveBlob(blob, fileName); } else { var downloadLink = window.URL.createObjectURL(blob); var a = document.createElement('a'); a.style.display = 'none'; a.href = downloadLink; a.download = fileName; document.body.appendChild(a); a.click(); window.URL.revokeObjectURL(downloadLink); document.body.removeChild(a); } }, error: function (xhr, status, error) { // 错误处理 } }); ``` 2.后端生成Excel文件流并返回给前端。 ```java @RequestMapping(value = "/export/excel", method = RequestMethod.POST) public void exportExcel(HttpServletRequest request, HttpServletResponse response) { try { // 构造Excel文件 Workbook workbook = new XSSFWorkbook(); Sheet sheet = workbook.createSheet("Sheet1"); Row row = sheet.createRow(0); Cell cell = row.createCell(0); cell.setCellValue("Hello, World!"); // 输出Excel文件流 response.setContentType("application/vnd.ms-excel"); response.setHeader("Content-disposition", "attachment; filename=export.xlsx"); ServletOutputStream outputStream = response.getOutputStream(); workbook.write(outputStream); outputStream.flush(); outputStream.close(); } catch (IOException e) { e.printStackTrace(); } } ``` 以上代码仅供参考,具体实现需要根据实际情况进行调整。 ### 回答2: 在使用AJAX导出Excel文件时,可以通过以下步骤实现: 1. 创建一个包含导出功能的按钮或链接,并在其上绑定一个点击事件。 2. 在点击事件中,使用AJAX向服务器发送一个GET或POST请求,请求导出Excel文件的URL。 3. 服务器接收到该请求后,根据请求参数生成Excel文件,并将其保存到服务器本地或者内存中。 4. 服务器将生成的Excel文件的路径或内容返回给前端。 5. 前端接收到来自服务器的响应后,可以通过以下两种方式进行处理: - 使用window.open()函数将返回的Excel文件路径作为参数,在新窗口中打开Excel文件进行下载。例如: window.open(response.path),其中response.path是从服务器返回的Excel文件路径。 - 使用FileSaver.js等文件保存库将返回的Excel文件内容保存为本地文件。例如: 使用FileSaver.js可以通过以下代码将返回的Excel文件内容保存为本地文件:saveAs(new Blob([response.content]), "excel.xls"),其中response.content是从服务器返回的Excel文件内容。 需要注意的是,在服务器端生成Excel文件时,可以使用像OpenPyXL或PHPExcel这样的Excel文件处理库来生成和处理Excel文件。此外,服务器需要将生成的Excel文件转换为可下载的格式,如.xls或.xlsx,或者返回Excel文件的二进制内容。 总之,通过AJAX实现导出Excel文件,可以通过向服务器发送请求,生成Excel文件,并将其返回给前端,然后前端根据需要进行下载或保存。 ### 回答3: Ajax导出excel文件可以通过以下步骤实现: 1. 在前端页面中,首先要引入jquery等相关库文件,以便使用Ajax进行异步操作。 2. 在页面中添加一个导出按钮,并为按钮添加点击事件。 3. 在点击事件中,使用Ajax发送一个请求到后端服务器。请求的URL应该指向用于生成excel文件的接口。 4. 后端接口接收到请求后,根据请求参数生成excel文件,并将其保存到服务器指定的路径。 5. 后端将excel文件的路径返回给前端。 6. 前端接收到excel文件的路径后,可以通过创建一个`<a>`标签,设置其`href`属性为excel文件的路径,同时设置`download`属性为文件名。 7. 通过使用`document.body.appendChild(a)`和`a.click()`操作,模拟用户点击下载链接的过程。 8. 这样,用户就可以通过点击导出按钮来下载生成的excel文件。 需要注意的是,由于浏览器的安全策略限制,不能直接通过Ajax文件内容返回给前端,而是需要先将文件保存到服务器端,再将文件路径返回给前端进行下载。另外,生成excel文件的后端代码可以使用一些库或工具,如PHPExcel、Node.js等,具体使用哪种方案可以根据实际需求来选择。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值