vue+laravel实现导出Excel功能,并解决导出数据出现乱码问题

2024-05-24   阅读:608   类型:前端   分类:Vue    标签: PHP Vue

一、导致导出数据乱码问题解决方案:

1.1、前端在axios里面加入加入请求头:

responseType: 'blob',

说明:responseType: 'blob' 是一个常用于 XMLHttpRequest 或 fetch API 的选项,它指定了响应的类型。当设置为 'blob' 时,这意味着预期服务器返回的是一个二进制大对象(Blob),通常用于处理二进制数据,如文件下载。

1.2、后端在查询数据后加入清除

ob_end_clean(); // Added by me
ob_start(); // Added by me

说明:ob_end_clean — 清空(擦除)缓冲区并关闭输出缓冲,ob_start()打开缓冲区PHP代码的数据块和echo()输出都会进入缓冲区而不会立刻输出

二、导出Excel例子

1、HTML部分代码:

<template>
  <div>
   <el-button type="warning" @click="exportExcel" size="small">导出</el-button>
  <div>
<template>

2、Vue前端代码:实现点击按钮下载Excel,使用axios请求下载:

<script>
import axios from 'axios';
export default {
 //导出功能
 async exportExcel(){
  axios.get('/api/appointment/exportExcel', {
   token: window.localStorage.getItem('token'), // 设置认证令牌
   responseType: 'blob',
  })
   .then(response => {
    // 处理响应,例如下载文件
    const url = window.URL.createObjectURL(new Blob([response.data]));
    const link = document.createElement('a');
    link.href = url;
    link.setAttribute('download', 'example.xls');
    document.body.appendChild(link);
    link.click();
   })
   .catch(error => {
    console.error('导出 Excel 失败:', error);
   });
 },
}
</script>

3、laravel后端代码:后端实现导出excel功能

<?php
pubilc function exportExcel(){
 $res = Appointment::where($where)->orderBy('id', 'desc')->get()->toArray();
 $objPHPExcel = new \PHPExcel();
 $objPHPExcel->createSheet(); //创建新的内置表
 $objPHPExcel->setActiveSheetIndex(); //吧新创建的sheet设定为当前活动sheet
 $objPHPExcel->getActiveSheet()->freezePane('A2');//锁定这个单元格,则该单元格所有的左边区域和上方区域都会被锁定,也就是不受滚动条的影响,像浮在那一样,这就是锁定单元格的原理。所以锁定A2就是冻结第一行了
 //设置背景颜色
 $objPHPExcel->getActiveSheet()->getStyle('A1:B1')->getFill()->setFillType(\PHPExcel_Style_Fill::FILL_SOLID)->getStartColor()->setARGB('D9FFC125');
 $objPHPExcel->getActiveSheet()->getColumnDimension('A')->setWidth(10);
 $objPHPExcel->getActiveSheet()->getColumnDimension('B')->setWidth(20);
 $objSheet=$objPHPExcel->getActiveSheet(); //获取当前活动sheet
 $objSheet->setTitle("预约记录");//给当前活动sheet设置名称
 $objSheet->setCellValue('A1','姓名')->setCellValue('B1','手机号');
 $j=2;
 foreach($res as $key=>$val){
   $objSheet->setCellValue('A'.$j,$val['yy_name'])->setCellValue('B'.$j,$val['yy_tel']);
   $j++;
 }
 ob_end_clean(); // Added by me
 ob_start(); // Added by me
 // 设置HTTP响应头,以便浏览器可以识别Excel文件
 header('Content-Type: application/vnd.ms-excel;charset=UTF-8');
 header('Content-Disposition: attachment;filename="example.xls"');
 header('Cache-Control: max-age=0');
 // 创建 Excel writer 对象
 $objWriter = \PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel5');
 // 直接输出到浏览器
 $objWriter->save('php://output');
 exit;
}
?>
腾讯云11.11上云拼团Go,2核2G3M云服务器 28元/年

‘简忆博客’微信公众号 扫码关注‘简忆博客’微信公众号,获取最新文章动态
转载:请说明文章出处“来源简忆博客”。http://www.tpxhm.com/fdetail/1049.html

×
觉得文章有用就打赏一下文章作者
微信扫一扫打赏 微信扫一扫打赏
支付宝扫一扫打赏 支付宝扫一扫打赏

文章评论(0)

登录
简忆博客壁纸一
简忆博客壁纸二
简忆博客壁纸三
简忆博客壁纸四
简忆博客壁纸五
简忆博客壁纸六
简忆博客壁纸七
简忆博客壁纸八
头像

简忆博客
勤于学习,乐于分享

置顶推荐

打赏本站

如果你觉得本站很棒,可以通过扫码支付打赏哦!
微信扫码:你说多少就多少~
微信扫码
支付宝扫码:你说多少就多少~
支付宝扫码
×