fastadmin 根据不同时间导出不同的数据 (自定义按钮)

场景:  导出每个企业(分后台) 的 用户 在某一天的上岗状态。

废话不多说 直接上代码

controller

public function export()

    {
       //这里是自己获取参数去查数据
        $time = input('time');
        $timestamp = strtotime($time);
        $timestamp_end = $timestamp + 86400-1;

         //这里是通过列表缓存搜索等查

//        //从缓存中获得列表页面的参数
//        $arr = Cache::get("param-{$this->auth->id}");
//        //导出页面直接使用列表页的搜索参数
//        $this->request->get($arr);
//        list($where, $sort, $order, $offset, $limit) = $this->buildparams();
//        $list = $this->model
//            ->where($where)
//            ->order($sort, $order)
//            ->paginate(50000);
//是当前管理员di
        $admin_id = $this->auth->id;
        $list = $this->model->where('admin_id',$admin_id)
        ->order('id asc')
        ->select();
        foreach ($list as $row) {
            //这里是数据处理
            $row['test_status'] = '未答题'; //未答题
            $weida_tests = UserEveryTest::where('user_id',$row['id'])
                ->where('duicuo',0)
                ->where('createtime','between time',[$timestamp,$timestamp_end])
                ->count();
            $dui_tests = UserEveryTest::where('user_id',$row['id'])
                ->where('duicuo',1)
                ->where('createtime','between time',[$timestamp,$timestamp_end])
                ->count();
            $cuo_tests = UserEveryTest::where('user_id',$row['id'])
                ->where('duicuo',2)
                ->where('createtime','between time',[$timestamp,$timestamp_end])
                ->count();

            if( $weida_tests >0 ){
                $row['test_status'] = '未答题';
            }elseif($cuo_tests > 0){
                $row['test_status'] = '不可上岗';
            }elseif($dui_tests > 0 && $weida_tests  == 0 && $cuo_tests == 0){
                $row['test_status'] = '可上岗';
            }

            if($row['is_guan'] == 1){
                $row['is_guan'] = '管理员'; 
            }else{
                $row['is_guan'] = '员工'; 
            }

        }
        $out = [];
        //获得要导出的数据列表
//        $export_list  = $list->toArray()["data"];
        $out = [];
        //利用循环把列表中需要导出到xls的字段找出来进行处理
        foreach($list as $k =>$v){
            $out[$k]["nickname"] = $v["nickname"];
            $out[$k]["category_name"] = $v["category_name"];
            $out[$k]["is_guan"] = $v["is_guan"];
            $out[$k]["test_status"] = $v["test_status"];

        }
        //这是表头字段名称
        $title = array (
            0 => '姓名',
            1 => '部门',
            2 => '身份',
            3 => '状态',
        );
        //字段值
        $key = [
            'nickname',
            'category_name',
            'is_guan',
            'test_status'
        ];
        //保存的文件名
        $filename = "user_test_status".date('Y-m-d H:i:s',time());
        $excel = new Export(); //此类后面有说明
        $excel->getFile($filename,$title,$key,$out); //文件名称  标题  字段  数据

    }

index.html

   <div class="widget-body no-padding">
                    <div id="toolbar" class="toolbar" style="display:flex;">
                        {:build_toolbar('refresh,edit,del')}
                        <input type="text" class="form-control datetimepicker datetimepickerY" name="year" value="{:date('Y-m-d')}" id="year" data-index="12" autocomplete="off">
                        <a href="javascript:;" class="btn btn-danger" id="excel_dc"> {:__('导出')}</a>
                    </div>
                    <table id="table" class="table table-striped table-bordered table-hover table-nowrap"
                           data-operate-edit="{:$auth->check('user/user/edit')}"
                           data-operate-del="{:$auth->check('user/user/del')}"
                           width="100%">
                    </table>
                </div>

user.js

// 为表格绑定事件
    Table.api.bindevent(table);
    require(['bootstrap-datetimepicker'], function () {
        var options = {
            format: 'YYYY-M-D',
            icons: {
                time: 'fa fa-clock-o',
                date: 'fa fa-calendar',
                up: 'fa fa-chevron-up',
                down: 'fa fa-chevron-down',
                previous: 'fa fa-chevron-left',
                next: 'fa fa-chevron-right',
                today: 'fa fa-history',
                clear: 'fa fa-trash',
                close: 'fa fa-remove'
            },
            showTodayButton: true,
            showClose: true
        };
        $('.datetimepickerY').parent().css('position', 'relative');
        $('.datetimepickerY').datetimepicker(options);
    });
    $("#year").on("dp.update", function(){
        var that = this;
        $("select[name='quarter']").val('');
        $("select[name='month']").val('');
        var options = table.bootstrapTable('getOptions');
        options.pageNumber = 1;
        options.queryParams = function (params) {
            params.year = $(that).val(); // 值
            console.log(params);
            return params;
        };
        table.bootstrapTable('refresh', {});
        return false;
    });
    $('#excel_dc').click(function(){
        var   times =  $("#year").val();
        var url='user/export?time='+times;
        window.open(url);
    });
},

有这个class  这边是直接放到app/common/library/

<?php

namespace app\common\library;

use PhpOffice\PhpSpreadsheet\IOFactory;
use PhpOffice\PhpSpreadsheet\Spreadsheet;

class Export
{
    /**
     * @param String $title          表格标题
     * @param Array $headerArr      标题行
     * @param Array $fieldArr         字段名称
     * @param object/Array $data           数据
     * @return void
     * @throws \PHPExcel_Exception
     * @throws \PHPExcel_Reader_Exception
     * @throws \PHPExcel_Writer_Exception
     * 字段名称与标题行  一一对应
     */
    public function getFile($title, $headerArr, $fieldArr, $data){
        set_time_limit(0);//设置时间限制
        @ini_set('memory_limit','256M');   //  防止内存溢出
        //实例化一个新的excel文档
        $excelObj = new Spreadsheet();
        $excelObj->getProperties()->setCreator('灵朗设计')->setTitle($title);
        //获取当前操作sheet的对象
        $worksheet = $excelObj->getActiveSheet();

        //设置表头  设置标题行     // 参数:列、行
        if($headerArr){
            foreach ($headerArr as $k=>$v){
                $worksheet->setCellValueByColumnAndRow($k+1,1,$v);
            }
        }
        $styleArrayFirstRow = [
            'font' => [
                'bold' => true,
            ]
        ];
        $highestColumn = $worksheet->getHighestColumn();
        $worksheet->getStyle('A1:' . $highestColumn . '1' )->applyFromArray($styleArrayFirstRow);

        // 设置数据
        if($data){
            foreach ($data as $k => $val){
                $val = is_array($val) ? $val :$val->toArray();
                //  每列数据,与标题行  一一对应
                if($fieldArr){
                    foreach ($fieldArr as $key => $value){
                        $temp = $val;
                        $tempKeyArr = explode('.',$value);
                        if($tempKeyArr){
                            foreach ($tempKeyArr as $kk=>$vv){
                                if(isset($temp[$vv])){
                                    $temp =  $temp[$vv]  ;
                                }
                            }
                        }
                        $temp = is_array($temp) ? '' : $temp;
                        //数据格式化
                        if(($value == 'mobile') || ($value == 'phone') || ($value == 'license_no')){
                            $temp = ' '.$temp;
                        }elseif (preg_match('/time$/', $value)){
                            $temp = is_numeric($temp) ? date('Y-m-d H:i:s',$temp) : $temp;
                        }
                        $worksheet->setCellValueByColumnAndRow($key+1,$k+2,$temp);
                    }
                }
            }
        }
        // MIME 协议,文件的类型,不设置,会默认html
        header('Content-Type:application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
        // MIME 协议的扩展
        header('Content-Disposition:attachment;filename='.$title .'.xlsx');
        // 缓存控制
        header('Cache-Control:max-age=0');
        $write = IOFactory::createWriter($excelObj, 'Xlsx');
        $write->save('php://output');
        exit;
    }
}

点击导出直接就下载了

  • 10
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
在EasyExcel中,我们可以使用注解来自定义导出不同的列。首先,我们需要创建一个自定义的实体类,用于存储需要导出数据。在这个实体类中,我们可以使用@ExcelProperty注解来指定每个字段在导出时的列名和顺序。 例如,我们有一个实体类User,包含以下字段:id、name、age和email。我们希望在导出时只显示name和email这两列,可以进行如下配置: ```java public class User { @ExcelProperty("姓名") private String name; @ExcelProperty("邮箱") private String email; // 省略其他字段的定义及getter/setter方法 } ``` 在这个示例中,通过@ExcelProperty注解指定了字段name对应导出的列名为"姓名",字段email对应导出的列名为"邮箱"。 接下来,我们需要创建一个导出Excel的方法,并使用EasyExcel来实现导出功能。在这个方法中,我们需要指定要导出数据列表和目标文件的路径。 ```java public void exportExcel(List<User> userList, String filePath) { try { // 创建导出的 ExcelWriter 对象 ExcelWriter excelWriter = EasyExcel.write(filePath, User.class).build(); // 创建Sheet对象 WriteSheet sheet = EasyExcel.writerSheet().sheetName("用户信息").build(); // 写入数据 excelWriter.write(userList, sheet); // 关闭资源 excelWriter.finish(); } catch (Exception e) { e.printStackTrace(); } } ``` 通过以上代码,我们可以实现将指定的User列表导出到指定路径的Excel中,并且只包含name和email这两列。 总结起来,要实现在EasyExcel中自定义导出不同的列,我们需要在实体类中使用@ExcelProperty注解来配置每个字段的列名和顺序,并在导出时指定要导出数据列表和目标文件路径。这样就可以轻松地实现自定义导出不同的列功能了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值