word1018808441 2015-04-11 11:04:46 13327次浏览 18条评论 45 13 0
<?php
/**
 * 生成excel文件操作
 *
 * @author wesley wu
 * @date 2013.12.9
 */
class Excel
{
     
    private $limit = 10000;
     
    public function download($data, $fileName)
    {
        $fileName = $this->_charset($fileName);
        header("Content-Type: application/vnd.ms-excel; charset=gbk");
        header("Content-Disposition: inline; filename=\"" . $fileName . ".xls\"");
        echo "<?xml version=\"1.0\" encoding=\"gbk\"?>\n
            <Workbook xmlns=\"urn:schemas-microsoft-com:office:spreadsheet\"
            xmlns:x=\"urn:schemas-microsoft-com:office:excel\"
            xmlns:ss=\"urn:schemas-microsoft-com:office:spreadsheet\"
            xmlns:html=\"http://www.w3.org/TR/REC-html40\">";
        echo "\n<Worksheet ss:Name=\"" . $fileName . "\">\n<Table>\n";
        $guard = 0;
        foreach($data as $v)
        {
            $guard++;
            if($guard==$this->limit)
            {
                ob_flush();
                flush();
                $guard = 0;
            }
            echo $this->_addRow($this->_charset($v));
        }
        echo "</Table>\n</Worksheet>\n</Workbook>";
    }
     
    private function _addRow($row)
    {
        $cells = "";
        foreach ($row as $k => $v)
        {
            $cells .= "<Cell><Data ss:Type=\"String\">" . $v . "</Data></Cell>\n";
        }
        return "<Row>\n" . $cells . "</Row>\n";
    }
     
    private function _charset($data)
    {
        if(!$data)
        {
            return false;
        }
        if(is_array($data))
        {
            foreach($data as $k=>$v)
            {
                $data[$k] = $this->_charset($v);
            }
            return $data;
        }
        return iconv('utf-8', 'gbk', $data);
    }
     
}

//使用方法

$excel = new Excel();

$data = array(
    array('姓名','标题','文章','价格','数据5','数据6','数据7'),
    array('数据1','数据2','数据3','数据4','数据5','数据6','数据7'),
    array('数据1','数据2','数据3','数据4','数据5','数据6','数据7'),
    array('数据1','数据2','数据3','数据4','数据5','数据6','数据7'),
    array('数据1','数据2','数据3','数据4','数据5','数据6','数据7'),
    array('数据1','数据2','数据3','数据4','数据5','数据6','数据7')
);

$excel->download($data, '这是一个测试');

?>
觉得很赞
  • 评论于 2015-04-11 12:20 举报

    支持,支持,支持。。。。。。。。

  • 评论于 2015-04-16 15:32 举报

    为何不使用PHPEXCEL呢?亲

  • 评论于 2015-06-15 17:56 举报

    大赞

    就喜欢这种代码量少,简单的,并且能解决问题的干货。

  • 评论于 2015-08-06 11:06 举报

    如果数据$data是数据库查出来的
    那 array('数据1','数据2','数据3','数据4','数据5','数据6','数据7'),

    array('数据1','数据2','数据3','数据4','数据5','数据6','数据7'),
    array('数据1','数据2','数据3','数据4','数据5','数据6','数据7'),
    array('数据1','数据2','数据3','数据4','数据5','数据6','数据7'),
    array('数据1','数据2','数据3','数据4','数据5','数据6','数据7')
    

    这一段怎么修改??

    2 条回复
    评论于 2015-08-24 14:02 回复

    foreach

    评论于 2015-11-26 10:12 回复

    确实不错

  • 评论于 2015-08-07 10:16 举报

    ob_flush();
    flush();
    这两句什么作用 我去掉没任何影响

    1 条回复
    评论于 2015-08-07 11:13 回复

    每当行数达到10000行的时候输出缓存区。如果去掉,那就是当输出的内容达到一定限度后(一般是4069字符)自动输出。去不去掉其实结果是一样的,只不过加上后过程更加流顺。

  • 评论于 2015-08-14 21:23 举报

    不错不错!

  • 评论于 2015-09-06 17:21 举报

    发现有问题,值是0的时候会输出空,还有记录少了导出也有问题

    4 条回复
    评论于 2015-11-26 11:09 回复

    值为0,或null都会输出为空?这个怎么解决呢?

    评论于 2015-12-08 17:06 回复

    在下载的时候直接退出,就行了

    评论于 2016-01-13 11:06 回复

    你好,,会直接被echo到页面,而不会被下载,会是什么情况呢?

    评论于 2016-06-03 14:44 回复

    在Mac上面出来的都是xml的格式,怎么解决呀?

    觉得很赞
  • 评论于 2015-10-12 17:41 举报

    的确很好用,也很方便,求一个导出EXCEL单元格换行的方法有没有!

  • 评论于 2015-12-10 19:38 举报

    生成的excel能直接保存到服务器上吗?

  • 评论于 2015-12-29 14:31 举报

    好东西,就喜欢这样的

  • 评论于 2015-12-29 14:31 举报

    怎么下载呢?

  • 评论于 2016-04-22 14:01 举报

    是啊 怎么下载啊

  • 评论于 2016-07-21 11:44 举报

    特来此表达感谢~~~~

    $data = array(
        array('姓名','标题','文章','价格','数据5','数据6','数据7'),
        array('数据1','数据2','数据3','数据4','数据5','数据6','数据7'),
        array('数据1','数据2','数据3','数据4','数据5','数据6','数据7'),
        array('数据1','数据2','数据3','数据4','数据5','数据6','数据7'),
        array('数据1','数据2','数据3','数据4','数据5','数据6','数据7'),
        array('数据1','数据2','数据3','数据4','数据5','数据6','数据7')
    );
    

    这一部分可以用foreach重拼一下:

    $tmpdata=array();
    $tmpdata[0]=array('id','name','sex');//表头
    $i=1;
    foreach($mydata as $item){
    $tmpdata[$i]=array($item['id'],$item['name'],$item['sex']);
    $i++;
    }
    $data=$tmpdata;
    
  • 评论于 2016-08-11 00:14 举报

    会直接被echo到页面,而不会被下载,会是什么情况呢?
    控制器里面怎么使用?

  • 评论于 2016-10-10 18:06 举报

    非常感谢,真的好用!

  • 评论于 2016-10-20 13:19 举报

    不知道在linux环境下是否支持呢?、

  • 评论于 2017-03-10 11:00 举报

    当条数少的时候 就被直接echo了

  • 评论于 2017-10-11 10:51 举报

    数据少的时候会被输出,需要强制下载的话,将下面的header:
    header("Content-Disposition: inline; filename=\"" . $fileName . ".xls\"");
    修改为:
    header("Content-Disposition: attachment; filename=\"" . $fileName . ".xls\"");
    即可。
    如果帮到你,请点个赞呀

您需要登录后才可以评论。登录 | 立即注册