最近接触了一下PHP.发现入门倒还蛮容易的,毕竟和C++很像.但是入门的内容无非是一些最简单的基础,真正的难点在于PHP的很多拓展.
这几天概要的学习了一下PHPExcel,之所以说自己是概要的学习,是因为主要是以看网上的例子作为学习的主线,结合官方pdf文档.
下面就简要的对于近期的学习做一个小结.
1. 结构:
PHPExcel的构建具有很清晰的结构.明确了这个点,对于接下来的学习至关重要.
工作簿: 官方文档中叫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>
<html> <head> <title> 号码删除页面 </title> <meta http-equiv="Content-Type" content="text/html; charset=utf8"/> </head> <body> <form method="POST" action="<?php $_SERVER["PHP_SELF"] ?>" > <?php error_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> <?php error_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>