phpexcel入门

最近接触了一下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>

如果当前页面的删除操作不满足输入条件,则跳转到专门的删除页面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"] ?>" >

<?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>

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

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。