博主信息
邯郸易住宋至刚
博文
53
粉丝
3
评论
0
访问量
25575
积分:0
P豆:127.5

20200206-PhpSpreadsheet文件下载与上传-***线上九期班

2020年02月06日 23:15:54阅读数:490博客 / 邯郸易住宋至刚/ 遇到的问题及解决方法

PhpSpreadsheet文件下载与上传

在实际项目中,使用excel上传和下载数据,是一个经常性的需求,我使用的一个软件中,一年要一万元,但是合同列表需要一份一份补录,浪费了我10来个员工将近一个月的时间,可谓费时费力。偶尔看到了“欧阳克”老师的视频课,经过学习,结合laravel框架知识,将PhpSpreadsheet实现在laravel中。

一、前端代码

1、数据列表及下载数据

  1. @extends('base')
  2. @section('title','日志列表')
  3. @section('content')
  4. <section class="Hui-article-box">
  5. <nav class="breadcrumb"><i class="Hui-iconfont"></i> 首页
  6. <span class="c-gray en">></span>
  7. 日志管理
  8. <span class="c-gray en">></span>
  9. 日志列表
  10. <a class="btn btn-success radius r" style="line-height:1.6em;margin-top:3px" href="javascript:location.replace(location.href);" title="刷新" ><i class="Hui-iconfont"></i></a>
  11. </nav>
  12. <div class="Hui-log">
  13. <article class="cl pd-20">
  14. <div class="text-c">
  15. <span class="select-box inline">
  16. <select name="" class="select">
  17. <option value="0">日志标题</option>
  18. </select>
  19. </span>
  20. <input type="text" name="wd" id="wd" onblur="search()" placeholder=" 标题关键字" style="width:250px" class="input-text" value="">
  21. <button name="" id="" onclick="search()" class="btn btn-success" type="button"><i class="Hui-iconfont"></i> 搜日志</button>
  22. </div>
  23. <div class="cl pd-5 bg-1 bk-gray mt-20">
  24. <span class="l">
  25. <a href="javascript:;" onclick="datadel()" class="btn btn-danger radius"><i class="Hui-iconfont"></i> 批量删除</a>
  26. <a class="btn btn-primary radius" data-title="添加日志" onclick="log_add()" href="javascript:;"><i class="Hui-iconfont"></i> 添加日志</a>
  27. <a href="/test/download" class="btn btn-primary radius" ><i class="Hui-iconfont"></i> 导出数据</a>
  28. <a href="javascript:;" onclick="data_upload()" class="btn btn-primary radius" ><i class="Hui-iconfont"></i> 导入数据</a>
  29. </span>
  30. <span class="r">共有数据:<strong>{{$total}}</strong> 条</span>
  31. </div>
  32. <div class="mt-20">
  33. <table class="table table-border table-bordered table-bg table-hover table-sort">
  34. <thead>
  35. <tr class="text-c">
  36. <th width="40"><input type="checkbox" name="" value=""></th>
  37. <th width="40">ID</th>
  38. <th width="40">UID</th>
  39. <th width="40">Client</th>
  40. <th width="40">添加时间</th>
  41. <th width="40">IP</th>
  42. <th width="80">操作</th>
  43. </tr>
  44. </thead>
  45. <tbody>
  46. @foreach($logs as $log)
  47. <tr class="text-c">
  48. <td><input type="checkbox" value="" name=""></td>
  49. <td>{{$log['ip']}}</td>
  50. <td>{{$log['uid']}}</td>
  51. <td>{{$log['client']}}</td>
  52. <td>{{$log['add_time']}}</td>
  53. <td>{{$log['ip']}}</td>
  54. <td>
  55. <a style="text-decoration:none" onClick="log_stop(this,{{$log['ip']}})" href="javascript:;" title="下架">
  56. <i class="Hui-iconfont"></i>
  57. </a>
  58. <a style="text-decoration:none" class="ml-5" onclick="log_add({{$log['ip']}})" href="javascript:;" title="编辑">
  59. <i class="Hui-iconfont"></i>
  60. </a>
  61. <a style="text-decoration:none" class="ml-5" onclick="log_del(this,{{$log['ip']}})" href="javascript:;" title="删除">
  62. <i class="Hui-iconfont"></i>
  63. </a>
  64. </td>
  65. </tr>
  66. @endforeach
  67. </tbody>
  68. </table>
  69. </div>
  70. <div >
  71. {{$links}}
  72. </div>
  73. </article>
  74. </div>
  75. </section>
  76. <script type="text/javascript">
  77. function data_upload() {
  78. layer.open({
  79. type:2
  80. ,shadeClose:true
  81. ,shadow:0.2
  82. ,area:['480px','360px']
  83. ,title:'数据上传'
  84. ,content:'/test/upload'
  85. })
  86. }
  87. </script>
  88. @endsection

2、数据上传及下载模板

  1. @extends('base')
  2. @section('title','导入页面')
  3. <link rel="stylesheet" href="/static/layui/css/layui.css">
  4. @section('content')
  5. <section class="Hui-article-box">
  6. <nav class="breadcrumb"><i class="Hui-iconfont"></i> 首页
  7. <span class="c-gray en">></span>
  8. 图片管理
  9. <span class="c-gray en">></span>
  10. 图片列表
  11. <a class="btn btn-success radius r" style="line-height:1.6em;margin-top:3px" href="javascript:location.replace(location.href);" title="刷新" ><i class="Hui-iconfont"></i></a>
  12. </nav>
  13. <div class="Hui-log">
  14. @csrf
  15. <div class="cl pd-5 bg-1 bk-gray mt-20" style="margin: 80px 100px">
  16. <span class="l">
  17. <button id="up" class="btn btn-primary radius" ><i class="Hui-iconfont"></i> 选择文件</button>
  18. <button onclick="model_download()" class="btn btn-primary radius" ><i class="Hui-iconfont"></i> 下载模板</button>
  19. </span>
  20. </div>
  21. </div>
  22. </section>
  23. <script type="text/javascript" src="/static/layui/layui.all.js"></script>
  24. <script type="text/javascript" src="/static/layui/layui.js"></script>
  25. <script type="text/javascript">
  26. layui.use('upload', function() {
  27. var $ = layui.jquery;
  28. var upload = layui.upload;
  29. upload.render({
  30. elem: '#up'
  31. , url: '/test/uploadsave'
  32. , data: {
  33. '_token': function () {
  34. return $('input[name="_token"]').val();
  35. }
  36. }
  37. , accept: 'file' //普通文件
  38. , done: function (res) {
  39. if (res.code == 0) {
  40. for (var i = 0; i < res.data.length; i++) {
  41. $("#log").append('<div>' + res.data[i] + '</div>');
  42. }
  43. }
  44. }
  45. });
  46. })
  47. //model_download
  48. function model_download() {
  49. window.location.href = '/test/model_download'
  50. }
  51. </script>
  52. @endsection

二、服务器端代码

1、引入文件

  1. use Illuminate\Http\Request;
  2. use App\Http\Controllers\Controller;
  3. use Illuminate\Support\Facades\DB;
  4. use PhpOffice\PhpSpreadsheet\Spreadsheet;
  5. use PhpOffice\PhpSpreadsheet\Writer\Xlsx;
  6. use PhpOffice\PhpSpreadsheet\IOFactory;
  7. use PhpOffice\PhpSpreadsheet\Cell\Coordinate;

2、下载数据

  1. //下载数据
  2. public function download()
  3. {
  4. //设置表头
  5. $spreadsheet = new Spreadsheet();
  6. $sheet = $spreadsheet -> getActiveSheet();
  7. $cell1= $sheet->getCell('A1')->setValue('ID');
  8. $cell2= $sheet->getCell('B1')->setValue('用户ID');
  9. $cell3= $sheet->getCell('C1')->setValue('登录设备');
  10. $cell4= $sheet->getCell('D1')->setValue('登录时间');
  11. $cell5= $sheet->getCell('E1')->setValue('登录IP');
  12. //查询数据
  13. $logs = DB::table('login_log')->lists();
  14. //添加数据
  15. $sheet->fromArray(
  16. $logs,
  17. null,
  18. 'A2'
  19. );
  20. //下载数据
  21. // MIME 协议,文件的类型,不设置,会默认html
  22. header('Content-Type:application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
  23. // MIME 协议的扩展
  24. header('Content-Disposition:attachment;filename=登录日志.xlsx');
  25. // 缓存控制
  26. header('Cache-Control:max-age=0');
  27. $writer = IOFactory::createWriter($spreadsheet, 'Xlsx');
  28. // php://output 它是一个只写数据流, 允许你以 print 和 echo一样的方式写入到输出缓冲区。
  29. $writer->save('php://output');
  30. }

3、上传页面

  1. //upload页面
  2. public function upload()
  3. {
  4. return view('admins.test.upload');
  5. }

4、上传处理

  1. public function uploadsave()
  2. {
  3. $file = $_FILES['file']['tmp_name'];
  4. # 创建读操作
  5. $reader = IOFactory::createReader('Xlsx');
  6. # 打开文件、载入excel表格
  7. $spreadsheet = $reader->load($file);
  8. # 获取活动工作薄
  9. $sheet = $spreadsheet->getActiveSheet();
  10. # 获取总列数
  11. $highestColumn = $sheet->getHighestColumn();
  12. # 获取总行数
  13. $highestRow = $sheet->getHighestRow();
  14. # 列数 改为数字显示
  15. $highestColumnIndex = Coordinate::columnIndexFromString($highestColumn);
  16. $log = [];
  17. for($a=2;$a<$highestRow;$a++){
  18. $id = $sheet->getCellByColumnAndRow(1,$a)->getValue();
  19. $uid = $sheet->getCellByColumnAndRow(2,$a)->getValue();
  20. $client = $sheet->getCellByColumnAndRow(3,$a)->getValue();
  21. $add_time = $sheet->getCellByColumnAndRow(4,$a)->getValue();
  22. $ip = $sheet->getCellByColumnAndRow(5,$a)->getValue();
  23. **$data = [
  24. 'id' => $id,
  25. 'uid' => $uid,
  26. 'client' => $client,
  27. 'add_time' => $add_time,
  28. 'ip' => $ip,
  29. ];**
  30. $ins = DB::table('login_log')->insert($data);
  31. if($ins){
  32. $log[] = '第'.$a.'条,插入成功';
  33. }else{
  34. $log[] = '第'.$a.'条,插入失败';
  35. }
  36. }
  37. return json_encode(['code'=>0,'msg'=>'成功','data'=>$log]);
  38. }

4、下载模板

  1. public function model_download()
  2. {
  3. $spreadsheet = new Spreadsheet();
  4. $sheet = $spreadsheet -> getActiveSheet();
  5. $cell1= $sheet->getCell('A1')->setValue('ID');
  6. $cell2= $sheet->getCell('B1')->setValue('用户ID');
  7. $cell3= $sheet->getCell('C1')->setValue('登录设备');
  8. $cell4= $sheet->getCell('D1')->setValue('登录时间');
  9. $cell5= $sheet->getCell('E1')->setValue('登录IP');
  10. //download
  11. // MIME 协议,文件的类型,不设置,会默认html
  12. header('Content-Type:application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
  13. // MIME 协议的扩展
  14. header('Content-Disposition:attachment;filename=模板文件.xlsx');
  15. // 缓存控制
  16. header('Cache-Control:max-age=0');
  17. $writer = IOFactory::createWriter($spreadsheet, 'Xlsx');
  18. // php://output 它是一个只写数据流, 允许你以 print 和 echo一样的方式写入到输出缓冲区。
  19. $writer->save('php://output');
  20. }

三、问题

1、单元格格式具体有哪些?视频中只提到了设置的方法,没有列举更多的格式,

尤其是如果单元格需要是时间格式时,总不能要求把我们习惯的“Y-m-d H:i:s”写入时间表?

2、怎么说填表说明

3、怎么设置成可选下拉菜单一样的效果?

4、返回的信息如何接收和显示?还没有实现

版权申明:本博文版权归博主所有,转载请注明地址!如有侵权、违法,请联系admin@php.cn举报处理!

全部评论

文明上网理性发言,请遵守新闻评论服务协议

条评论