效果如上,结合layer组件以及ajax分页实现,具体代码如下

前端代码

用户数据导出

// 执行事件

function exportData() {

var loading = layer.load(1, {

shade: [0.4,'#000']

}); // 弹出loading层

var formData = $(".layui-form").serialize(); // 获取搜索表单数据

$.post("{:url('download')}",formData,function (res) {

layer.close(loading);

if(res.code == 1){

doConfirm(res.data.total); // 弹出下载确认

}else{

layer.msg('没有可导出数据~');

}

})

}

/**

* 返回可执行数据后分页处理

* num 数据总数

**/

function doConfirm(num) {

if(num == 0){

layer.msg('没有可导出数据');

return ;

}

layer.confirm('共有'+num+'个用户数据需要导出,导出时间可能会较长,确认执行吗?',function () {

layer.closeAll();

layer.open({

type: 1, title: false, area: ['560px', '135px'], anim: 2, shadeClose: false, end: function () {

doAjax = false;

}, content: '' +

'

' +

'

数据导出进度

' +

'

'

正在导出,请等待,请勿关闭窗口,否则导出失败~~

' +

'

'

});

var pageNum = 1;

(function loadprocess(page,that) {

that = this,this.$box = $("[data-export-load]");

this.$area = that.$box.find('textarea'), this.$title = that.$box.find('[data-message-title]');

this.$percent = that.$box.find('.layui-progress div');

this.setState = function (status, message) {

if (status === 1) { // 已完成

that.$title.html('' + message + '').addClass('text-center');

that.$percent.addClass('layui-bg-blue').removeClass('layui-bg-green layui-bg-red');

} else if (status === 2) {

if (message.indexOf('>>>') > -1) {

that.$title.html('' + message + '').addClass('text-center');

} else {

that.$title.html('正在处理:' + message).removeClass('text-center');

}

that.$percent.addClass('layui-bg-blue').removeClass('layui-bg-green layui-bg-red');

} else if (status === 3) { // 已完成

that.$title.html('' + message + '').addClass('text-center');

that.$percent.addClass('layui-bg-green').removeClass('layui-bg-blue layui-bg-red');

}

};

var formData = $(".layui-form").serialize() + "&page="+pageNum; // 表单数据加 当前分页数

$.post("{:url('downpage')}",formData,function (res) {

that.setState(parseInt(res.code), res.message); // 返回数据

that.$percent.attr('lay-percent', (parseFloat(res.data.progress || '0.00').toFixed(2)) + '%'), layui.element.render(); // 更新进度条

if(res.code == 1){ // 进行中

pageNum = res.data.page;

setTimeout(function () {

loadprocess(pageNum); // 循环执行

},2000);

}else if(res.code == 3){ // 已完成

var downLink = "《~点我下载~》";

$("[data-load-tips]").html('导出完成,请点击下载保存至本地;'+downLink);

}

})

})(num);

});

}

后端代码,以Thinkphp为例

1、安装phpspreadsheet

composer require phpoffice/phpspreadsheet

2、逻辑代码,实现分页处理以及返回执行进度

namespace app\index\controller;

use lib\Dir;

use PhpOffice\PhpSpreadsheet\Spreadsheet;

use PhpOffice\PhpSpreadsheet\Writer\Xlsx;

class Index {

/**

* 返回当前需导出数据总数

* @return json

**/

public function download(){

if(!$this->request->isAjax()){

return 'error';die;

}

$param = $this->request->param();

$name = input('name','');

$where[] = ['parent_id', '=','1'];

$query = $this->app->db->name('member');

$total = $query->where($where)->count();

return json(['code'=>1,'data'=>['total'=>$total]]);

}

/**

* 执行数据分页处理

*/

public function downpage(){

$param = $this->request->param();

// 创建存储目录

$excelPath = $this->app->getRootPath()."public/excel/excel_".$this->user['id'].DIRECTORY_SEPARATOR;

$zipPath = $this->app->getRootPath()."public/excel/";

if(!is_dir($excelPath)){

mkdir($excelPath,0775);

}

// 导出用户

$page = $param['page'];

$query = $this->app->db->name('member');

$total = $query->where($where)->order('create_at desc')->count();

$limit = 2; // 每次执行2条

$totalSize = ceil($total / $limit);

$progress = ceil($page * 100 / $totalSize); // 执行进度

if($page < $totalSize){

$list = $query->where($where)->page((int)$page,(int)$limit)->select()->toArray();

// 执行数据excel数据写入操作

$this->exp_userDetail($list,"某某名下会有数据",$excelPath);

//

return json(['code'=>1,'data'=>['progress'=>$progress,'page'=>$page+1],'message'=>'>>>正在导出数据中,请勿关闭窗口<<

}

if($progress >= 100){

// 把所有文件生成压缩包

$zipName = $this->userData['nickname'].'_'.date('YmdHi').'_报表数据.zip';

$this->createZip($excelPath, $zipPath.$zipName);

// 删除所生成文件夹

$dir = new \lib\Dir();

$dir->delAll($excelPath);

return json(['code'=>3,'data'=>['progress'=>$progress,'page'=>$page,'downurl'=>"/excel/".$zipName],'message'=>'>>>导出完成<<

}

}

/**

* 生成压缩包

* @param $path

* @param $zipName

*/

protected function createZip($path,$zipName){

$zip = new \ZipArchive();

if($zip->open($zipName,\ZipArchive::CREATE) === true){

$dir = opendir($path);

while ($file = readdir($dir)){

if(is_file($path.$file)){

$zip->addFile($path.$file,$file);

}

}

$zip->close();

}

}

/**

* 数据写入excel文件

* @param $list Array 数据集

* @param $name String 生成文件名

* @param $path String 文件生成路径

*/

protected function exp_userDetail($list,$name,$path){

$spreadsheet = new Spreadsheet();

$sheet = $spreadsheet->getActiveSheet();

$title = ['姓名', '手机号码'];

$data = [];

foreach($list as $vo){

$data[] = [

'nickname'=> $vo['nickname'],

'phone'=> $vo['phone'],

];

}

foreach ($title as $key => $value) {

// 单元格内容写入

$sheet->setCellValueByColumnAndRow($key + 1, 1, $value);

}

$row = 2; // 从第二行开始

foreach ($data as $item) {

$column = 1;

foreach ($item as $value) {

// 单元格内容写入

$sheet->setCellValueByColumnAndRow($column, $row, $value);

$column++;

}

$row++;

}

$writer = new Xlsx($spreadsheet);

// 保存数据

$writer->save($path.$name.'_详细报表.xlsx');

}

}

xlsxwriter进度条php,PHP导出Excel数据导出,前端进度条实现方式相关推荐

  1. php导出excel数据使用csv替代xls格式

    为什么80%的码农都做不了架构师?>>>    php导出excel数据使用csv替代xls格式 一直以来需要将某些后台数据导出来以供运营人员查看,因为他们都用excel.所以最初的 ...

  2. java excel data 导入数据_java实现导入导出excel数据

    项目需要,要实现一个导入导出excel的功能,于是,任务驱动着我学习到了POI和JXL这2个java操作Excel的插件. 一.POI和JXL介绍 1.POI:是对所有office资源进行读写的一套工 ...

  3. exp导出excel oracle_OracleToExcel_Oracle导出excel数据(OracleToExcel)下载 v3.1 官方版 - 121下载站...

    OracleToExcel是一款免费的Oracle导出excel数据软件,可以将Oracle中的数据导出到excel中,支持单个表.所有表和SQL查询数据,支持输出clob和blob字段在Oracle ...

  4. java 动态导入excel_java实现导入导出excel数据

    项目需要,要实现一个导入导出excel的功能,于是,任务驱动着我学习到了POI和JXL这2个java操作Excel的插件. 一.POI和JXL介绍 1.POI:是对所有office资源进行读写的一套工 ...

  5. python导入excel数据-Python数据处理之导入导出excel数据

    欢迎点击上方"AntDream"关注我 .Python的一大应用就是数据分析了,而数据分析中,经常碰到需要处理Excel数据的情况.这里做一个Python处理Excel数据的总结, ...

  6. flask使用tablib导出excel数据表

    在网页中常常有导出数据的需求,尤其是一下管理类平台.在flask中要导出excel数据表,通常可以使用xlwt库,创建文件并逐行写入数据,但是使用起来总是感觉很麻烦.tablib库相对操作更加方便. ...

  7. php导出excel数据代码,phpspreadsheet导出数据到Excel的方法介绍(代码示例)

    本篇文章给大家带来的内容是关于phpspreadsheet导出数据到Excel的方法介绍(代码示例),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 之前我们使用PHP导出Excel数 ...

  8. asp sql 导出 excel_Mysql数据导出到excel基于python

    阅读本文大概需要 6分钟. 数据除了在测试平台显示,有时候也会习惯用excel以及邮件展示,那么我们可以在测试平台上加一个导出excel功能,方便操作,下面介绍主要代码以及逻辑. 使用操作数据库的py ...

  9. php把数据创建一个表格,PHP创建(导出Excel数据表格)

    /** * 创建(导出Excel数据表格) * @param  array   $list 要导出的数组格式的数据 * @param  string  $filename 导出的Excel表格数据表的 ...

最新文章

  1. 【转】实现多行toolTips的类模块
  2. Unity3D 入门 游戏开发 Unity3D portal game development
  3. WordPress Mail Subscribe List插件‘sml_name’参数HTML注入漏洞
  4. 两个字段位置相反去重_Flink零基础教程:并行度和数据重分布
  5. 方法调用_thinkphp跨模块调用方法
  6. ajaxsubmit方法的一种实现
  7. 常用的物理引擎,图形引擎
  8. linux初始化驱动程序,linux驱动程序什么时间初始化
  9. 两个小故事告诉你静下来的力量
  10. 小程序服务器mp4文件,如何添加小程序视频链接及获取MP4格式视频
  11. wex5 新建mysql数据库_wex5新增数据库
  12. 秦小明 第六讲 投融资,资产运作
  13. 快速集成百度定位功能
  14. 编写一个抽象类Shape,声明计算图形面积的抽象方法。再分别定义Shape的子类Circle(圆)和Rectangle(矩形),在两个子类中按照不同图形的面积计算公式,实现Shape类中计算面积的方法
  15. 印度乘法口诀双位数乘法详解
  16. macOS High Sierra 10.13正式版USB安装盘制作
  17. 【Solidity】零基础入门Solidity编写智能合约代码
  18. 个人收集的java精品网站
  19. H5创建webApp保存到桌面。
  20. 一些电脑使用的小tips

热门文章

  1. 电子计算机技发展趋势,现代电子信息技的现况及发展趋势.ppt
  2. 基于COMSOL的螺栓连接 的几种有限元建模方
  3. 剑侠世界职业优缺点简介
  4. 19-10-29-C++基础学习二
  5. 找出大文档中的所有手机号
  6. Thinking Everyday V: 在有微博之前
  7. 【脚本教程】脱机的一些指令参考
  8. Oracle 11g 停止正在运行的job
  9. containers详解
  10. java hypot_java.lang.StrictMath.hypot()方法实例