[CodeIgniter4]phpspreadsheet的使用

  • 2020 年 3 月 13 日
  • 笔记

 [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 PhpOfficePhpSpreadsheetSpreadsheet;  use PhpOfficePhpSpreadsheetWriterXlsx;    $spreadsheet = new Spreadsheet();  $sheet = $spreadsheet->getActiveSheet();  $sheet->setCellValue('A1', 'Hello World !');    $writer = new Xlsx($spreadsheet);  $writer->save('hello world.xlsx');

CI4使用示例

此控制器位置appControllersTestIndex.php

输出文件到网站根目录,即public里面

<?php namespace AppControllersTest;  // 采用命名空间的方式调用这个功能    use AppControllersBaseController;    use PhpOfficePhpSpreadsheetSpreadsheet;  use PhpOfficePhpSpreadsheetWriterXlsx;    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 AppControllersTest;      use AppControllersBaseController;    use PhpOfficePhpSpreadsheetSpreadsheet;  use PhpOfficePhpSpreadsheetWriterXlsx;    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 = PhpOfficePhpSpreadsheetIOFactory::load($filename);      # 或者如果确定文件后缀,直接创建,性能会略优于上面方法  $reader = PhpOfficePhpSpreadsheetIOFactory::createReader("Xlsx");  # $reader = PhpOfficePhpSpreadsheetIOFactory::createReader("Xls");  $spreadsheet = $reader->load($filename);      # 甚至可以直接指定reader实现创建 性能又会优于上面一丢丢  $reader = new PhpOfficePhpSpreadsheetReaderXlsx();  # 可以额外设定只读模式,上面也试用,让工具只读取数据,不处理样式,性能会更好  $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 PhpOfficePhpSpreadsheetSpreadsheet();    # 获取活动的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 PhpOfficePhpSpreadsheetWriterXlsx($spreadsheet);  # $writer = new PhpOfficePhpSpreadsheetWriterXls($spreadsheet);    # 写入文件  $writer->save('/tmp/xxx.xlsx');

稍微有点乱,多看几遍就理清顺序了,哇哈哈哈