利用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,如果各位大神有更好方法的请告知,学习学习。