PHP读写excel文件 (封装 PHPExcel )

<?php
/**
 * XExcel - excel 文件下载处理类
 * 注意:
 * 1,全局编码为UTF-8,否则可能出错
 * 2,支持读写excel2003,2007
 * 3,csv需要的时候再实现
 * @author wenyouming@imixun.com
 * @since  2014-01-14
 * @version 1.0
 * 
 */
class XExcel {

	/**
	 * 文件下载
	 * @param  array $data :数组数据
	 * @param  string $filename :文件名称
	 * @param  boolean $is_down  :是否下载
	 */
    private static function write($data, $filename = 'export', $is_down = true, $version=2007, 
        $is_big = false) {

        /* 写excel需要较大的内存开销 */        
	    if ($is_big) {
            $memory = '512M';
        } else {
            $memory = '256M';
        }
        ini_set('memory_limit', $memory);
        
        /* 数据维度检测 */
        $depth = array_depth($data);
        if ($depth <= 0 || $depth >= 4) {
            echo "depth:$depth. 超过预定范围";
            return false;
        }
        /* 维度补齐到3维数组 */
        if ($depth == 1) {
            $data = array(array($data));
        } elseif($depth == 2) {
            $data = array($data);
        }
        	//如果是非thinkPHP请用require相关文件
		import('@.ORG.PHPExcel');
		$excel = new PHPExcel();

		$index = 0;
		foreach ($data as $sheet_data) {
		    if ($index) {
		        $excel->createSheet();
		    }
    		$excel->setActiveSheetIndex($index++);
    		$sheet = $excel->getActiveSheet();
    		
    		$i = 1;
    		foreach ($sheet_data as $row) {
    			$j = 'A';
    			foreach ($row as $v) {
    				/* 以字符串写入 */
    				$sheet->setCellValueExplicit($j.$i, $v, PHPExcel_Cell_DataType::TYPE_STRING);
    				++$j;
    			}
    			++$i;
    		}
		}
		
		if ($version == 2003) {
	        $filename .= '.xls';
	        $writer = new PHPExcel_Writer_Excel5($excel);
	    } else {
	        $filename .= '.xlsx';
	        $writer= new PHPExcel_Writer_Excel2007($excel);
	    }    
		
		if (!$is_down) {
		    try {
			    $writer->save($filename);
		    } catch (PHPExcel_Writer_Exception $e) {
		        echo $e->getMessage();
		        return false;
		    }
			return true;
		}
		/* 如果是IE,进行转码,防止乱码 */
		if (strpos($_SERVER["HTTP_USER_AGENT"],"MSIE")) {
		    $filename = rawurlencode($filename);
		}
		
		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=\"$filename\"");
		header("Content-Transfer-Encoding:binary");
		$writer->save('php://output');
	}
	/**
	 * write_2007 - 写2007格式
	 * @param array $data	: 数据
	 * @param string $filename : 文件名
	 * @param boolean $is_big  : 是否写大文件,默认false
	 */
    static function write_2007($data, $filename='export_2007', $is_big = false) {
        self::write($data, $filename, false, 2007, $is_big);
    }
	/**
	 * down_2007 - 下载2007文件格式
	 * @param array $data	: 数据
	 * @param string $filename : 文件名
	 * @param boolean $is_big  : 是否写大文件,默认false
	 */
    static function down_2007($data, $filename='export_2007', $is_big = false) {
        self::write($data, $filename, true, 2007, $is_big);
    }
    /**
	 * write_2003 - 写2003格式
	 * @param array $data	: 数据
	 * @param string $filename : 文件名
	 * @param boolean $is_big  : 是否写大文件,默认false
	 */
    static function write_2003($data, $filename='export_2003', $is_big = false) {
        self::write($data, $filename, false, 2003, $is_big);
    }
	/**
	 * down_2003 - 下载2003文件格式
	 * @param array $data	: 数据
	 * @param string $filename : 文件名
	 * @param boolean $is_big  : 是否写大文件,默认false
	 */    
    static function down_2003($data, $filename='down_2003', $is_big = false) {
        self::write($data, $filename, true, 2003, $is_big);
    }
    
    /**
     * read - 读取excel文件(自动识别excel2007和excel2003)
     * 推荐文件只用字符串格式,或者数字,其他格式需要检查是否有误
     * @param  string $filename 文件名
     * @param  boolean $is_big  是否为大文件
     * @return mixed -1,文件不存在; -2,不能识别的文件; array, 3维数组
     */
    static function read($filename, $is_big = false) {
        if (!file_exists($filename)) {
            return -1;
        }
        
        if ($is_big) {
            $memory = '512M';
        } else {
            $memory = '256M';
        }
        ini_set('memory_limit', $memory);
        
        import('@.ORG.PHPExcel');
        $reader = new PHPExcel_Reader_Excel2007();
        if (!$reader->canRead($filename)) {
            $reader = new PHPExcel_Reader_Excel5();
            if (!$reader->canRead($filename)) {
                return -2;
            }
        }
        
        $excel = $reader->load($filename);
        $sheet_list = $excel->getAllSheets();
        $data = array();
        foreach ($sheet_list as $sheet) {
            $cols = PHPExcel_Cell::columnIndexFromString($sheet->getHighestColumn());
            $rows = $sheet->getHighestRow();
            
            $d = array();
            for($row = 1; $row <= $rows; ++$row) {
                for($col = 0; $col < $cols; ++$col) {
                    $cell = $sheet->getCellByColumnAndRow($col, $row);
    	            $cellstyleformat = $cell->getStyle($cell->getCoordinate())->getNumberFormat();
    	            //日期格式的判断
    	            $value = $cell->getValue();//获取值
    	            
    	            $formatcode=$cellstyleformat->getFormatCode();
    	            if (preg_match('/^(\[\$[A-Z]*-[0-9A-F]*\])*[hmsdy]/i', $formatcode)){
    	                $value = gmdate("Y-m-d H:i:s", PHPExcel_Shared_Date::ExcelToPHP($value));
    	            }else{ 
    	                $value = PHPExcel_Style_NumberFormat::toFormattedString($value, $formatcode);
    	            } 
    	            $d[$row - 1][$col] = $value;
                }
            }
            $data[] = $d;
        }
        
        return $data;
    }
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值