ThinkPHP3.2.3集成PHPExcel,Linux下导出Excel乱码问题终极解决

PHPExcel

PHPExcel集成了强大的功能。这里主要讲解如何使用Excel的导入导出功能。
PHPExcel下载地址:http://phpexcel.codeplex.com/

ThinkPHP3.2.3集成PHPExcel

1、下载PHPExcel
2、将Classes下的PHPExcel.php及PHPExcel文件夹拷贝到ThinkPHP\Library\Org\Util目录下,并将PHPExcel.php重全名为PHPExcel.class.php
3、调用PHPExcel的功能,我的做法是把其功能封装在一个文件excel.php,放在Common目录下。
excel.php代码如下:

<?php
/**
 * 将Excel数据读取到数组
 * @param string $fileName Excel文件名
 * @return array
 */
function readExcel($filename){
    //导入PHPExcel类库,因为PHPExcel没有用命名空间,只能inport导入
    import("Org.Util.PHPExcel");

    //创建PHPExcel对象,注意,不能少了\
    $PHPExcel=new \PHPExcel();
    //如果excel文件后缀名为.xls,导入这个类
    import("Org.Util.PHPExcel.Reader.Excel5");
    $PHPReader=new \PHPExcel_Reader_Excel5();

    //如果excel文件后缀名为.xlsx,导入这下类
    if(strstr($filename,'.xlsx')){
        import("Org.Util.PHPExcel.Reader.Excel2007");
        $PHPReader=new \PHPExcel_Reader_Excel2007();
    }   

    //载入文件
    $PHPExcel=$PHPReader->load($filename);
    //获取表中的第一个工作表,如果要获取第二个,把0改为1,依次类推
    $currentSheet=$PHPExcel->getSheet(0);
    //获取总列数
    $allColumn=$currentSheet->getHighestColumn();
    //获取总行数
    $allRow=$currentSheet->getHighestRow();
    //循环获取表中的数据,$currentRow表示当前行,从哪行开始读取数据,索引值从0开始
    for($currentRow=1;$currentRow<=$allRow;$currentRow++){
        //从哪列开始,A表示第一列
        for($currentColumn='A';$currentColumn<=$allColumn;$currentColumn++){
            //数据坐标
            $address=$currentColumn.$currentRow;
            //读取到的数据,保存到数组$arr中
            $arr[$currentRow][$currentColumn]=$currentSheet->getCell($address)->getValue();
        }

    }
    return $arr;
}

/**
 * 将二维数组数据导出到excel
 * @param string $fileName 文件名
 * @param array $headArr Excel表头
 * @param array $data 写入excel的数据
 * @return null
 */
function downloaddExcel($fileName,$headArr,$data){
    //导入PHPExcel类库,因为PHPExcel没有用命名空间,只能inport导入
    import("Org.Util.PHPExcel");
    import("Org.Util.PHPExcel.Writer.Excel5");
    import("Org.Util.PHPExcel.IOFactory.php");

    //对数据进行检验
    if(empty($data) || !is_array($data)){
        die("data must be a array");
    }
    //检查文件名
    if(empty($fileName)){
        exit;
    }

    $date = date("Y_m_d",time());
    $fileName .= "_{$date}.xls";

    //创建PHPExcel对象,注意,不能少了\
    $objPHPExcel = new \PHPExcel();
    $objProps = $objPHPExcel->getProperties();

    //设置表头
    $key = ord("A");
    foreach($headArr as $v){
        $colum = chr($key);
        $objPHPExcel->setActiveSheetIndex(0) ->setCellValue($colum.'1', $v);
        $key += 1;
    }

    $column = 2;
    $objActSheet = $objPHPExcel->getActiveSheet();
    foreach($data as $key => $rows){ //行写入
        $span = ord("A");
        foreach($rows as $keyName=>$value){// 列写入
            $j = chr($span);
            $objActSheet->setCellValue($j.$column, $value);
            $span++;
        }
        $column++;
    }

    $fileName = iconv("utf-8", "gb2312", $fileName);
    //重命名表
    // $objPHPExcel->getActiveSheet()->setTitle('test');
    //设置活动单指数到第一个表,所以Excel打开这是第一个表
    $objPHPExcel->setActiveSheetIndex(0);
    header('Content-Type: application/vnd.ms-excel');
    header("Content-Disposition: attachment;filename=\"$fileName\"");
    header('Cache-Control: max-age=0');

    $objWriter = \PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel5');
    $objWriter->save('php://output'); //文件通过浏览器下载
    exit;
}
?>

以上函数实现了导入导出Excel功能。
4、加载excel.php文件,在config.php中加入如下配置:

//加载公共函数文件
'LOAD_EXT_FILE' => 'excel',

5、在工程中任何位置都可以调用function readExcel($filename)function downloaddExcel($fileName,$headArr,$data)方法了。
6、以上代码在Windows下测试良好,放到Linux服务器后导出始终乱码。
解决方法:在header前加如下代码

ob_end_clean();// 清空(擦除)缓冲区并关闭输出缓冲

原因肯定是由于其他缓冲区内容输入到了Excel中,导致无法识别。
大功告成!
导出报表的样式设置参考:http://www.cnblogs.com/freespider/p/3332550.html

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值