Переглянути джерело

20250326 学员成绩导出

贾小兵 1 місяць тому
батько
коміт
f813eeaf3a

+ 143 - 0
application/admin/controller/teacher/Exams.php

@@ -10,6 +10,13 @@ use think\exception\ValidateException;
 use app\admin\model\teacher\ExamsScore;
 use app\admin\model\Fault;
 use app\admin\model\Report;
+
+use PhpOffice\PhpSpreadsheet\Cell\Coordinate;
+use PhpOffice\PhpSpreadsheet\IOFactory;
+use PhpOffice\PhpSpreadsheet\Spreadsheet;
+use PhpOffice\PhpSpreadsheet\Reader\Csv;
+use PhpOffice\PhpSpreadsheet\Reader\Xls;
+use PhpOffice\PhpSpreadsheet\Reader\Xlsx;
 /**
  * sim-考试表/成绩总分
  *
@@ -24,6 +31,7 @@ class Exams extends Backend
      */
     protected $model = null;
     protected $whereExtend = null;
+    protected $noNeedRight = ['export'];
     public function _initialize()
     {
         parent::_initialize();
@@ -452,4 +460,139 @@ class Exams extends Backend
         }
         $this->success();
     }
+
+    public function export()
+    {
+        set_time_limit(0);
+        ini_set('memory_limit', '2560M');
+
+        //如果发送的来源是 Selectpage,则转发到 Selectpage
+        if ($this->request->request('keyField')) {
+            return $this->selectpage();
+        }
+
+        $filter = $this->request->get("filter", '');
+        $filter = (array)json_decode($filter, true);
+        $op = $this->request->get("op", '');
+        $op = (array)json_decode($op, true);
+
+        [$where, $sort, $order, $offset, $limit] = $this->buildparams();
+        $list = $this->model
+            ->where($where)->where($this->whereExtend)
+            ->order($sort, $order)
+            ->paginate($limit);
+
+        $xlsName = '学员成绩信息';
+        $this->exportExcel($xlsName,'Excel2007', $list);
+    }
+
+    /**
+     * 输出到浏览器(需要设置header头)
+     * @param string $fileName 文件名
+     * @param string $fileType 文件类型
+     */
+    function exportExcel($fileName, $fileType,$data)
+    {
+        //文件名称校验
+        if (!$fileName) {
+            trigger_error('文件名不能为空', E_USER_ERROR);
+        }
+        //Excel文件类型校验
+        $type = ['Excel2007', 'Xlsx', 'Excel5', 'xls'];
+        if (!in_array($fileType, $type)) {
+            trigger_error('未知文件类型', E_USER_ERROR);
+        }
+
+        $ext = '';
+
+        if ($fileType == 'Excel2007' || $fileType == 'Xlsx') {
+            header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
+            header('Content-Disposition: attachment;filename="' . $fileName . '.xlsx"');
+            header('Cache-Control: max-age=0');
+            $ext = 'Xlsx';
+        } else { //Excel5
+            header('Content-Type: application/vnd.ms-excel');
+            header('Content-Disposition: attachment;filename="' . $fileName  . '.xls"');
+            header('Cache-Control: max-age=0');
+            $ext = 'Xls';
+        }
+        $spreadsheet = new Spreadsheet();
+        $worksheet = $spreadsheet->getActiveSheet();
+        $worksheet->getColumnDimension('A')->setWidth(15);
+        $worksheet->getColumnDimension('B')->setWidth(15);
+        $worksheet->getColumnDimension('C')->setWidth(15);
+        $worksheet->getColumnDimension('D')->setWidth(15);
+
+        $worksheet->getRowDimension('1')->setRowHeight(25);
+
+        //设置工作表标题名称
+        $worksheet->setTitle('学员成绩信息');
+
+        $worksheet->setCellValue('A1',"序号");
+        $worksheet->setCellValue('B1',"学号");
+        $worksheet->setCellValue('C1',"姓名");
+        $worksheet->setCellValue('D1',"总分");
+
+
+        foreach ($data as $ky => $value)
+        {
+            $lie = $ky+2;
+            $worksheet->setCellValue('A'.$lie,++$ky);
+            $worksheet->setCellValue('B'.$lie,$value['user_username']);
+            $worksheet->setCellValue('C'.$lie,$value['user_nickname']);
+            $worksheet->setCellValue('D'.$lie,$value['total_score']);
+        }
+
+
+        $titlestyleArray = [
+            'font' => [
+                'name' => '黑体',
+                'size' => 14
+            ],
+        ];
+        $headerStyleArray = [
+            'font' => [
+                'name' => '方正小标宋简体',
+                'size' => 18
+            ],
+        ];
+
+        $commonStyleArray = [
+            'alignment' => [
+                'horizontal' => \PhpOffice\PhpSpreadsheet\Style\Alignment::HORIZONTAL_CENTER,
+                'vertical' => \PhpOffice\PhpSpreadsheet\Style\Alignment::VERTICAL_CENTER,
+                'wrapText' => true,
+            ]
+        ];
+        $borderStyleArray = [
+            'borders' => [
+                'allBorders' => [
+//                    'borderStyle' => \PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN,
+                ],
+            ],
+            'font' => [
+                'name' => '黑体',
+            ],
+            'alignment' => [
+                'horizontal' => \PhpOffice\PhpSpreadsheet\Style\Alignment::HORIZONTAL_CENTER,
+                'vertical' => \PhpOffice\PhpSpreadsheet\Style\Alignment::VERTICAL_CENTER,
+                'wrapText' => true,
+            ]
+        ];
+        $worksheet->getStyle('A1:D1')->applyFromArray($titlestyleArray);
+        $worksheet->getStyle('A1:D1')->applyFromArray($commonStyleArray);
+        foreach ($data as $k=>$v){
+            $kk  = $k+2;
+            $worksheet->getStyle('A'.$kk.':D'.$kk)->applyFromArray($borderStyleArray);
+        }
+        // $worksheet->getStyle('A3:R3')->applyFromArray($commonStyleArray);
+        // $worksheet->getStyle('A'.$footer_total.':R'.$footer_total)->applyFromArray($commonStyleArray);
+        // $worksheet->getStyle('A1:C1')->applyFromArray($borderStyleArray);
+        // $worksheet->mergeCells('A1:R1');
+        $writer = IOFactory::createWriter($spreadsheet,$ext);
+        $writer->save('php://output');
+        die();
+    }
+
+
 }

+ 2 - 0
application/admin/view/teacher/exams/index.html

@@ -12,7 +12,9 @@
                         <a href="javascript:;" class="btn btn-success btn-edit btn-disabled disabled {:$auth->check('teacher/exams/edit')?'':'hide'}" title="{:__('Edit')}" ><i class="fa fa-pencil"></i> {:__('Edit')}</a>
 <!--                        <a href="javascript:;" class="btn btn-danger btn-del btn-disabled disabled {:$auth->check('teacher/exams/del')?'':'hide'}" title="{:__('Delete')}" ><i class="fa fa-trash"></i> {:__('Delete')}</a>-->
 
+
                         <a href="javascript:;" class="btn btn-info btn-view btn-disabled disabled {:$auth->check('teacher/exams/view')?'':'hide'}" title="{:__('Edit')}" ><i class="fa fa-eye"></i> {:__('成绩详情')}</a>
+                        <a href="javascript:;" class="btn btn-success btn-export" title="导出成绩" ><i class="fa fa-download"></i> 导出成绩</a>
 
                     </div>
                     <table id="table" class="table table-striped table-bordered table-hover table-nowrap"

+ 5 - 2
public/assets/js/backend/department/admin.js

@@ -243,8 +243,11 @@ define(['jquery', 'bootstrap', 'backend', 'table', 'form'], function ($, undefin
                 var filter = JSON.parse(search.filter);
                 var op = JSON.parse(search.op);
                 url = '/admin/department/admin/export';
-                if(url)
-                    location.href= url + '?filter='+JSON.stringify(filter)+'&op='+JSON.stringify(op);
+                if(url){
+                    window.open(url+ '?filter='+JSON.stringify(filter)+'&op='+JSON.stringify(op));
+                }
+                // if(url)
+                //     location.href= url + '?filter='+JSON.stringify(filter)+'&op='+JSON.stringify(op);
             });
 
         },

+ 17 - 0
public/assets/js/backend/teacher/exams.js

@@ -151,6 +151,23 @@ define(['jquery', 'bootstrap', 'backend', 'table', 'form','editable'], function
                 var title = '成绩详情';
                 Fast.api.open(Fast.api.fixurl("teacher/exams/view/ids/"+ids), title, { area: ["75%", "95%"] });
             });
+
+            //导出
+            $(document).on("click", ".btn-export", function () {
+                var parenttable = table.closest('.bootstrap-table');
+                var options = table.bootstrapTable('getOptions');
+                var toolbar = $(options.toolbar, parenttable);
+                // 导出
+                var options = table.bootstrapTable('getOptions');
+                var search = options.queryParams({});
+                var filter = JSON.parse(search.filter);
+                var op = JSON.parse(search.op);
+                url = '/admin/teacher/exams/export';
+                if(url){
+                    window.open(url+ '?filter='+JSON.stringify(filter)+'&op='+JSON.stringify(op));
+                }
+            });
+
         },
         persent: function () {
             Table.api.init({