查看: 996|回复: 0

fastadmin使用phpoffice实现服务端自定义导出功能

[复制链接]

748

主题

39

回帖

3907

积分

管理员

总舵主

积分
3907
QQ
发表于 2024-5-31 20:08:01 | 显示全部楼层 |阅读模式
第一步,要在列表对应的js文件内增加一段代码:

  1. $(document).on("click", ".btn-export", function () {
  2.                 console.log('eeee')
  3.                 var ids = Table.api.selectedids(table);
  4.                 var page = table.bootstrapTable('getData');
  5.                 var all = table.bootstrapTable('getOptions').totalRows;
  6.                 console.log(ids, page, all);
  7.                 Layer.confirm("请选择导出的选项<form action='" + Fast.api.fixurl("map/shortlink/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>", {
  8.                     title: '导出数据',
  9.                     btn: ["选中项(" + ids.length + "条)", "本页(" + page.length + "条)", "全部(" + all + "条)"],
  10.                     success: function (layero, index) {
  11.                         $(".layui-layer-btn a", layero).addClass("layui-layer-btn0");
  12.                     }
  13.                     , yes: function (index, layero) {
  14.                         submitForm(ids.join(","), layero);
  15.                         return false;
  16.                     }
  17.                     ,
  18.                     btn2: function (index, layero) {
  19.                         var ids = [];
  20.                         $.each(page, function (i, j) {
  21.                             ids.push(j.id);
  22.                         });
  23.                         submitForm(ids.join(","), layero);
  24.                         return false;
  25.                     }
  26.                     ,
  27.                     btn3: function (index, layero) {
  28.                         submitForm("all", layero);
  29.                         return false;
  30.                     }
  31.                 })
  32.             });
  33.             var submitForm = function (ids, layero) {
  34.                 var options = table.bootstrapTable('getOptions');
  35.                 console.log(options);
  36.                 var columns = [];
  37.                 $.each(options.columns[0], function (i, j) {
  38.                     if (j.field && !j.checkbox && j.visible && j.field != 'operate') {
  39.                         columns.push(j.field);
  40.                     }
  41.                 });
  42.                 var search = options.queryParams({});
  43.                 $("input[name=search]", layero).val(options.searchText);
  44.                 $("input[name=ids]", layero).val(ids);
  45.                 $("input[name=filter]", layero).val(search.filter);
  46.                 $("input[name=op]", layero).val(search.op);
  47.                 $("input[name=columns]", layero).val(columns.join(','));
  48.                 $("form", layero).submit();
  49.             };
复制代码
添加在:
  1. // 为表格绑定事件
  2. Table.api.bindevent(table);
复制代码
这个代码下面。
第二步,需要在对应的控制器文件内新增导出方法,代码如下:
  1. /**
  2.      * 导出订单数据
  3.      */
  4.     public function export()
  5.     {
  6.         $ids = $this->request->post("ids");
  7.         $filter = $this->request->post("filter");
  8.         $op = $this->request->post("op");
  9.         $search = $this->request->post("search");
  10.         // $columns = $this->request->post("columns");
  11.         $columns = ['id','shopname','realname','mobile','address','linkurl'];

  12.         // 解析搜索条件
  13.         $where = [];
  14.         if ($filter) {
  15.             $filter = (array)json_decode($filter, true);
  16.             $op = (array)json_decode($op, true);
  17.             foreach ($filter as $key => $val) {
  18.                 if (isset($op[$key])) {
  19.                     switch ($op[$key]) {
  20.                         case 'LIKE':
  21.                             $where[] = [$key, 'like', "%{$val}%"];
  22.                             break;
  23.                         case '=':
  24.                             $where[] = [$key, '=', $val];
  25.                             break;
  26.                         case 'IN':
  27.                             $where[] = [$key, 'in', $val];
  28.                             break;
  29.                     }
  30.                 }
  31.             }
  32.             // 获取数据
  33.             $list = $this->model->where($where)->field($columns)->select();
  34.             $list = collection($list)->toArray();
  35.         }

  36.         // 如果选择了全部导出,则忽略ids
  37.         if ($ids !== 'all') {
  38.             $ids = explode(',', $ids);
  39.             // 获取数据
  40.             $list = $this->model->where('id', 'in', $ids)->field($columns)->select();
  41.             $list = collection($list)->toArray();
  42.         }

  43.         
  44.         
  45.         // 获取字段注释
  46.         $table = $this->model->getTable();
  47.         $fieldComments = $this->getFieldComments($table, $columns);

  48.         // 创建一个新的 Spreadsheet 对象
  49.         $spreadsheet = new Spreadsheet();
  50.         $sheet = $spreadsheet->getActiveSheet();

  51.         // 设置表头
  52.         $colIndex = 1;
  53.         foreach ($columns as $column) {
  54.             $sheet->setCellValueByColumnAndRow($colIndex, 1, isset($fieldComments[$column]) ? $fieldComments[$column] : $column);
  55.             $colIndex++;
  56.         }

  57.         // 设置数据
  58.         $rowIndex = 2;
  59.         foreach ($list as $row) {
  60.             $this->model->where('id', $row['id'])->update(['status'=>1]);
  61.             $colIndex = 1;
  62.             foreach ($columns as $column) {
  63.                 $sheet->setCellValueByColumnAndRow($colIndex, $rowIndex, $row[$column]);
  64.                 $colIndex++;
  65.             }
  66.             $rowIndex++;
  67.         }

  68.         // 导出 Excel 文件
  69.         $filename = '短链数据导出_' . date('Y-m-d_H_i_s') . '.xlsx';
  70.         header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
  71.         header('Content-Disposition: attachment;filename="' . $filename . '"');
  72.         header('Cache-Control: max-age=0');
  73.         
  74.         $writer = new Xlsx($spreadsheet);
  75.         $writer->save('php://output');
  76.         exit;
  77.     }
  78.    
  79.     /**
  80.      * 获取字段注释
  81.      * @param string $table
  82.      * @param array $columns
  83.      * @return array
  84.      */
  85.     private function getFieldComments($table, $columns)
  86.     {
  87.         $fieldComments = [];
  88.         $result = Db::query("SHOW FULL COLUMNS FROM `{$table}`");
  89.         foreach ($result as $column) {
  90.             if (in_array($column['Field'], $columns)) {
  91.                 $fieldComments[$column['Field']] = $column['Comment'];
  92.             }
  93.         }
  94.         return $fieldComments;
  95.     }
复制代码
需要再控制器文件增加phpoffice功能文件的引用,代码如下:
  1. use PhpOffice\PhpSpreadsheet\Spreadsheet;
  2. use PhpOffice\PhpSpreadsheet\Writer\Xlsx;
复制代码
这样导出功能就完成了,亲测可用,有偿操作可联系QQ2513533699

道不同,不相为谋!理想要有,万一实现了呢?
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关注公众号

相关侵权、举报、投诉及建议等,请发 E-mail:2513533699@qq.com

Powered by Discuz! X5.0 © 2001-2026 Discuz! Team.|鲁ICP备19000917号|鲁公网安备37078302000320号

在本版发帖
关注公众号
QQ客服返回顶部