[CodeIgniter4]phpspreadsheet的使用
[CodeIgniter4]phpspreadsheet的使用
使用一个开源库第一步肯定是要看官网文档咯,看完就要爬坑,爬坑就要写个博客压压惊
https://phpspreadsheet.readthedocs.io/en/latest/
环境依赖
- PHP >= 5.6
- PHP_ZIP拓展
- PHP_XML拓展
- PHP_GD拓展
第一步安装
composer require phpoffice/phpspreadsheet
可能会有安装失败问题,请修改php.ini文件,lnmp的php.ini的位置:/usr/local/php/etc/php.ini
disable_functions修改成如下即可,如果还不行就继续根据错误提示删除下面限制的函数。
disable_functions = passthru,exec,system,chroot,chgrp,chown,shell_exec,popen,ini_alter,ini_restore,dl,openlog,syslog,readlink,symlink,popepassthru,stream_socket_server
第二步使用
官方示例
<?php require 'vendor/autoload.php'; use PhpOffice\PhpSpreadsheet\Spreadsheet; use PhpOffice\PhpSpreadsheet\Writer\Xlsx; $spreadsheet = new Spreadsheet(); $sheet = $spreadsheet->getActiveSheet(); $sheet->setCellValue('A1', 'Hello World !'); $writer = new Xlsx($spreadsheet); $writer->save('hello world.xlsx');
CI4使用示例
此控制器位置\app\Controllers\Test\Index.php
输出文件到网站根目录,即public里面
<?php namespace App\Controllers\Test; // 采用命名空间的方式调用这个功能 use App\Controllers\BaseController; use PhpOffice\PhpSpreadsheet\Spreadsheet; use PhpOffice\PhpSpreadsheet\Writer\Xlsx; class Index extends BaseController { public function __construct() { } public function index() { $spreadsheet = new Spreadsheet(); $sheet = $spreadsheet->getActiveSheet(); $sheet->setCellValue('A1', 'Hello World !'); //输出文件到网站根目录,也就是public里面 $writer = new Xlsx($spreadsheet); $writer->save('hello world.xlsx'); }
直接输出下载
<?php namespace App\Controllers\Test; use App\Controllers\BaseController; use PhpOffice\PhpSpreadsheet\Spreadsheet; use PhpOffice\PhpSpreadsheet\Writer\Xlsx; class Index extends BaseController { public function __construct() { } public function index() { $spreadsheet = new Spreadsheet(); $sheet = $spreadsheet->getActiveSheet(); $sheet->setCellValue('A1', 'Hello World !'); header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');//告诉浏览器输出07Excel文件 //header('Content-Type:application/vnd.ms-excel');//告诉浏览器将要输出Excel03版本文件 header('Content-Disposition: attachment;filename="01simple.xlsx"');//告诉浏览器输出浏览器名称 header('Cache-Control: max-age=0');//禁止缓存 $writer = new Xlsx($spreadsheet); $writer->save('php://output'); } }
释放内存,为了防止内存泄露,进行手动清理
//释放内存,为了防止内存泄露,进行手动清理 $spreadsheet->disconnectWorksheets(); unset($spreadsheet);
第三步文件读取
创建对象
完成了上面的轻松小任务,现在开始创建对象。
# 待读取的excel文件,全路径,如果不是cli模式,那就是网站根目录为"\",ci4默认位置为public文件夹里面 $filename = 'test.xlsx'; # 根据文件名自动创建 适用于不知道文件后缀时xls还是xlsx的情况 $spreadsheet = \PhpOffice\PhpSpreadsheet\IOFactory::load($filename); # 或者如果确定文件后缀,直接创建,性能会略优于上面方法 $reader = \PhpOffice\PhpSpreadsheet\IOFactory::createReader("Xlsx"); # $reader = \PhpOffice\PhpSpreadsheet\IOFactory::createReader("Xls"); $spreadsheet = $reader->load($filename); # 甚至可以直接指定reader实现创建 性能又会优于上面一丢丢 $reader = new \PhpOffice\PhpSpreadsheet\Reader\Xlsx(); # 可以额外设定只读模式,上面也试用,让工具只读取数据,不处理样式,性能会更好 $reader->setReadDataOnly(true); $spreadsheet = $reader->load($filename);
获取Worksheet
表格对象,即当前工作表格
# 获取当前活动的sheet $sheet = $spreadsheet->getActiveSheet(); # 或者直接指定序号获得第一个sheet $sheet = $spreadsheet->getSheet(0);
开始读取sheet中的单元格数据
# 读取excel中A1数据,即第一行第一列,返回“姓名” $sheet->getCell('A1')->getValue(); # B1 返回“性别” $sheet->getCell('B1')->getValue(); # 获取当前总行数 $rows = $sheet->getHighestRow(); $users = []; # 一般excel中第一行为标题,所以实际数据从第二行开始 循环读取 for($i = 2; $i <= $rows; $i++) { $temp = []; $temp['name'] = $sheet->getCell('A' . $i)->getValue(); $temp['sex'] = $sheet->getCell('B' . $i)->getValue(); $temp['age'] = $sheet->getCell('C' . $i)->getValue(); # 防止空行情况 if (!$temp['name']) { continue; } $users[] = $temp; } var_dump($users);
第四步EXCEL文件写入
创建表格对象
下面方法为新创建表格对象,当然也可以用已经读取完成的对象,如上面的$spreadsheet
,然后实现对原有单元格的覆写,生成新文件
# 新创建Spreadsheet对象 $spreadsheet = new \PhpOffice\PhpSpreadsheet\Spreadsheet(); # 获取活动的sheet $sheet = $spreadsheet->getActiveSheet();
写入单元格数据
# 第一行写入标题数据 $sheet->setCellValue('A1', '姓名1'); $sheet->setCellValue('B1', '性别1'); $sheet->setCellValue('C1', '年龄1'); # 模拟写入的数据 $users = [ ['name' => '张三', 'sex' => '男', 'age' => 21,], ['name' => '李四', 'sex' => '女', 'age' => 22,], ['name' => '王五', 'sex' => '男', 'age' => 20,], ]; # 要写入的总行数 $count = count($users); # 逐行写入 for ($i = 0; $i < $count; $i++) { # 要写入的行号 从第二行开始 $index = $i + 2; # 用户数据 $line = $users[$i]; $sheet->setCellValue('A' . $index, $line['name']); $sheet->setCellValue('B' . $index, $line['sex']); $sheet->setCellValue('C' . $index, $line['age']); }
生成并保存文件
# 也可以保存为其他格式 $writer = new \PhpOffice\PhpSpreadsheet\Writer\Xlsx($spreadsheet); # $writer = new \PhpOffice\PhpSpreadsheet\Writer\Xls($spreadsheet); # 写入文件 $writer->save('/tmp/xxx.xlsx');
稍微有点乱,多看几遍就理清顺序了,哇哈哈哈
网名:浩秦;
邮箱:root#landv.pw;
博客:landv.cnblogs.com;
只要我能控制一個國家的貨幣發行,我不在乎誰制定法律。金錢一旦作響,壞話隨之戛然而止。