当前位置:首页 > 编程技术 > 正文内容

TP6.0 使用 phpoffice/phpspreadsheet 导入数据

yc8881年前 (2023-01-03)编程技术231

TP6.0 使用 phpoffice/phpspreadsheet 导入数据

引入扩展包

  1. composer require phpoffice/phpspreadsheet

1. 文件上传验证器类


  1. <?php
  2. declare(strict_types=1);
  3. namespace app\validate;
  4. use think\Validate;
  5. class Upload extends Validate
  6. {
  7. /**
  8. * 定义验证规则
  9. * 格式:'字段名' => ['规则1','规则2'...]
  10. *
  11. * @var array
  12. */
  13. protected $rule = [
  14. 'excel' => 'require|filesize:2097152|fileExt:xls,xlsx',
  15. ];
  16. /**
  17. * 定义错误信息
  18. * 格式:'字段名.规则名' => '错误信息'
  19. *
  20. * @var array
  21. */
  22. protected $message = [
  23. 'excel.require' => '没有文件上传',
  24. 'excel.filesize' => '图片大小不能超出2M',
  25. 'excel.fileExt' => '只支持xls,xlsx文件',
  26. ];
  27. }

2. 基础类库层


  1. <?php
  2. namespace app\lib;
  3. use PhpOffice\PhpSpreadsheet\IOFactory;
  4. use PhpOffice\PhpSpreadsheet\Cell\Coordinate;
  5. /**
  6. * Excel表格功能封装类
  7. */
  8. class Excel
  9. {
  10. /**
  11. * 读取表格数据
  12. *
  13. * @param string $name 文件域名称
  14. * @param array $field 表格各列对应的数据库字段
  15. * @param string $scene 验证场景
  16. */
  17. public static function readData(string $name, array $field, string $scene = 'excel')
  18. {
  19. try {
  20. $file = request()->file($name);
  21. if (!$file) throw new \Exception('没有文件上传');
  22. // Excel文件验证
  23. validate(\app\validate\Upload::class)->scene($scene)->check([$scene => $file]);
  24. // Excel 类型 Xls Excel2005 Xlsx Excel2007
  25. $type = ucfirst($file->getOriginalExtension());
  26. // 创建读操作对象
  27. $reader = IOFactory::createReader($type);
  28. // 忽略任何格式的信息
  29. $reader->setReadDataOnly(true);
  30. // 打开文件、载入excel表格
  31. $spreadsheet = $reader->load($file->getRealPath());
  32. // 获取活动工作薄
  33. $sheet = $spreadsheet->getActiveSheet();
  34. // 返回表格数据
  35. return self::getCellData($sheet, $field);
  36. } catch (\Exception $e) {
  37. // 有异常发生
  38. return ['code' => $e->getCode(), 'errMsg' => $e->getMessage()];
  39. }
  40. }
  41. /**
  42. * 获取单元格数据
  43. *
  44. * @param object $sheet
  45. * @param array $field
  46. */
  47. private static function getCellData(object $sheet, array $field)
  48. {
  49. # 获取最高列 返回字母 如: C
  50. $highestColumn = $sheet->getHighestColumn();
  51. # 获取最大行 返回数字 如: 4
  52. $highestRow = $sheet->getHighestRow();
  53. # 列数 改为数字显示
  54. $highestColumnIndex = Coordinate::columnIndexFromString($highestColumn);
  55. $data = [];
  56. // 从第二行开始读取数据
  57. for ($row = 2; $row <= $highestRow; $row++) {
  58. $build = [];
  59. // 从第一列读取数据
  60. for ($col = 1; $col <= $highestColumnIndex; $col++) {
  61. // 'A' 对应的ASCII码十进制为 64
  62. // 将ASCII值转为字符
  63. $chr = chr(64 + $col);
  64. // 列转为数据库字段名
  65. $key = $field[$chr] ?? $chr;
  66. // 构建当前行数据
  67. $build[$key] = $sheet->getCellByColumnAndRow($col, $row)->getValue();
  68. }
  69. $data[] = $build; //当前行数据
  70. }
  71. return $data;
  72. }
  73. }

3. 逻辑层


  1. <?php
  2. namespace app\logic;
  3. use think\facade\Db;
  4. use app\lib\Excel as LibExcel;
  5. /**
  6. * Excel表格逻辑层
  7. */
  8. class Excel
  9. {
  10. /**
  11. * 将Excel表格中的用户导入数据库
  12. *
  13. * @param string $name
  14. * @param array $field
  15. */
  16. public static function import(string $name, array $field)
  17. {
  18. // 读取数据
  19. $data = LibExcel::readData($name, $field);
  20. // 批量入库
  21. Db::name('user')->insertAll($data);
  22. }
  23. }

4. 控制器调用


  1. public function upload()
  2. {
  3. $field = [
  4. 'A' => 'name'

本站发布的内容若侵犯到您的权益,请邮件联系站长删除,我们将及时处理!


从您进入本站开始,已表示您已同意接受本站【免责声明】中的一切条款!


本站大部分下载资源收集于网络,不保证其完整性以及安全性,请下载后自行研究。


本站资源仅供学习和交流使用,版权归原作者所有,请勿商业运营、违法使用和传播!请在下载后24小时之内自觉删除。


若作商业用途,请购买正版,由于未及时购买和付费发生的侵权行为,使用者自行承担,概与本站无关。


本文链接:https://www.10zhan.com/biancheng/10323.html

标签: 软件编程
分享给朋友:

“TP6.0 使用 phpoffice/phpspreadsheet 导入数据” 的相关文章

【说站】laravel实现自定义404页面并给页面传值

【说站】laravel实现自定义404页面并给页面传值

以 laravel5.8 为例,虽然有自带的404页面,但太简单,我们更希望能自定义404页面,将用户留在站点。实现的方式很简单,将自定义的视图文件命名为 404.blade.php,并放到 reso...

【说站】Thymeleaf报错Error resolving template “XXX”

【说站】Thymeleaf报错Error resolving template “XXX”

修改了一下开源项目的目录结构访问突然报错Error resolving template “XXX”可能原因有如下三种:第一种可能:原因:在使用springboot的过程中,如果使用thymeleaf...

【说站】Java从resources读取文件内容的方法有哪些

【说站】Java从resources读取文件内容的方法有哪些

本文主要介绍的是java读取resource目录下文件的方法,比如这是你的src目录的结构├── main│ ├── java│ │ └── ...

【说站】linux中redis如何以redis用户重启?

【说站】linux中redis如何以redis用户重启?

通过上图我们可以看到,目前状态是已经以 redis 用户启动着,我想修改下 redis 的密码,然后怎么以 redis 用户重启呢?redis 是 nologin 用户,不能通过 su redis 切...

【说站】PHP使用Openssl实现本地生成csr、key、crt证书文件

【说站】PHP使用Openssl实现本地生成csr、key、crt证书文件

在Apache中要启用HTTPS访问,需要开启Openssl,也就需要crt和key两个和证书相关的文件了,那如果用制作呢?之前发过博文介绍过用在线生成的方式,但搞PHP编程的人有些东西还是想在自己的...

【说站】jenkins配置ssh服务器并配置ssh servers

【说站】jenkins配置ssh服务器并配置ssh servers

1.系统管理-》配置-》Publish over SSH当然,没有这个插件的第一时间去插件管理里面去下载2.生成秘钥任意找一台服务器,生成即可。2.1已有秘钥无须在生成,只需要吧公钥配置到将要配置的s...