PHPExcel 简单使用

require_once 'PHPExcel.php';
$PHPReader = new PHPExcel_Reader_Excel2007(); 
$filePath = 'wjyl.xlsx'; 
if(!$PHPReader->canRead($filePath)){
    $PHPReader = new PHPExcel_Reader_Excel5();//讀取舊版本
}  
$PHPExcel = $PHPReader->load($filePath);//讀取Excel文件  
$sheetCount = $PHPExcel->getSheetCount();//獲取工作表的數目
for($s = 0; $s < $sheetCount; $s++){
    echo '<b>這是表'.$s."</b><br />";
    $currentSheet = $PHPExcel->getSheet($s); //讀取excel工作表
     $allColumn = $currentSheet->getHighestColumn(); //取得最大的列号
     $allRow = $currentSheet->getHighestRow();//取得一共有多少行
     for($currentRow = 2; $currentRow <= $allRow; $currentRow++){
        for($currentColumn= 'A';$currentColumn <= $allColumn; $currentColumn++){
            $val = $currentSheet->getCell($currentColumn.$currentRow)->getValue();
            echo $val."   ";
        }
        echo "<br />";     
    }
}
echo 'Well Done!!!';
exit;
/**如果输出汉字有乱码,则需将输出内容用iconv函数进行编码转换,如下将gb2312编码转为utf-8编码输出*/ 
//echo iconv('utf-8','gb2312', $val); 

當excel表的總列數超過了26的時候,也就是超過了Z的時候,再繼續增加就上升為AA,AB,AC......AZ格式,在這種情況下,上面代碼在列循環只會循環第一個A。

了解字母比較:

字母的比較,實際上是字母在ASCII表中所對應的10進制數字大小的比較,例如A 的 ASCII表中十進制對應數字為65,Z的為90;

echo ord('A');//65
echo ord('Z');//90

比較規則:

A與AB比較,首先,A與AB中的A比較,由於相等,則跳過A,繼續與B比較,得出

echo 'A' < 'AB' ? 1 : 0;//1

A與AA比較,先進行字母逐個比較,當每個都相等的情況下,最後進行字符串的長度對比,得出

echo 'A' < 'AA' ? 1 : 0;//1

A與BA比較,首先A與B比較,A小於B,得出結果

 

echo 'A' < 'BA' ? 1 : 0;//1

 得出結果:

例如上面最後一列為AP,A首先會與allRow中的第一個字母進行比較,相同字母跳過,再與第二個字母比較,A<P,進入循環,執行完第一次代碼之後,列數增加,此時為B與AP比較,由於B>A,所以第一個字母判斷就不成立,退出循環。

解決辦法:

$ColumnArr = array('A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z','AA','AB','AC','AD','AE','AF','AG','AH','AI','AJ','AK','AL','AM','AN','AO','AP');
for($currentRow = 2;$currentRow <= $allRow;$currentRow++){ 
    for($c_Column= 0;$c_Column < count($ColumnArr); $c_Column++){
        $val = $currentSheet->getCell($ColumnArr[$c_Column].$currentRow)->getValue();
        echo $val."   ";
    } 
    echo "<br />"; 
 }

解決辦法的原理就是能夠確保列的循環能夠順利的進行,上面固定列出來數組只是方便理解,具體操作可以對$allCloumn進行處理動態獲取列的相關數據。

导入来的excel表里面若存在日期数据,获取到的结果竟然是一串数字,原来phpexcel中用一个距离1900年的天数序列记录时间 1900-01-01 为整数1900-01-02为整数2,以次类推。我们知道,在windows的PHP中只支持1970-2038年时间计算,那怎么才能让它变成正常的日期呢,其中phpexcel原本就有提供一个日期处理的方法的。

$value = date("Y-m-d", PHPExcel_Shared_Date::ExcelToPHP($value));


下面是一段简单的excel导出function

/**
 * 导出excel文件数据
 * @param $table_header
 * @param $type 0 直接下载,1生成文件
 * @param $data
 */
function export_excel_data($table_header, $data, $type=0){
    include_once BASE_PATH.'/public/plugin/PHPExcel/PHPExcel.php';
    $excel = new PHPExcel();
    $letter = array('A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z');
    //写入头部标题信息
	for($i = 0;$i < count($table_header);$i++) {
        $excel->getActiveSheet()->setCellValue($letter[$i].'1', $table_header[$i]);
    }
    //填充表格信息
    for ($i = 2;$i <= count($data)+1;$i++) {
        $j = 0;
        foreach ($data[$i - 2] as $key=>$value) {
            $excel->getActiveSheet()->setCellValue($letter[$j].$i, $value);
            $j++;
        }
    }
    //创建Excel输入对象
    $file_name = date("YmdHi").".xlsx";
    $write = new PHPExcel_Writer_Excel2007($excel);
    if($type){//保存到文件
        $path = BASE_PATH."/public/excel/".$file_name;
        $url = "/public/excel/".$file_name;
        $write->save($path);
        return $url;
    }else{//直接下载
        header("Pragma: public");
        header("Expires: 0");
        header("Cache-Control:must-revalidate, post-check=0, pre-check=0");
        header("Content-Type:application/force-download");
        header("Content-Type:application/vnd.ms-execl");
        header("Content-Type:application/octet-stream");
        header("Content-Type:application/download");
        header('Content-Disposition:attachment;filename="'.$file_name.'"');
        header("Content-Transfer-Encoding:binary");
        $write->save('php://output');
        exit;
    }
}

导出小技巧,若导出的数据里面有数字,而且数字数值比较大,一般情况下excel会将大数字转换成科学记数法方法显示,若想直接保存数字字符串,只需要在数字后面连接上一个空格字符串就可以了。例如  $value = '12345'.' ';

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值