0

0

phpexcel入门

php中文网

php中文网

发布时间:2016-06-23 13:34:42

|

1757人浏览过

|

来源于php中文网

原创

最近接触了一下php.发现入门倒还蛮容易的,毕竟和c++很像.但是入门的内容无非是一些最简单的基础,真正的难点在于php的很多拓展.

这几天概要的学习了一下PHPExcel,之所以说自己是概要的学习,是因为主要是以看网上的例子作为学习的主线,结合官方pdf文档.

下面就简要的对于近期的学习做一个小结.

1. 结构:

PHPExcel的构建具有很清晰的结构.明确了这个点,对于接下来的学习至关重要.

立即学习PHP免费学习笔记(深入)”;

工作簿: 官方文档中叫workbook.对应PHPExcel中的PHPExcel类.

工作表: worksheet , 对应PHPExcel中的sheet表格,具体类名我没有看,可以通过getSheet获取到.

单元格: Cell .存储数据的最小单元.

以上的这三个概念是从上到下的包含关系,工作簿包含工作表,工作表包含单元格.

当然还有另外两个重要的抽象概念: 读和写.

在PHPExcel中,读写这两个动作被抽象成了类.这个用法还是很方便的.当我们需要读一个表格的时候,我们使用reader类的对象加载文件.当我们需要写的时候,只要再用writer类打开对象即可.


2. 类与方法.

PHPExcel里面的类有很多.我最近用到的没有几个.简单列举一下:

PHPExcel

PHPExcel_Writer

PHPExcel_Reader

PHPExcel_IOFactory  (这就是传说中的工厂设计模式,根据调用的方法,来构造出writer类的对象或者reader类的对象.)

PHPExcel的方法我目前接触到的如下:

PHPExcel_IOFactory::load   加载excel文件.默认调用了reader类的方法,返回的是PHPExcel类的对象.

PHPExcel_IOFactory::createWriter(PHPExcel, "Excel5")   这里用来创建一个已经存在的PHPExcel类的对象的写类,后面的参数用来指定excel的后缀.常用的还有Excel007.

PHPExcel->getActiveSheet   获取当前默认激活着的表格.

PHPExcel->getSheet(index)   根据index获取sheet

PHPExcel->removeSheetByIndex   根据index删除sheet表格.

PHPExcel->addSheet()   添加一个新的sheet表格

PHPExcel->addExternalSheet()   添加一个外部表格,说到这个方法,就要提到另外一个关键字,clone.这个关键字可以克隆出一个表格的复制品.

Sheet->getCellByColumnAndRow()   注意PHPExcel中,column的下标是从0计算的,而row的下标是从1开始计算的.

Sheet->getHighestRow()   获取当前表格的最大行数

Sheet->getHighestColumn()   获取当前表格的最大列数

PHPExcel_Cell::columnIndexFromString()    当前的列数获取到以后,这个列是以字母的形式存在的,用起来很不方便,所以就有了这个函数,他可以把字母的列转成数字.

Sheet->getCell(A1)   它的参数类似这个样子.同样可以获取一个Cell的内容.

Sheet->setCellValueByColumnAndRow(column, row, value)   给column和row指代的cell更新值为value

Sheet->getRowIterator()   获取当前行的迭代器

Sheet->insertNewRowBefore($currentRow, $rownum)   在当前行的前面插入$rownum个行.

PHPExcel_Cell->setValue()   为当前的Cell设置一个值.


需要留意的是,PHPExcel并不仅仅只能输出Excel文件,还可以输出PDF,html文件等.这个我没有了解过.不做讨论.

下面是我自己设计实现的一个小例子.电话簿管理系统.支持查找插入删除.当然并没有严格的限制一些方面.实现的只是基本的功能.不过相信可以帮助同学们理解PHPExcel.

excel表格式如下:

名字      号码            备注

phone.php负责查找和插入:

<html><head><title>  号码管理系统</title><meta http-equiv="Content-Type" Content="text/html; charset=utf-8"/></head><body><center>  <h1>号码管理系统<h1></center><h4>  注意如果需要插入操作,需要姓名和号码都不为空</h4><form method="POST" action="<?php echo $_SERVER["PHP_SELF"]; ?>">  <br>姓名 : <input type="text" name="name"/>   <br>号码 : <input type="text" name="num"/>   <br>备注 : <textarea name="addition" rows="5" cols="20">   </textarea>                             <br><input type="submit" name="search" value="查询"/>        <input type="submit" name="insert" value="插入"/>       <input type="submit" name="delete" value="删除" /><p><?php//设置全局的错误报告error_reporting(E_ALL);//将PHPExcel包含到PHP的include路径中set_include_path(get_include_path().PATH_SEPARATOR."../Classes");//加载PHPExcel的文件require_once("PHPExcel.php");require_once("PHPExcel/IOFactory.php");$filename = "phonelist.xls";//加载Excel文件$phpexcel = PHPExcel_IOFactory::load($filename);$sheet = $phpexcel->getActiveSheet();//获取行数和列数$data_phone = array(array());$row_phone = $sheet->getHighestRow();$column_str = $sheet->getHighestColumn();$column_phone = PHPExcel_Cell::columnIndexFromString($column_str);//建立一个表格用来打印电话号码和用户名function table(){    echo "<br><table border=1 cellpading=20>";    echo "<tr>";    echo "<td width=80>姓名</td>";    echo "<td width=150>号码</td>";    echo "</tr>";}//用来打印有色字体function font($str, $color){    echo "<font color=".$color.">";    echo $str;    echo "</font>";    echo "</br>";}//判断如果是查找if (!empty($_POST["search"])){    for ($i = 1; $i <= $row_phone; $i++)    {        for ($j = 0; $j < $column_phone; $j++)        {            //遍历行列,将获取到的内容添加到一个预先定义好的数组中            $data_phone[$i - 1][$j] = $sheet->getCellByColumnAndRow($j, $i)->getValue();        }    }//    var_dump($data_phone);    table();    for ($i = 1; $i < $row_phone; $i++)    {        //将数组内容整合成一个字符串,然后进行子串比对        $phone_item = implode($data_phone[$i]);        //名字匹配        if (!empty($_POST["name"]))        {            if (0 != substr_count($phone_item, $_POST["name"]))            {                echo "<tr>";                echo "<td>".$data_phone[$i][0]."</td>";                echo "<td>".$data_phone[$i][1]."</td>";                echo "</tr>";            }        }        //号码匹配        else if (!empty($_POST["number"]))        {            if (0 != substr_count($phone_item, $_POST["number"]))            {                echo "<tr>";                echo "<td>".$data_phone[$i][0]."</td>";                echo "<td>".$data_phone[$i][1]."</td>";                echo "</tr>";            }        }    }    echo "</table>";}//如果是插入操作else if (!empty($_POST["insert"])){    if (!empty($_POST["name"]) && !empty($_POST["num"]))    {        $had = FALSE;        $name;        $num;         //确保将要插入的条目当前系统中不存在        for ($i = 2; $i <= $row_phone; $i++)        {            $name = $sheet->getCellByColumnAndRow(0, $i)->getValue();            $num = $sheet->getCellByColumnAndRow(1, $i)->getValue();            if (strcmp($_POST["name"], $name) == 0 &&                strcmp($_POST["num"], $num) == 0)            {                $had = TRUE;                break;            }        }        table();        //如果不存在,则插入        if (FALSE== $had)        {            font("插入成功", "green");            $sheet->insertNewRowBefore($row_phone + 1, 1);            $sheet->setCellValueByColumnAndRow(0, $row_phone + 1, $_POST["name"]);            $sheet->setCellValueByColumnAndRow(1, $row_phone + 1, $_POST["num"]);            //此处纠结了好久,原来就只是用writer把当前对象加载一下,就可以保存了.            $phpwriter = PHPExcel_IOFactory::createWriter($phpexcel, "Excel5");            $phpwriter->save($filename);            echo "<tr>";            echo "<td>".$_POST["name"]."</td>";            echo "<td>".$_POST["num"]."</td>";            echo "</tr>";        }        //如果存在,则不执行任何动作        else         {            font("插入失败,条目已存在", "red");            echo "<tr>";            echo "<td>".$name."</td>";            echo "<td>".$num."</td>";            echo "</tr>";        }        echo "</table>";    }}//删除操作else if (!empty($_POST["delete"])){    $had = FALSE;    if (!empty($_POST["name"]) && !empty($_POST["num"]))    {        for ($i = 2; $i <= $row_phone; $i++)        {            $name = $sheet->getCellByColumnAndRow(0, $i)->getValue();            $num = $sheet->getCellByColumnAndRow(1, $i)->getValue();            if (strcmp($name, $_POST["name"]) == 0 &&                 strcmp($num, $_POST["num"]) ==0)            {                $sheet->removeRow($i, 1);                $objWriter = PHPExcel_IOFactory::createWriter($phpexcel, "Excel5");                $objWriter->save($filename);                $had = TRUE;            }        }    }    //加入用户名和号码有一个是空的,则执行这个分支    if ($had == FALSE)    {        font("请输入正确的姓名和号码", "red");        font("如果不确定,可以通过查找先定位", "red");        font("即将跳转到删除页面,请稍后...", "green");        //延迟3秒显示上面的信息,然后跳转到删除页面        header("Refresh:3;url=del.php");    }    else    {        font("用户删除成功", "green");    }}?></form></body></html>

如果当前页面的删除操作不满足输入条件,则跳转到专门的删除页面del.php, 代码如下:

<html><head><title>号码删除页面</title><meta http-equiv="Content-Type" content="text/html; charset=utf8"/></head><body><form method="POST" action="<?php $_SERVER["PHP_SELF"] ?>" ><?phperror_reporting(E_ALL);set_include_path(get_include_path().PATH_SEPARATOR."../Classes");require_once("PHPExcel.php");require_once("PHPExcel/IOFactory.php");$filename = "phonelist.xls";$phpexcel = PHPExcel_IOFactory::load($filename);$sheet = $phpexcel->getActiveSheet();$row_phone = $sheet->getHighestRow();$column = $sheet->getHighestColumn();$column_phone = PHPExcel_Cell::columnIndexFromString($column);for ($i = 2; $i <= $row_phone; $i++){    $name = $sheet->getCellByColumnAndRow(0, $i)->getValue();    $num = $sheet->getCellByColumnAndRow(1, $i)->getValue();    //将每一条电话信息用checkbox的方式列出来    if (!empty($name) || !empty($num))    {        echo '<input type="checkbox" name="chk[]" value='.$i."/>".$name." ".$num."<br>";    }}?><input type="submit" value="删除" name="delete"/></form><?phperror_reporting(E_ALL);set_include_path(get_include_path().PATH_SEPARATOR."../Classes");require_once("PHPExcel.php");require_once("PHPExcel/IOFactory.php");function font($str, $color){    echo "<font color=".$color.">";    echo $str;    echo "</font>";    echo "</br>";}$filename = "phonelist.xls";$phpexcel = PHPExcel_IOFactory::load($filename);$sheet = $phpexcel->getActiveSheet();$row_phone = $sheet->getHighestRow();$column = $sheet->getHighestColumn();$column_phone = PHPExcel_Cell::columnIndexFromString($column);//这个用法是网上借鉴的,还是蛮好用的$chk = $_POST["chk"];for ($i = $row_phone; $i >= 2; $i--){    $name = $sheet->getCellByColumnAndRow(0, $i)->getValue();    $num = $sheet->getCellByColumnAndRow(1, $i)->getValue();    if (empty($name) && empty($num))    {        continue;    }    //在当前勾选的内容中查找,如果在数组中说明勾选了.则删除    if (in_array($i, $chk))    {        $sheet->removeRow($i, 1);        $clicked = TRUE;        echo "<font color=green>".$name." -- ".$num."</font>";        echo "<font color=red>"."  已经成功删除</font><br>";        sleep(1);    }}//如果执行了至少一次删除操作,则刷新页面,保存修改后excel表格if (TRUE == $clicked){    $objWriter = PHPExcel_IOFactory::createWriter($phpexcel, "Excel5");    $objWriter->save($filename);    $url=$SERVER["PHP_SELF"];    header("refresh:3;url=del.php");}?></body></html>

希望以上的这个例子能够对同学们有所启发.当然PHPExcel和PHP本身而言,这里的内容简直太少.但是对于入门而言.这也不是一个中规中矩的参考.

相关文章

WPS零基础入门到精通全套教程!
WPS零基础入门到精通全套教程!

全网最新最细最实用WPS零基础入门到精通全套教程!带你真正掌握WPS办公! 内含Excel基础操作、函数设计、数据透视表等

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
Golang 测试体系与代码质量保障:工程级可靠性建设
Golang 测试体系与代码质量保障:工程级可靠性建设

Go语言测试体系与代码质量保障聚焦于构建工程级可靠性系统。本专题深入解析Go的测试工具链(如go test)、单元测试、集成测试及端到端测试实践,结合代码覆盖率分析、静态代码扫描(如go vet)和动态分析工具,建立全链路质量监控机制。通过自动化测试框架、持续集成(CI)流水线配置及代码审查规范,实现测试用例管理、缺陷追踪与质量门禁控制,确保代码健壮性与可维护性,为高可靠性工程系统提供质量保障。

28

2026.02.28

Golang 工程化架构设计:可维护与可演进系统构建
Golang 工程化架构设计:可维护与可演进系统构建

Go语言工程化架构设计专注于构建高可维护性、可演进的企业级系统。本专题深入探讨Go项目的目录结构设计、模块划分、依赖管理等核心架构原则,涵盖微服务架构、领域驱动设计(DDD)在Go中的实践应用。通过实战案例解析接口抽象、错误处理、配置管理、日志监控等关键工程化技术,帮助开发者掌握构建稳定、可扩展Go应用的最佳实践方法。

23

2026.02.28

Golang 性能分析与运行时机制:构建高性能程序
Golang 性能分析与运行时机制:构建高性能程序

Go语言以其高效的并发模型和优异的性能表现广泛应用于高并发、高性能场景。其运行时机制包括 Goroutine 调度、内存管理、垃圾回收等方面,深入理解这些机制有助于编写更高效稳定的程序。本专题将系统讲解 Golang 的性能分析工具使用、常见性能瓶颈定位及优化策略,并结合实际案例剖析 Go 程序的运行时行为,帮助开发者掌握构建高性能应用的关键技能。

27

2026.02.28

Golang 并发编程模型与工程实践:从语言特性到系统性能
Golang 并发编程模型与工程实践:从语言特性到系统性能

本专题系统讲解 Golang 并发编程模型,从语言级特性出发,深入理解 goroutine、channel 与调度机制。结合工程实践,分析并发设计模式、性能瓶颈与资源控制策略,帮助将并发能力有效转化为稳定、可扩展的系统性能优势。

16

2026.02.27

Golang 高级特性与最佳实践:提升代码艺术
Golang 高级特性与最佳实践:提升代码艺术

本专题深入剖析 Golang 的高级特性与工程级最佳实践,涵盖并发模型、内存管理、接口设计与错误处理策略。通过真实场景与代码对比,引导从“可运行”走向“高质量”,帮助构建高性能、可扩展、易维护的优雅 Go 代码体系。

18

2026.02.27

Golang 测试与调试专题:确保代码可靠性
Golang 测试与调试专题:确保代码可靠性

本专题聚焦 Golang 的测试与调试体系,系统讲解单元测试、表驱动测试、基准测试与覆盖率分析方法,并深入剖析调试工具与常见问题定位思路。通过实践示例,引导建立可验证、可回归的工程习惯,从而持续提升代码可靠性与可维护性。

2

2026.02.27

漫蛙app官网链接入口
漫蛙app官网链接入口

漫蛙App官网提供多条稳定入口,包括 https://manwa.me、https

164

2026.02.27

deepseek在线提问
deepseek在线提问

本合集汇总了DeepSeek在线提问技巧与免登录使用入口,助你快速上手AI对话、写作、分析等功能。阅读专题下面的文章了解更多详细内容。

8

2026.02.27

AO3官网直接进入
AO3官网直接进入

AO3官网最新入口合集,汇总2026年可用官方及镜像链接,助你快速稳定访问Archive of Our Own平台。阅读专题下面的文章了解更多详细内容。

309

2026.02.27

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
最新Python教程 从入门到精通
最新Python教程 从入门到精通

共4课时 | 22.5万人学习

【web前端】Node.js快速入门
【web前端】Node.js快速入门

共16课时 | 2.1万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号