用HEADER头方法来自动导出数据库数据为EXCEL,头结构:header("Content-type:application/vnd.ms-excel;charset=utf-8");
 
    上面的头文件方法测试OK,也无乱码!    但当导出EXCEL的数据条数量超过一定条数,一般100多条左右,一行的英文加中文字10来个字符,超过100多条后的数据将不显示,因为每次查询导出的数据都不相同,有的时候到100多行就不显示了,有的时候到300多条以后就不显示了,但是这些导出数据在PHP里用print_r从数据库里读取的数据一切正常,就是导出到EXCEL无法全部导出。望大家一起来讨论一下,非常感谢!

解决方案 »

  1.   

    EXCEL 的行上限为 65536
    可能你导出的数据中的二进制内容造成 EXCEL 终止
      

  2.   

      代码如下:
        
     header("Content-type:application/vnd.ms-excel;charset=utf-8"); //定义EXCEL头
     $mysql = new mysql($dbhost,$dbuser,$dbpass,$dbname,$dbcode); //测试时套自己的数据
     $datasql="SELECT  * FROM message ORDER BY id DESC"; //从信息表里查数据
     $alldata=$mysql->getall($datasql);//用类获取所有数据
      $str='';
    $str.="数据流大小为:".strlen($str)."\t\n";//这行测试的时候自己加或不加
    $str="时间"."\t";
    $str.="发言人"."\t";
    $str.="职业"."\t";
    $str.="内容"."\t";
    $str.="回复时间"."\t";
    $str.="\n";
      foreach($alldata as $v)
    {
           $str.=$v['ltime']."\t";
       $str.=$v['lman']."\t";
       $str.=$v['lzhiye']."\t";
       $str.=$v['lcontent']."\t";
       $str.=$v['lbacktime']."\t";
       $str.="\n";
    }
            大概代码如上,具体情况测试的时候根据自己的本地情况进行调整,看看数据量大的时候在你们的本地端是否能正确全部读出数据并导入EXCEL ,注:测试环境最好能和我一样,红帽5企业服务器版。     我这里的话测试结果是,WIN主机上本地端的导出EXCEL很正常,数据量上千条也正常导出EXCEL,无论IE或FF都可以。
         核心:但是把同样代码和数据库放到LINUX服务器(rhdl5.5)上的时候,根据信息查询,结果应该是1000多条的,可导到EXCEL的数据到了100多条或200多条的时候就被截断了。无法显示后面的数据。
      

  3.   

    代码忘记了底部:所有库页编码都为Utf8,但是因为XP下EXCEL显示是GBk的,完整代码为:
        
     header("Content-type:application/vnd.ms-excel;charset=utf-8"); //定义EXCEL头
     $mysql = new mysql($dbhost,$dbuser,$dbpass,$dbname,$dbcode); //测试时套自己的数据
     $datasql="SELECT  * FROM message ORDER BY id DESC"; //从信息表里查数据
     $alldata=$mysql->getall($datasql);//用类获取所有数据
      $str='';
        $str.="数据流大小为:".strlen($str)."\t\n";//这行测试的时候自己加或不加
        $str="时间"."\t";
        $str.="发言人"."\t";
        $str.="职业"."\t";
        $str.="内容"."\t";
        $str.="回复时间"."\t";
        $str.="\n";
      foreach($alldata as $v)
        {
           $str.=$v['ltime']."\t";
           $str.=$v['lman']."\t";
           $str.=$v['lzhiye']."\t";
           $str.=$v['lcontent']."\t";
           $str.=$v['lbacktime']."\t";
           $str.="\n";
        }
         $str=iconv('utf-8','gb2312//IGNORE',$str);
         echo $str;
    本地端导出EXCEL不乱码,而且全部正常导出。到red hat LINUX服务器上就不OK了。被截断,但是绝对没有乱码,前面显示依然正常。
        
      

  4.   

    你是把全部数据都放在变量中,最后在一次性转码的
    这样就要考虑 内存是否足够,运行时是否超时了(注意不仅仅 php 有超时问题,web 服务器也有超时问题)
      

  5.   

    那分开转码,我也试过了。就是单独的,那样的情况就会乱码了。比如;
      $str.=iconv('utf-8','gb2312//IGNORE',$v['ltime']."\t");
      $str.=iconv('utf-8','gb2312//IGNORE',$v['lman']."\t");
        ...
    这样按字段的,下面整体UTF8转GB2312的$str我就删除,结果好象还是不行。
      

  6.   

      根据斑竹的提示,问题解决!类似帖参考:http://www.jb51.net/article/28438.htm,完全一样的问题难找,但是类似的问题,举一反三的情况还是很多的。
      WIN本地端没问题,而LINXU有问题,应该是LINUX服务器对内存进行了限制,其他暂时找不到更好的理由了。再一次对斑竹的提示表示感谢!
      解决思路:
       方法1、按斑竹的提示,分字段转化编码,不要把大变量一次性转化就OK了。原因就出在ICONV上,这个函数的数据转化量因个服务器设置不同而不同,至于这种问题在哪里设置配置变量,我就不是很清楚了。
       方法2、不用ICONV转换,直接用mb_convert_encoding来转,这个能转的数据量应该会更多。经过我这里测试,只要把尾巴的$str=iconv('utf-8','gb2312//IGNORE',$str);这个改用mb_convert_encoding即可。大变量一样转化OK,到LINUX下使用也正常。
       方法3、不知道有没有解决方法3呢?别说我多此一举哦,喜欢一个问题多条解决思路,喜欢举一反三。可能有点痴呆的感觉,呵呵!     此帖晚上结。