php读取excel:phpexcel

利用PHP实现对于Excel的读取,主要借助于PHPExcel插件来完成。下载地址:PHPExcel

文件目录如下:


Documenttation这个文件夹里面是英文使用文档。

我们只需使用Classes这个文件夹,所有类都在这里面。

今天主要是读取已有的excel文档;读取的类PHPExcel/IOFactory.php;

已知文件内容:


网页展示结果:


得到这个结果真心不容易,接下来是代码历程:

<?php
header('Content-Type:text/html;charset=utf-8');//设置编码,防止乱码
$dir = dirname(__FILE__);
include 'PHPExcel/IOFactory.php';//读取excel内容
$filename = $dir.'/zhichu.xlsx';//文件名称
$objPhpExcel = PHPExcel_IOFactory::load($filename);//加载文件
foreach ($objPhpExcel->getWorksheetIterator() as $sheet)//循环获取sheet
{
    echo '<table border="1">';
    foreach ($sheet->getRowIterator() as $row){//逐行处理
        echo '<tr>';
        $cellIterator = $row->getCellIterator();
        foreach ($cellIterator as $k=>$cell){//逐列处理
            $data = $cell->getValue();//获取数据
            echo '<td width=\'50\'>'.$data.'</td>';
        }
        echo '</tr>';
    }
    echo '</table>';
}

结果:


有三个问题,1,单元格合并;2,日期;3,函数显示;

问题一:

    使用isMergeRangeValueCell与getMergeRange两个函数

    

            $res = true;  //去除合并的列(除左上角那列)
            $colspan=$rowspan=1;//html合并数字
            if($cell->isMergeRangeValueCell())//判断是否为合并的左上角的单元格
            {
                $col = $row = array();
                preg_match_all('/([A-Z]+)(\d+):([A-Z]+)(\d+)/', $cell->getMergeRange() , $r);
                $col = array_merge($col, $r[1], $r[3]);
                $row = array_merge($row, $r[2], $r[4]);
                $colspan =  count(range($col[0],$col[1]));
                $rowspan = count(range($row[0],$row[1]));
            }
            elseif ($cell->getMergeRange())//是否合并,并返回合并值
            {
                $res = false;
            }

            if($res){
                echo "<td width='50' colspan='{$colspan}' rowspan='{$rowspan}' style='text-align:center'>".$data.'</td>';

            }

问题三:$data = $cell->getValue()用$data = $cell->getCalculatedValue();替换

问题二吗:有点棘手,本想省麻烦读取时自动判断类型自动转化的,各种百度,各种Google,看到一个靠谱的,点击打开链接,各位看官可以试试,我是没成功,若有人成功,希望能够分享给我

我是这么改动的

.....
$data = $cell->getValue();//获取数据
if($cell->getDataType()==\PHPExcel_Cell_DataType::TYPE_NUMERIC){//数字类型
                $cellstyleformat = $sheet->getStyle($cell->getCoordinate())->getNumberFormat();
                $formatcode = $cellstyleformat->getFormatCode();
                var_dump($formatcode.'--'.$data);
                if (preg_match('/^(\[\$[A-Z]*-[0-9A-F]*\])*[hmsdy]/i', $formatcode)) {
                    $data = gmdate("Y-m-d", \PHPExcel_Shared_Date::ExcelToPHP($data));
                }
                else{
                    $data=\PHPExcel_Style_NumberFormat::toFormattedString($data,$formatcode);
                }
            }
 $res = true;  //去除合并的列(除左上角那列)
 $colspan=$rowspan=1;//html合并数字
...

打印出来

没啥用呢,还是判断是那个列吧

换成这句:

            if($k==='A'&& !is_string($data))$data = gmdate("Y-m-d", \PHPExcel_Shared_Date::ExcelToPHP($data));

最终代码:

<?php
header('Content-Type:text/html;charset=utf-8');//设置编码,防止乱码
$dir = dirname(__FILE__);
include 'PHPExcel/IOFactory.php';//读取excel内容
$filename = $dir.'/zhichu.xlsx';//文件名称
$objPhpExcel = PHPExcel_IOFactory::load($filename);//加载文件
foreach ($objPhpExcel->getWorksheetIterator() as $sheet)//循环获取sheet
{
    echo '<table border="1">';
    foreach ($sheet->getRowIterator() as $row){//逐行处理
        echo '<tr>';
        $cellIterator = $row->getCellIterator();
        foreach ($cellIterator as $k=>$cell){//逐列处理
            $data = $cell->getCalculatedValue();//获取计算的单元格值;建议不要使用getValue,不然呈现函数形式
            if($k==='A'&& !is_string($data))$data = gmdate("Y-m-d", \PHPExcel_Shared_Date::ExcelToPHP($data));

            $res = true;  //去除合并的列(除左上角那列)
            $colspan=$rowspan=1;//html合并数字
            if($cell->isMergeRangeValueCell())//判断是否为合并的左上角的单元格
            {
                $col = $row = array();
                preg_match_all('/([A-Z]+)(\d+):([A-Z]+)(\d+)/', $cell->getMergeRange() , $r);
                $col = array_merge($col, $r[1], $r[3]);
                $row = array_merge($row, $r[2], $r[4]);
                $colspan =  count(range($col[0],$col[1]));
                $rowspan = count(range($row[0],$row[1]));
            }
            elseif ($cell->getMergeRange())//是否合并,并返回合并值
            {
                $res = false;
            }
            if($res){
                echo "<td width='50' colspan='{$colspan}' rowspan='{$rowspan}' style='text-align:center'>".$data.'</td>';
            }
        }
        echo '</tr>';
    }
    echo '</table>';
}

有啥不对的请指正,我也是才接触这个phpexcel,如果各位大神有更好方法的请告知,学习学习。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值