如果,做了个简单demo,发现在导出33000条是还能导出,到35000条以上时Fatal error: Allowed memory size of 268435456 bytes exhausted (tried to allocate 1032 bytes) in C:\ComsenzEXP\wwwroot\fujielectric_admin\inc\PHPExcel\Cell.php on line 1166
就出现以上错误了. 
不知道大家有没有遇到这个问题.如果用phpadmin中导出execl的方法(可以查看http://bbs.csdn.net/topics/340074667#post-341254811)
如果客户端office 03版的话,数据导出时,如果超过65536时,后面的数据就自动消失了,这种方法可以生成新的sheet吗?

解决方案 »

  1.   

    出现错误的原因是可用内存不够了,你可以适当调高 memory_limit 试试(修改 php.ini 和 ini_set 都可以)execl2003 及以下的工作簿最多容纳65536行,execl2007是否有所突破不很清楚
    极少使用execl
      

  2.   


    php.ini中的256M 改成512  35000条可以了,但是又有响应超过60s的问题.phpexecl 有没有一条一套往execl里写数据的啊,第二种貌似就是这么做的
      

  3.   

    今天凌晨我遇到了和楼主问题1同样的情况,也是使用php处理较大量数据(3w条记录左右,每条记录100个字段左右),报错相同经检查报错位置是将所有数据写入同一个数组时报错处理办法是写入同一个数组前去掉不需要的字段,只写入需要的字段.成功通过.=========================我也是使用php处理大量数据生成excel表格,不过我没有使用phpexcel,而是简单的输出到页面(table),然后全选复制到excel中.感觉在字段比较多的情况下比phpexcel方便.所以问题1跟excel是无关的仅仅是php无法处理太大的数组.
      

  4.   


    不知道你说的响应60秒是哪里的限制.php的话我在处理数据页面第一行写入set_time_limit(0);就OK了我的数据处理了近一个小时才出结果.
      

  5.   


    我说的是phpexecl组件,太耗内存了,不过你的方法应该和我第二种方法差不多,可过是03版的office,数据一多就会有问题.
      

  6.   

    顶顶.
    还有什么其他 execl 组件吗? 最好能支持生成sheets(避免一个sheet内数据太多)
      

  7.   

    支持2007的貌似就这一个了。2003的可以用
    http://code.google.com/p/php-excel-reader/downloads/list这里比较老的。貌似有个错误。用较新的php版本会报错。想用就靠自己了
      

  8.   

    你这个是在循环大数组吧?
    你不要一次性把东西全放数组里面循环,可以采用分页
    比如:
    $page = 1;
    $pagesize  = 1000;
    $rows = getFromDb($page,$pagesize);
    while(!empty($rows)){
    foreach($rows as $row){
    //写入excel
    }
    $page ++;
    $rows = getFromDb($page,$pagesize);
    }
    这个明白了吧?
      

  9.   


    嗯.我是一次性循环的.分页或者分块的话,怎么放到一个execl里?
      

  10.   


    我真服了你
    你放一个数组里面和用循环不是一样的写excel吗?为什么会有“怎么放到一个execl里”这个疑问?
      

  11.   


    就比如说现在有100袋米,你要放到仓库去
    你的方法是一次性把100袋米扛起来,这是你扛不住了所以你不得不换个方法,一次抗10袋,分10次抗,这个时候你会不会出现,分10次我怎么把米放到一个仓库的疑问呢?我想应该不会吧。我上面都把代码描述给你了:
    你的实现:
    $rows = getFromDb();//将所有数据放一个数组,就像一次抗100袋米
    foreach($rows as $row){//循环写入excel
        //写入excel
     }你改为:
    $page = 1;//第一趟
    $pagesize  = 10;//每趟抗10袋
    $rows = getFromDb($page,$pagesize);//将第一个10袋扛起来
    while(!empty($rows)){//如果还有米
        foreach($rows as $row){//将扛着的10袋放入仓库
            //写入excel
        }
        $page ++;//跑下一趟
        $rows = getFromDb($page,$pagesize);//抗下一个10袋
    }
    这下还不理解我就没办法了
      

  12.   

    我的意思是分块处理写入execl,貌似只执行第一次,后面的循环没进去.
      

  13.   

    难道还要再写个文件,判断导出时要分成几次执行?再调用导出excel的php?