zoukankan      html  css  js  c++  java
  • [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 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');

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

  • 相关阅读:
    封装、权限修饰符、包、构造器
    从Discuz!NT v2.0扣出来的生成静态页面的方法
    C#中struct与class的区别
    Asp.Net中虚拟文件系统的使用
    C#生成中文验证码
    C#导入Excel表
    IIS5、IIS6、IIS7的ASP.net 请求处理过程比较
    如何保证Session值不丢失
    C#抽象类与接口的区别
    C#实现DES加密解密
  • 原文地址:https://www.cnblogs.com/landv/p/12467079.html
Copyright © 2011-2022 走看看