PHPExcel类库使用说明

    众所周知,在项目的开发过程中经常会遇到用excel做功能的时候,比如一个商城导出订单列表,办公系统导出考勤记录,还有一些excel表格内容批量上传到数据库的情况。那么这么一款强大的类库到底该如何使用它?类库又在哪里下载,本文将一一奉上。

概述

    PHPExcel 是用来操作Office Excel 文档的一个PHP类库,它基于微软的OpenXML标准和PHP语言。可以使用它来读取、写入不同格式的电子表格,如 Excel (BIFF) .xls, Excel 2007 (OfficeOpenXML) .xlsx, CSV, Libre/OpenOffice Calc .ods, Gnumeric, PDF, HTML等等

支持的格式

读取

  • BIFF 5-8 (.xls) Excel 95 版本及以上[1]

  • Office Open XML (.xlsx) Excel 2007 版本及以上

  • SpreadsheetML (.xml) Excel 2003

  • Open Document Format/OASIS (.ods)

  • CSV 等

写入

  • BIFF 8 (.xls) Excel 95 版本及以上

  • Office Open XML (.xlsx) Excel 2007 版本及以上

  • HTML

  • CSV

  • PDF (使用 tcPDF, DomPDF or mPDF PHP类库, 需要单独安装)

要求

  • PHP 5.2.0 版本及以上

  • PHP extension php_zip 开启 (如果你需要使用 PHPExcel 来操作 .xlsx .ods or .gnumeric 文件)

  • PHP extension php_xml 开启

  • PHP extension php_gd2 开启(选填, 如果需要计算准确的列宽需要开启此扩展)

(以上出自于百度百科,微笑.jpg)

使用

导入excel到数据库

以下代码以CI框架为例,其它框架使用请举一反三试之。

  1. html上传

        <table class="table table-bordered">
    
            <tbody>
    
            <tr class="table_thbg">
    
                <td class="align_left">请选择文件</td>
    
                <td class="align_left"><input type="file" class="span12" name="xls_file" /> 
    
                </td>					
    
            </tr>
    
            </tbody>
    
    	</table>  
    
        <input type="submit" name="tijiao" class="btn btn_style1" value="上传">
    
    </form>
    
  2. php解析excel并写入到数据库

    /**

    • excel上传并写入数据库

    • @return int 状态

    • @author 命中水、

    */

    function excel_all_daoru() {

    //获取excel文件路径
    
    $excel_path = $this->get_excel_path();
    
    //获取excel文件数组
    
    $excel_data = $this->get_excel_data($excel_path);
    
    //调用插入方法
    
    $this->all_insert($excel_data);
    

    }

    /**

    • excel文件上传

    • @return string excel路径

    • @author 命中水

    */

    function get_excel_path() {

    if (!empty($_FILES['xls_file']['name'])) {
    
        $filename = $_FILES['xls_file']['name'];
    
        $fileTmpAddr = $_FILES['xls_file']['tmp_name'];
    
        $extend = strrchr($filename, '.');  //获取文件后缀名
    
        //上传后的文件名
    
        $excel_path = base_url() . date("YmdHis") . $extend; //上传后的文件名地址
    
        /* 判别是不是.xls或者xlsx文件,判别是不是excel文件 */
    
        if ($extend != ".xls" and $extend != '.xlsx') {
    
            throw new Exception("不是Excel文件,请重新上传!", -1);
    
        } else {
    
            //$readerType = ($extend == ".xlsx") ? "Excel2007" : "Excel5";
    
            $result = move_uploaded_file($fileTmpAddr, $excel_path);
    
            if( !empty( $result ) ) { //如果上传成功 调用excel解析文件方法  传入文件地址
    
                return $excel_path;
    
            }
    
        }
    
    }	
    

    }

    /**

    • get_excel_data文件解析成数组

    • @param string $excel_path excel文件路径

    • @return array excel数组

    • @author 命中水、

    */

    function get_excel_data($excel_path) {

    //引入phpexcel类库
    
    $this->load->library('PHPExcel');
    
    $this->load->library('PHPExcel/IOFactory');
    
    //实例化excel  传入文件路径
    
    $objPHPExcel = IOFactory::load($excel_path);
    
    //调用类库解析excel文件成数组
    
    $excel_data = $objPHPExcel->getActiveSheet()->toArray(null, true, true, true);
    
    
    
    unset($sheetData[1]);   //释放表头信息
    
    unset($sheetData[2]);   //释放表头信息
    
    return $excel_data;
    

    }

导出数据到Excel

<?php

/**

 * excel导出

 * @return  file

 * @author 命中水、 

 */

function excel_daochu() {

	//设置表格标头

	$excel_bt = array(

		'A1' => '2016-10-16 excel导出测试', 'A2' => '时间', 'B2' => '地点', 'C2' => '人物');

	//设置导出信息

	$excel_msg = array(

		0 => array(

			'time' => time(),

			'address' => '秦岭云海',

			'name' => '张起灵'

			),

		1 => array(

			'time' => time(),

			'address' => '云顶天宫',

			'name' => '吴邪'

			),

		2 => array(

			'time' => time(),

			'address' => '怒海潜沙',

			'name' => '三叔'

			),

		);



	//引入excel类库

	$this->load->library('PHPExcel');

    $this->load->library('PHPExcel/IOFactory');

    //实例化

    $objPHPExcel = new PHPExcel();

    $objWriter = new PHPExcel_Writer_Excel2007($objPHPExcel);

	//设置表头

    $this->Excel_bt($objPHPExcel, $excel_bt);

    //导出的内容

    $this->Excel_lr($objPHPExcel, $excel_msg);

    //设置单元格的宽度

    $objPHPExcel->getActiveSheet()->getColumnDimension('b')->setWidth(15);



    //合并单元格

    $objPHPExcel->getActiveSheet()->mergeCells('A1:Q1');

    //水平垂直居中设置

    $objPHPExcel->getActiveSheet()->getStyle('A1')->getAlignment()->setVertical(PHPExcel_Style_Alignment::VERTICAL_CENTER);

    $objPHPExcel->getActiveSheet()->getStyle('A1')->getAlignment()->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_CENTER);

    $filename = iconv('utf-8', 'gb2312', $excel_bt['A1']);



    //清空缓冲区

    ob_end_clean();





    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 . '.xlsx"');

    header("Content-Transfer-Encoding:binary");

    $objWriter->save('php://output');

}



//设置到导出标题的方法

public function Excel_bt($objPHPExcel, $excel_bt) {

    foreach ($bt_data as $key => $value) {

        $objPHPExcel->getActiveSheet()->setCellValue($key, $value);

    }

}



//设置导出的内容

public function Excel_lr($objPHPExcel, $excel_msg) {

	//从第三行开始导出  第一行第二行 设置表头

    $i = 3;

    $data = 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');

    foreach ($excel_msg $key => $value) {

        $j = 0;

        foreach ($value as $k => $v) {

        	//$j = 0   $i = 3   $data[$j] . $i == A3

            $objPHPExcel->getActiveSheet()->setCellValue($data[$j] . $i, $v);

            $j++;

        }

        $i++;

    }

}

常见问题

找不到文件

    原因可能是因为缓冲区没有打开或者mb_overlod_func函数没有关闭,解决这个问题的办法一般就是把php.inidisplay_errors打开,下载文件,打开后会提示相应错误信息。如果是因为mb_overlod_func函数没有关闭,那么就在php.ini文件中找到mbsrtring.func_overload=7,注释掉即可。

    ru’guo能正常导出excel但是没有数据,那么一般是你的代码写错了(坏笑.jpg)

生成excel文件打开报错

    我曾经遇到过类似的问题,也纠结了我好久,最终在一个不经意的情况下解决了。解决的办法是在方法一开始就用ob_end_clean清空缓冲区,然后在最后的excel输出文件之前再调用一次ob_end_clean。具体请参考我在segmentfault的提问,链接:[PHP生成excel文件打开报错][1];

打开excel文件乱码

    这个问题的原因,一般就是因为编码的问题了。因为我们的代码一般用的UTF-8编码,而windows下的编码一般为gb2312。解决方法一般是对文件名进行iconv转码iconv('utf-8", "gb2312", $filename)

总结

    以上就是PHPExcel类库导入导出的具体使用方法了,每一行,每一个步骤的注释也写的很清楚了,如果有疑问的童鞋可以私密博主呦~ QAQ

附录资料

  1. PHPExcel 类库压缩包下载:[PHPExcel.rar][2]

  2. [PhpExcel中文帮助手册|PhpExcel使用方法][3]