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上传

<!-- Html上传 -->
<div class="div_center">
    <form action="<?php echo module_url('excel/common/ajax_all_daoru/');?>" method="post" enctype="multipart/form-data">
        <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>  
</div>
  1. 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文件打开报错

打开excel文件乱码

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

总结

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

附录资料

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

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

添加新评论