PHPExcel如何导入和如何导出方法整理
2017-02-08| 程成| 2112| 0| PHP技术

今天开始接到一个需求,需要用到PHP导出数据到excel表格里。对于导出数据,只需要一张表,直接一条sql语句执行复制粘贴,后来需求变更后,需要三张表,还是一对多的关系,只能需求PHPExcel了,导出后自己做了个公用方法和拓展,留着以后用,如下:

 

首先从官网http://phpexcel.codeplex.com/

下载phpexcel插件

 

1、导入:

 

/**
 * 公用Excel导入功能,拼成一个大数组
 * @DateTime:2017-02-08 11:17:41
 * @Author:  cc
 */
function allrow_excel($filePath) {
    /*导入phpExcel核心类 */
    require_once './phpexcel/PHPExcel.php';
    require_once './phpexcel/PHPExcel/Writer/Excel5.php'; // 用于其他低版本xls
    require_once './phpexcel/PHPExcel/Writer/Excel2007.php'; // 用于 excel-2007 格式
    $PHPExcel = new \PHPExcel();
    /**默认用excel2007读取excel,若格式不对,则用之前的版本进行读取*/
    $PHPReader = new \PHPExcel_Reader_Excel2007();
    if (!$PHPReader->canRead($filePath)) {
        $PHPReader = new \PHPExcel_Reader_Excel5();
        if (!$PHPReader->canRead($filePath)) {
            echo 'no Excel';
            return;
        }
    }
    $PHPExcel = $PHPReader->load($filePath);
    $currentSheet = $PHPExcel->getSheet(0); //读取excel文件中的第一个工作表
    $allColumn = $currentSheet->getHighestColumn(); //取得最大的列号
    $allRow = $currentSheet->getHighestRow(); //取得一共有多少行
    $erp_orders_id = array(); //声明数组
    /**从第二行开始输出,因为excel表中第一行为列名*/
    for ($currentRow = 1; $currentRow <= $allRow; $currentRow++) {
        /**从第A列开始输出*/
        for ($currentColumn = 'A'; $currentColumn <= $allColumn; $currentColumn++) {
            $val = $currentSheet->getCellByColumnAndRow(ord($currentColumn) - 65, 
            $currentRow)->getValue();
            /**ord()将字符转为十进制数*/
            if ($val != '') {
                $erp_orders_id[] = $val;
            }
            /**如果输出汉字有乱码,则需将输出内容用iconv函数进行编码转换,如下将gb2312编码转为utf-8编码输出*/
            //echo iconv('utf-8','gb2312', $val)."\t";
        }
    }
    return $erp_orders_id;
}

 

这个方法返回的是一个大数组,所以的单元格数据都在其中

 

/**
 * 公用Excel导入功能,一行一个数组
 * @DateTime:2017-02-08 11:30:19
 * @Author:  cc
 */
function row_excel($filename) {
    header("Content-type:text/html;charset=utf-8");
    require_once './phpexcel/PHPExcel.php';
    $PHPExcel = \PHPExcel_IOFactory::load($filename);
    $currentSheet = $PHPExcel->getSheet(0); //第一个sheet
    $col = $currentSheet->getHighestColumn(); //取得总列数
    $row = $currentSheet->getHighestRow(); //取得总行数
    $arr = array();
    for ($currentRow = 1; $currentRow <= $row; $currentRow++) {
        for ($currentColumn = 'A'; $currentColumn <= $col; $currentColumn++) {
            $arr[$currentRow][] .= $currentSheet->getCellByColumnAndRow(ord($currentColumn)
             - 65, $currentRow)->getValue();
        }
    }
    return $arr;
}

 

这个方法返回的是一行一个子数组,一般我们使用的就是这个方法

 

2、导出:

/**
 * 自定义phpexcel通用导出
 * data数据,tableheader表头数组,name名称
 * @DateTime:2017-02-08 10:16:24
 * @Author:  cc
 */
function MyPHPExcel($data, $tableheader, $name) {
    $start_time = strtotime(I('post.begindate4'));
    $end_time = strtotime(I('post.enddate4'));
    //创建对象
    import("Org.Util.PHPExcel");
    $excel = new \PHPExcel();
    //Excel表格式,这里简略写了26列
    $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($tableheader); $i++) {
        $excel->getActiveSheet()->setCellValue("$letter[$i]1", "$tableheader[$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输入对象
    import("Org.Util.PHPExcel.Reader.Excel5");
    $write = new \PHPExcel_Writer_Excel5($excel);
    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="' . $name . '.xls"');
    header("Content-Transfer-Encoding:binary");
    $write->save('php://output');
}

 

这三个方法我都亲测可用,欢迎拍砖。

 

注:因为使用了命名空间,这些第三方位于公共空间上,所以在实例化之前加上“\”即可解决

 

×
作者:程成
QQ:492245711