2023年1月7日:fastadmin导出数据为excel格式

news2024/12/24 2:07:27

需求图:

 实现方法:

第一种方法:fastadmin自带导出数据,直接点击下载即可

效果图

 第二种方法:自定义导出按钮,需要编写方法

效果图:

效果图

 代码实现

首先:前端按钮代码(可直接拿来用即可)

<a href="javascript:;" class="btn btn-success btn-export {:$auth->check('clock/export')?'':'hide'}" title="{:__('Export')}" id="btn-export-file"><i class="fa fa-download"></i> {:__('Export')}</a>

其次:js点击事件代码(可直接拿来用即可[代码位置var table = $("#table");后即可])

$(document).on("click", ".btn-export", function () {
                var ids = Table.api.selectedids(table);
                var page = table.bootstrapTable('getData');
                var all = table.bootstrapTable('getOptions').totalRows;
                console.log(ids, page, all);
                Layer.confirm("请选择导出的选项<form action='" + Fast.api.fixurl("clock/export") + "' method='post' target='_blank'><input type='hidden' name='ids' value='' /><input type='hidden' name='filter' ><input type='hidden' name='op'><input type='hidden' name='search'><input type='hidden' name='columns'></form>", {
                    title: '导出数据',
                    btn: ["选中项(" + ids.length + "条)", "本页(" + page.length + "条)", "全部(" + all + "条)"],
                    success: function (layero, index) {
                        $(".layui-layer-btn a", layero).addClass("layui-layer-btn0");
                    }
                    , yes: function (index, layero) {
                        submitForm(ids.join(","), layero);
                        return false;
                    }
                    ,
                    btn2: function (index, layero) {
                        var ids = [];
                        $.each(page, function (i, j) {
                            ids.push(j.id);
                        });
                        submitForm(ids.join(","), layero);
                        return false;
                    }
                    ,
                    btn3: function (index, layero) {
                        submitForm("all", layero);
                        return false;
                    }
                })
            });
            var submitForm = function (ids, layero) {
                var options = table.bootstrapTable('getOptions');
                console.log(options);
                var columns = [];
                $.each(options.columns[0], function (i, j) {
                    if (j.field && !j.checkbox && j.visible && j.field != 'operate') {
                        columns.push(j.field);
                    }
                });
                var search = options.queryParams({});
                $("input[name=search]", layero).val(options.searchText);
                $("input[name=ids]", layero).val(ids);
                $("input[name=filter]", layero).val(search.filter);
                $("input[name=op]", layero).val(search.op);
                $("input[name=columns]", layero).val(columns.join(','));
                $("form", layero).submit();
            };

最后:控制器中代码(需要修改)

//导出数据
    public function export(){
        if ($this->request->isPost()){
            set_time_limit(0);//设置时间限制
            $ids = $this->request->post('ids'); //获取数据的所有id
            $excel = new \PHPExcel();   // 生成新的excel对象
            $excel->getProperties()
                ->setCreator("FastAdmin")           //设置作者
                ->setLastModifiedBy("FastAdmin")    //设置上次修改者
                ->setTitle("考勤打卡表")                   //设置表格标题
                ->setSubject("Subject");            //设置主题
            $excel->getDefaultStyle()->getFont()->setName('楷体');    //设置默认字体
            $excel->getDefaultStyle()->getFont()->setSize(15);        //设置默认字体大小
            /**
             * $excel->getActiveSheet()->getColumnDimension('A')->setWidth(15);//设置列宽
             * $excel->getActiveSheet()->getRowDimension('6')->setRowHeight(30);//设置行高
             * $excel->getActiveSheet()->getColumnDimension('B')->setAutoSize(true);单元格宽度自适应
             * $excel->getActiveSheet()->mergeCells('A1:P1');   合并单元格
             */
            $excel->getActiveSheet()->getColumnDimension('A')->setAutoSize(true);
            $excel->getActiveSheet()->getColumnDimension('B')->setAutoSize(true);
            $excel->getActiveSheet()->getColumnDimension('C')->setAutoSize(true);
            $excel->getActiveSheet()->getColumnDimension('D')->setAutoSize(true);
            $excel->getActiveSheet()->getColumnDimension('E')->setAutoSize(true);
            $excel->getActiveSheet()->getColumnDimension('F')->setAutoSize(true);
            $excel->getActiveSheet()->getColumnDimension('G')->setWidth(15);
            // 开始操作excel表
            $worksheet = $excel->setActiveSheetIndex(0)    //操作第一个工作表
            ->setCellValue('A1','劳务公司名称')   //设置表格标题名称
            ->setCellValue('B1','客户现场名称')
            ->setCellValue('C1','姓名')
            ->setCellValue('D1','身份证号')
            ->setCellValue('E1','上班时间')
            ->setCellValue('F1','下班时间')
            ->setCellValue('G1','是否为跨天打卡');
            if ($ids=='all' || empty($ids)){    //判断当前数据为全部或者选中的
                $list = $this->model->with(['user','client','labor'])->select();
            }else{
                $list = $this->model->with(['user','client','labor'])->select($ids);
            }

            foreach ($list as $k => $val){
                $k = $k + 2;//表格是从2开始的
                $worksheet->setCellValue('A'.$k,$val['labor']['labname'])
                    ->setCellValue('B'.$k,$val['client']['sitename'])
                    ->setCellValue('C'.$k,$val['user']['username'])
                    ->setCellValue('D'.$k,$val['user']['idcard'])
                    ->setCellValue('E'.$k,$val['starttime_text'])
                    ->setCellValue('F'.$k,$val['endtime_text'])
                    ->setCellValue('G'.$k,$val['iskt_text']);
            }

            $excel->createSheet();  //创建excel表
            $title = "考勤打卡数据_".date("Y-m-dHis");    //考勤打卡数据_2023-01-07145656.xlsx
            header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');//表明当前文件是.xlsx
            header('Content-Disposition: attachment;filename="'.$title.'.xlsx"');//文件名称[考勤打卡数据_2023-01-07145656.xlsx]
            header('Cache-Control: max-age=0'); //禁用缓存
            header('Cache-Control: max-age=1'); //通知浏览器:1 秒之内不要烦我,自己从缓冲区中刷新。
            header('Expires: Mon, 26 Jul 1997 05:00:00 GMT'); // 缓存过期时间(禁用缓存)
            header('Last-Modified: ' . gmdate('D, d M Y H:i:s') . ' GMT'); // 上一次修改时间
            header('Cache-Control: cache, must-revalidate'); // HTTP/1.1 缓存控制:必须重新验证
            header('Pragma: public'); // 可被任何缓存所缓存 http1.0协议
            $objWriter = \PHPExcel_IOFactory::createWriter($excel, 'Excel2007');
            $objWriter->save('php://output');       //保存地址
            exit;
            return;
        }
    }

Excel效果图

 相关知识解析

1、PHP常用header头部定义

<?php
//常用header()汇总
header('HTTP/1.1 200 OK'); // ok 正常访问
header('HTTP/1.1 404 Not Found'); //通知浏览器 页面不存在
header('HTTP/1.1 301 Moved Permanently'); //设置地址被永久的重定向 301
header('Location: https://www.baidu.com/'); //跳转到一个新的地址
header('Refresh: 10; url=https://www.baidu.com/'); //延迟转向 也就是隔几秒跳转
header('X-Powered-By: PHP/7.2.25'); //修改 X-Powered-By信息
header('Content-language: en'); //文档语言
header('Content-Length: 10'); //设置内容长度
header('Last-Modified: '.gmdate('D, d M Y H:i:s', time()).' GMT'); //告诉浏览器最后一次修改时间
header('HTTP/1.1 304 Not Modified'); //告诉浏览器文档内容没有发生改变
//内容类型
header('Content-Type: text/html; charset=utf-8'); //网页编码
header('Content-Type: text/plain'); //纯文本格式
header('Content-Type: image/jpeg'); //JPG、JPEG
header('Content-Type: application/zip'); // ZIP文件
header('Content-Type: application/pdf'); // PDF文件
header('Content-Type: audio/mpeg'); // 音频文件
header('Content-type: text/css'); //css文件
header('Content-type: text/javascript'); //js文件
header('Content-type: application/json'); //json
header('Content-type: application/pdf'); //pdf
header('Content-type: text/xml'); //xml
header('Content-Type: application/x-shockw**e-flash'); //Flash动画
//声明一个下载的文件
header('Content-Type: application/octet-stream');   //八字节
header('Content-Disposition: attachment; filename="xxx.zip"');//内容处置:附件 文件名称:xxx.zip
header('Content-Transfer-Encoding: binary');    //内容传输编码:二进制
readfile('test.zip');
//对当前文档禁用缓存
header('Cache-Control: no-cache, no-store, max-age=0, must-revalidate');    //http 1.1禁用缓存四种方法
header('Expires: Mon, 26 Jul 1997 05:00:00 GMT');       //设置过期时间为1997,禁用缓存
//显示一个需要验证的登陆对话框
header('HTTP/1.1 401 Unauthorized');    //401 未授权
header('WWW-Authenticate: Basic realm="Top Secret"');   //WWW身份验证:基本领域=“绝密”
//声明一个需要下载的xls文件
header('Content-Disposition: attachment; filename=ithhc.xlsx'); //.xlsx
header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');  //.xlsx
header('Content-Length: '.filesize('./test.xlsx'));
header('Cache-Control: must-revalidate');   //缓存控制:必须重新验证
header('Pragma: public');   //可被任何缓存所缓存 http1.0协议
readfile('./test.xls');

2、HTTP协议

HTTP1.0中通过Pragma 控制页面缓存,通常设置的值为no- cache,不过这个值不这么保险,通常还加上Expires置为0来达到目的。但是如我们刻意需要浏览器或缓存服务器缓存住我们的页面这个值则要设置为 Pragma。
HTTP1.1中启用Cache-Control 来控制页面的缓存与否,这里介绍几个常用的参数:

  • no-cache,浏览器和缓存服务器都不应该缓存页面信息;
  • public,浏览器和缓存服务器都可以缓存页面信息;
  • no-store,请求和响应的信息都不应该被存储在对方的磁盘系统中;
  • must-revalidate,对于客户机的每次请求,代理服务器必须想服务器验证缓存是否过时

最后(相关内容节选以及内容详细推荐地址)

  1. phpExcel中文帮助手册之常用功能指南(phpExcel中文帮助手册之常用功能指南 - phpStudy)
  2. PHPExcel常用属性使用(PHPExcel常用属性使用 - 走看看)
  3. header头部定义(PHP 常用的header头部定义汇总_tboqi1的博客-CSDN博客)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/147051.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【HCIA-openEuler】实验手册—01【openEuler操作系统安装】

文章目录一、实验介绍1、关于本实验2、实验目的3、实验所需材料二、配置虚拟化环境步骤1&#xff1a;硬件准备步骤2&#xff1a;软件准备三、安装openEuler操作系统1、创建虚拟机步骤1&#xff1a;新建虚拟机步骤2&#xff1a;向导选择典型(推荐)步骤3&#xff1a;选择镜像文件…

MonoScene: Monocular 3D Semantic Scene Completion

Paper name MonoScene: Monocular 3D Semantic Scene Completion Paper Reading Note URL: https://arxiv.org/pdf/2112.00726.pdf TL;DR 2022 cvpr 论文&#xff0c;提出一种能在室内与室外场景均可使用的单目 SSC 方案&#xff0c;与特斯拉的 Occupancy Network 非常相似…

【Java基础】day12

一、Redis 的缓存穿透、缓存击穿、缓存雪崩是什么&#xff1f; 缓存穿透 请求不存在【 DB 和 Redis 中都不存在】的数据&#xff0c;导致请求直接打到持久层数据库中&#xff0c;导致数据库负载过高&#xff0c;甚至导致宕机。这样的请求几乎可以导致请求次次到达 DB &#xff…

Cesium中tif转经纬度投影或墨卡托地图瓦片 CesiumLab系列教程

Cesium 目前支持的影像切片规范有两种形式的&#xff1a; 1.经纬度直拉切片方式 &#xff08;GeographicTilingScheme &#xff09;&#xff0c; 2.web 墨卡托切片方式 &#xff08;WebMercatorTilingScheme&#xff09;。 根据常规传统&#xff0c;瓦片大小都是 256&#x…

数字验证学习笔记——SystemVerilog芯片验证22 ——功能覆盖率策略覆盖组

一、功能覆盖率策略 1.1 收集信息而非数据 对于一些设计&#xff0c;你需要关心的是合法的寄存器地址和非法的寄存器地址&#xff0c;可写的寄存器域和非法的寄存器域&#xff0c;而不是具体的寄存器地址数值。一旦关注的地方着眼于感兴趣的状态&#xff0c;而不是具体数值&a…

2022年中职网络安全竞赛SSH弱口令渗透测试解析(详细)

B-7 SSH弱口令渗透测试 任务环境说明: 服务器场景:Server18(关闭链接)服务器场景操作系统:Linux(版本不详)在本地PC渗透测试平台Kali中使用zenmap工具扫描服务器场景Server18-2所在网段(例如:172.16.101.0/24)范围内存活的主机IP地址和指定开放的21、22、23端口。并将…

【NI Multisim 14.0原理图环境设置——标题栏】

目录 序言 一、标题栏 &#x1f34d;1.添加标题块 &#x1f34d; 2.修改标题块 &#xff08;1&#xff09;直接修改 &#xff08;2&#xff09;标题块编辑器 序言 NI Multisim最突出的特点之一就是用户界面友好。它可以使电路设计者方便、快捷地使用虚拟元器件和仪器、仪表…

【C++】命名空间 以及 如何理解using namespace std;

目录 命名空间 1.由来 2.概念 3.使用 方法一 方法二 方法三 4.嵌套使用 命名空间 很多人在学习C的时候&#xff0c;第一个代码想必是如下样子的。和C语言相比&#xff0c;库函数换了&#xff0c;同时多了一个 using namespace std&#xff1b; 但是&#xff0c;你真的了…

Allegro174版本新功能介绍之高阶Contour模式使用

Allegro174版本新功能介绍之高阶Contour模式使用 在Allegro低版本166以及172版本中,有Contour命令,但是只有沿着routekeepin和Connect Line功能,如下图 当升级到了174版本的时候,Allegro支持沿着任意目标走线,甚至是过孔和铜皮,如下图 具体操作介绍如下 以沿着这块铜皮轮…

一元三次方程求解 -- 二分查找

[NOIP2001 提高组] 一元三次方题目描述思路codetag&#xff1a;数学&#xff0c;二分查找 题目链接&#xff1a;洛谷P1024: [NOIP2001 提高组] 一元三次方 题目描述 思路 先对三次函数求导得到二次函数 3ax22bxc03ax^2 2bx c 03ax22bxc0 然后利用求根公式计算出两个极值点 …

Vue--》Vue3自定义组件以及新组件的使用讲解

目录 customRef Vue3提供的新组件 Fragment Teleport Suspense Vue3中全局API的改变 customRef 创建一个自定义的ref&#xff0c;并对其依赖项跟踪和更新触发进行显示控制。 <template><input type"text" v-model"keyword"><h3>…

谷粒学苑项目-第一章公共模块下的Swagger配置类-1.4

一、在common子模块下创建Swagger配置类 1. guli_parent->common子模块->service_base子模块->SwaggerConfig配置类 common子模块是pom类型 <dependency><groupId>io.springfox</groupId><artifactId>springfox-swagger2</artifactId>…

【Java寒假打卡】Java基础-集合Collection

【Java寒假打卡】Java基础-集合Collection集合与数组之间的区别集合体系结构Collection常用的方法集合-迭代器迭代器原理分析迭代器删除方法的注意事项增强for循环集合与数组之间的区别 数组的长度是不可变的&#xff0c;集合的长度是可变的数组可以存基本数据类型和引用数据类…

Xilinx AXI4 协议

AXI4 相对复杂&#xff0c;但 SOC 开发者必须掌握。AXI 协议的具体内容可参考 Xilinx UG761 AXI Reference Guide。在这里我们简单了解一下。 AXI4 所采用的是一种 READY&#xff0c;VALID 握手通信机制&#xff0c;即主从模块进行数据通信前&#xff0c;先根据操作对各所用到的…

填满背包方案数OJ

目录 LintCode 炼码物品大小不重复的填满背包的方案数 LintCode 炼码 物品大小存在重复情况 LintCode 炼码不重复的组合个数 完全背包_牛客题霸_牛客网 LintCode 炼码物品大小不重复的填满背包的方案数 描述给出 n 个物品, 以及一个数组, nums[i]代表第i个物品的大小, 保证大…

编辑PDF文件的两种方法

PDF文件具备较好的稳定性、兼容性&#xff0c;在日常工作中的应用非常广泛&#xff0c;但想要编辑文件内容就不那么容易了&#xff0c;下面来说说编辑PDF文件的两种方法。 方法一&#xff1a; 我们知道&#xff0c;查看PDF文件只需要阅读器就可以了&#xff0c;如果想对文件内…

springboot 整合 webservice服务

目录webservice百科创建一个springboot项目并导入相关依赖编写webservice接口编写实现类发布webservice浏览器访问postman调用在前一段时间用到了webservice服务&#xff0c;今天整理了一下&#xff0c;记录下来。webservice百科 Web Service是一个平台独立的&#xff0c;低耦…

Apifox调用Security权限接口

Apifox调用Security权限接口1. SpringBoot3.0集成SpringSecurity1.1 pom1.2 properties配置2. Apifox 配置2.1 配置根目录Auth2.2 ApiFox 分享调用本地接口本教程环境&#xff1a; Apifox&#xff1a;2.2.14 &#xff08;建议更新到最新版本&#xff0c;老版本Auth从父级继承可…

flowable数据表详解

爬虫组件分析目录概述需求&#xff1a;设计思路实现思路分析1.flowable2.数据表的命名规则3.ACT_RU_*4.ACT_ID_*5.ACT_HI_*数据表的介绍参考资料和推荐阅读Survive by day and develop by night. talk for import biz , show your perfect code,full busy&#xff0c;skip hard…

AjaxRedis问题总结

一、JQuery——Ajax实现三大方法的应用及区别&#xff08;get,post,ajax&#xff09; 1. $.get()方法 <script type"text/javascript">$(function () {$("#send").click(function () {$.get("AjaxHandler.ashx", {username: $("#use…