[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');

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

posted @ 2020-03-12 08:57  landv  阅读(937)  评论(0编辑  收藏  举报