php读写excel文件

2023-11-06

1.引入包

有不少提供读写excel文件的包,这里选择比较常用的一个,加到自己的项目里就好了。

    "phpoffice/phpspreadsheet": "1.8.2",

2.读取文件

<?php
use PhpOffice\PhpSpreadsheet\IOFactory;

require "vendor/autoload.php";

$f = "/tmp/excelSample.xlsx";

try {
    $inputFileType = IOFactory::identify($f);

    $reader = IOFactory::createReader($inputFileType);

    $spreadSheet = $reader->load($f);

    //获取第几张数据表,默认从0开始
    $sheet = $spreadSheet->getSheet(0);

    //获取最大行数
    $rows = $sheet->getHighestRow();
    
    //获取最大列数
    $cols = $sheet->getHighestColumn();

    //获取全量数据集,返回数组形式数据
    $dataArr = $sheet->rangeToArray('A1:' . $cols . $rows);

    for ($i = 2; $i <= $rows; $i++) {
        //获取一列数据
        $ret['id'][] = $sheet->getCell('A' . $i)->getValue();
    }
}catch (Exception $e) {
    var_dump($e->getMessage());
}

我们把上边的方法改造一下,做个通用的,只需要传入excel文件路径,就可以直接读取文件,返回数组形式的全量数据的方法。

<?php
use PhpOffice\PhpSpreadsheet\IOFactory;

require "vendor/autoload.php";

$filepath = "/tmp/excelSample.xlsx";

try {
    $data = getExcelContents($filepath);
    var_dump($data);
}catch (Exception $e) {
    var_dump($e->getMessage());
}

/**
 * @throws \PhpOffice\PhpSpreadsheet\Exception
 * @throws \PhpOffice\PhpSpreadsheet\Reader\Exception
 */
function getExcelContents($filepath)
{
    $inputFileType = IOFactory::identify($filepath);
    $reader = IOFactory::createReader($inputFileType);
    $spreadSheet = $reader->load($filepath);

    //获取第几张数据表,默认从0开始
    $sheet = $spreadSheet->getSheet(0);

    //获取最大行数
    $rows = $sheet->getHighestRow();
    //获取最大列数
    $cols = $sheet->getHighestColumn();

    //获取全量数据集
    $dataArr = $sheet->rangeToArray('A1:' . $cols . $rows);

    return $dataArr;
}

3.写入文件

读取的时候,我们能发现读取出来的数据都是数组的形式,那写入excel文件的时候,使用的数据也是数组的形式。

<?php
use PhpOffice\PhpSpreadsheet\Cell\DataType;
use PhpOffice\PhpSpreadsheet\IOFactory;
use PhpOffice\PhpSpreadsheet\Spreadsheet;

require "vendor/autoload.php";

$filepath = "/tmp/exportExcel.xlsx";

try {
    $data = [
        [
            'id',
            'name',
            'age'
        ],
        [
            1001,
            'tomson',
            10
        ],
        [
            1009,
            'lucifer',
            20
        ]
    ];

    $spreadSheet = new Spreadsheet();
    $sheet = $spreadSheet->getActiveSheet();

    $i = 1;
    foreach ($data as $excel) {
        $j = 1;
        if (is_array($excel)) {
            foreach ($excel as $e) {
                //强制内容为文本,避免出现科学计数法处理数字的问题
                $sheet->setCellValueExplicitByColumnAndRow($j, $i, $e, DataType::TYPE_STRING);
                $j++;
            }
        }
        $i++;
    }

    $writer = IOFactory::createWriter($spreadSheet, 'Xlsx');

    $writer->save($filepath);

}catch (Exception $e) {
    var_dump($e->getMessage());
}

看一下写入的excel文件
在这里插入图片描述

4.直接返回excel文件

在某些场景下的请求,可能希望直接返回excel文件,这其实也是一种写入,只是写入的目标文件不同。
大部分代码与第3部分类似,只有最后写入的部分略有变化。

	$writer = IOFactory::createWriter($spreadSheet, 'Xlsx');

    header("Content-Type: application/vnd.ms-excel");
    header("Content-Disposition: attachment;filename=downloadExcel.xlsx");
    header("Cache-Control: max-age=0");
    $writer->save('php://output');

发现区别了吗?
增加了一些header,然后把输出目标调整了。

写入也应该做个通用方法的,这里就不写了,留给读此文的朋友自己练手吧。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

php读写excel文件 的相关文章

  • PHP 异常处理与 C#

    这是一个非常基本的问题 我希望如此 我所做的大部分异常处理都是使用 C 进行的 在 C 中 任何在 try catch 块中出错的代码都会由 catch 代码处理 例如 try int divByZero 45 0 catch Except
  • 用 PHP 截断文件末尾

    我有一个日志文件 我想在 PHP 读取该文件后将其截断 我的代码目前如下所示 fp fopen file r ftruncate fp 125000 fclose fp 但是 这会通过保留first1MB 不过 我想保留last1Mb 的文
  • 从 Excel VBA 调用 Bloomberg BQL 查询

    出于复杂的原因 我想在 VBA 中自动调用 Bloomi BQL 查询 我正在从 VBA 脚本更改 Excel 工作表中 BQL Query 公式的输入 并调用 Application Calculate 来运行查询 显示更改为 N A 请
  • 禁用外部点击时关闭模式

    我正在制作一些使用模式的博客物质化 但我的模态 onclick 外部和错误数据有问题 这是我的代码 main js function changepassword var user userlog val var content conte
  • zend 表单验证

    我想知道 Zend Form 如何验证输入 我的意思是它如何知道要验证哪些输入字段 我查看了 php 全局变量 POST GET 但没有看到任何设置为标识符 例如 的内容 以便了解如何验证 有人能给我推荐一些关于这些东西的指南吗 好吧 找出
  • 转义用户数据,无需魔法引号

    我正在研究如何在来自外部世界的数据被用于应用程序控制 存储 逻辑等之前正确地对其进行转义 显然 随着 magic quote 指令在 php 5 3 0 中很快被弃用 并在 php6 中被删除 对于任何想要升级并进入新语言功能 同时维护遗留
  • use 语句顺序会影响 PHP 中的功能吗?

    我使用 PHP 的命名空间已经有一段时间了 我认为它对我的编程来说是一个很好的补充 今天早上我想知道一些关于use陈述 我想知道顺序是否use影响我的 PHP 代码的功能 根据 PHP net 使用别名引用外部完全限定名称或导入的能力是命名
  • 如何将工作表和范围作为变量传递?

    我想在子例程之间传递工作表的名称和范围 以下抛出 下标超出范围 错误 Sub This x Sheet1 y D3 MsgBox x Range y Value End Sub This is 我的项目资源管理器的示例 https i st
  • PHP Github Pull 脚本错误“权限被拒绝(公钥)”

    我已经设置了一个 PHP 脚本来执行 GitHub 拉取 这包含在我的 Github 文件夹中 home mysite public html github github pull php 我的服务器已经有 SSH 公钥 就像我执行git
  • Memcache 不会刷新或清除内存

    我一直在尝试清除我的内存缓存 因为我注意到使用时存储占用了近 30 的服务器内存ps aux 所以我运行了以下 php 代码 memcache new Memcache memcache gt connect localhost 11211
  • php隐藏所有错误[重复]

    这个问题在这里已经有答案了 隐藏的最佳做法是什么allPHP 错误 因为我不想向用户显示错误 我尝试过使用 htacess通过输入代码php flag display errors off在那里 但它返回给我一个500 error 还有其他
  • Zend RegEx Validator 的自定义有意义的错误消息

    我正在验证表单中的文本字段 如下所示 name new Zend Form Element Text name name gt setLabel First Name gt setRequired true gt addFilter new
  • 通过 post 使用 php 发送 XML

    我知道有很多类似的问题 但我尝试过摆弄所有的解决方案 但似乎无法使其发挥作用 我正在尝试将 xml 直接发布到 Web 服务并获得响应 从技术上讲 我正在尝试连接到freightquote com 您可以在右上角找到该文档this http
  • 为什么 asort 适用于多维数组?

    抱歉 如果这是一个非常基本的问题 我无意中发现asort http php net manual en function asort php似乎适用于多维数组 示例 PHP animals array 1 gt array name gt
  • 当路由不存在时重定向 laravel 4

    我正在使用 laravel 4 当我的项目处于生产模式时 我得到 抱歉 找不到您要查找的页面 当我到达一条不存在的路线时 当我 grep 我的代码时 它在两个地方找到 vendor symfony debug Symfony Compone
  • 如何绕过Access-Control-Allow-Origin?

    我正在一个平台上对我自己的服务器进行ajax调用 他们设置了阻止这些ajax调用的平台 但我需要它从我的服务器获取数据以显示从我的服务器数据库检索到的数据 我的 ajax 脚本正在运行 它可以将数据发送到我的服务器的 php 脚本以允许其处
  • 控制数据是否存在于数组中

    我在mysql中有两个不同的表 我正在使用curl从json文件中获取数据 我的第一个表名称是 tblclients 该表存储客户端数据 我的第二个表名称是 tblcustomfieldsvalues 该表使用 tblclients 表的
  • 在 BIRT 中导出的 Excel 中表格单元格的文本换行

    我在 eclipse 中使用 BIRT 4 4 1 来生成报告 我想包装表头的文本 它在网络查看器中工作正常 但是当我导出到 Excel 时 表单元格文本在一行中 并且文本也溢出 我不想使单元格宽度等于内容 我想根据其容器宽度来换行文本 我
  • 使用 Webmin 设置 cron 作业

    我正在尝试使用 Webmin 设置一个 Cron 作业每 5 分钟运行一次 它需要定位 php 文件并运行该文件中的 php 脚本 当我在 命令 字段中输入文件路径时 它不起作用 我只是想知道我做错了什么 以及我需要 Cron 作业运行的文
  • 如何统计订单总价?

    我有这些表 Orders id status user id address id 1 await 1 1 products id name price quantity 1 test1 100 5 2 test2 50 5 order p

随机推荐

  • 51单片机实验1-流水灯的设计(流水灯,蜂鸣器,爆闪灯)

    关于软件的使用我们用的是proteus和keil软件 关于软件的安装和使用 这里就不在说明了 如果软件还没有安装可以参考 proteus安装 Proteus软件的安装与使用方法 超详细 http t csdn cn ZaUjM keil安装
  • 电阻上下拉是最常见的用法,那你是不是真的吃透了它?给小白讲讲上拉电阻和下拉电阻!----------------源自玩转单片机与嵌入式

    上拉和下拉电阻主要用于正确偏置数字电路门电路的输入 以防止它们在没有输入条件时的状态是随机浮动的 数字逻辑门可用于连接外部电路或设备 但必须注意确保其输入或输出正常工作并提供预期的开关条件 一 为什么要用上下拉电阻 现代数字逻辑门 IC 和
  • 应届日记之TreeUtiles工具类的使用

    今天遇到一个问题 需要将数据库里面的省市查出来 返回给前端树形结构 用到了TreeUtiles工具类 将list组装成一棵树返回 param list param primaryfieldName param parentFieldName
  • C++ New对象和直接声明对象的区别

    1 new出来的对象需要使用指针接收 而直接声明的不用 例如 A a new A 与A a 2 new出来的对象是直接使用堆空间 而局部声明一个对象是放在栈中 3 new出来的对象类似于申请空间 因此需要delete销毁 而直接声明的对象则
  • 动态路由权限,按钮的权限,菜单权限分别是怎么实现的

    首先什么是前端权限控制 就是当用户登录之后 根据不用用户拥有的权限动态添加 addRoutes 用户能访问的路由页面和能看到的菜单页面 v for 动态路由权限 1 本质就是利用addRoutes这个api来实现动态添加路由权限 然后还可以
  • robotstudio喷涂组件paintapplicator没有显色效果

    因为part这里只能选择仿真之前已经存在的部件 若是像仿真后用source组件生成的新物体 就选择不了 即使你使用传感器 让传感器将检测到的物体传给part 也一样没有喷涂的颜色效果 如果一定要实现 可以参照这个视频 https www b
  • 我的机器学习--线性回归

    1 最小二乘法 上述方法可以直接得到线性回归方程 import numpy as np import matplotlib pyplot as plt x 2 np random rand 100 1 y 4 3 x np random r
  • C语言指针转换为intptr_t类型

    随笔 155 文章 2 评论 342 C语言指针转换为intptr t类型 1 前言 今天在看代码时 发现将之一个指针赋值给一个intptr t类型的变量 由于之前没有见过intptr t这样数据类型 凭感觉认为intptr t是int类型
  • 一个五位数判断他是否为回文数。

    一个五位数判断他是否是回文数 代码 num int input munber n flag True while True if 10000 lt num lt 100000 print input number num break els
  • 腾讯三面被问到有没有参加过CTF?我反手就是一套军体拳打得面试官哑口无言!

    目录 前言 正文 什么是CTF 什么是PWN 为什么要学CTF CTF竞赛模式 CTF各大题型简介 学之前的思考 分析赛题情况 常规做法 CTF比赛需要的知识储备 CTF比赛的神器 恶补基础知识 信息安全专业知识推荐图书 前言 这是一场紧张
  • Typora字体颜色修改

    Typora字体颜色修改 typora中不能直接修改字体颜色 但有三种方法可以实现修改Typora中颜色 第一种 安装AutoHotKey 较简单 安装AutoHotKey windows系统快捷键设置软件 从而通过设置快捷键来达到修改字体
  • macbook brew install 经常遇见 No such file or directory @ rb_sysopen

    安装php brew install php 在执行过程中经常报错 比如以下 gt Installing php dependency openldap gt Pouring openldap 2 5 8 arm64 monterey bo
  • Docker介绍

    目录 docker定义 docker解决了什么问题 docker技术边界 docker给我们带来了哪些改变 docker和虚拟机的区别 docker基本架构 基本架构图 RootFs Linux Namespace 进程命名空间 查看元祖进
  • 动态规划快速入门

    更多内容 欢迎关注微信公众号 全菜工程师小辉 公众号回复关键词 领取免费学习资料 动态规划算法一直是面试手撕算法中比较有挑战的一种类型 很多的分配问题或者调度问题实际上都可能用动态规划进行解决 当然 如果问题的规模较大 有时候会抽象模型使用
  • 【CV】第 14 章:用最少的数据点训练

    大家好 我是Sonhhxg 柒 希望你看完之后 能对你有所帮助 不足请指正 共同学习交流 个人主页 Sonhhxg 柒的博客 CSDN博客 欢迎各位 点赞 收藏 留言 系列专栏 机器学习 ML 自然语言处理 NLP 深度学习 DL fore
  • 情人节-动态爱心背景(html5+css+js)

    一 效果图 二 源代码
  • GDAL对TIF创建内建金字塔一个问题

    gdalwarp输出tif图像的时候 默认如果没有使用BIGTIFF YES选项 则会根据输出影像的大小进行判断 低于4G则不适用bigtiff格式 对于非bigtiff图像 如果这时候使用gdaladdo创建金字塔 内建模式 如果出现了文
  • SQL——游标

    非原创 东拼西凑来的 游标 cursor 是一个存储在MySQL服务器上的数据库查询 它不是一条SELECT语句 而是被该语句检索出来的结果集 在存储了游标之后 应用程序可以根据需要滚动或浏览其中的数据 游标主要用于交互式应用 其中用户需要
  • 业务安全及实战案例

    业务安全 关于漏洞 注入 业务逻辑 信息泄露 A04 2021 Insecure Design 在线靶场PortSwigger 1 概述 1 1 业务安全现状 1 1 1 业务逻辑漏洞 近年来 随着信息化技术的迅速发展和全球一体化进程的不断
  • php读写excel文件

    1 引入包 有不少提供读写excel文件的包 这里选择比较常用的一个 加到自己的项目里就好了 phpoffice phpspreadsheet 1 8 2 2 读取文件