http://topic.csdn.net/u/20091204/15/93ff0f16-9e5d-46b7-b5ed-63f3b7cb689e.html?seed=1275228797&r=61707354#replyachor
这个是我上个星期提出的问题! 我现在还是没弄懂! 湖水清澈 说的方法我也没弄懂! 希望唠叨大哥能赐教! 我在网上找过!基本上说的怎么样实现!没有对数据量大的情况作过多解释!

解决方案 »

  1.   

    我没有你的 Excel 类,自然也提不出建设性意见
      

  2.   


    我问的是 你的想法就是  从数据看里面选出文件 然后在循环eacho出来?
      

  3.   

    header("Content-type:application/vnd.ms-excel");   
    header("Content-Disposition:filename=\"" . $filename . ".xls\"");   
    数据库选出数据
    FOR($i=0;$i++;$i>xx)
    {
    echo "<table>
    <tr><td>id</td><td>result[$i][0]</td></tr>
    <tr><td>1</td><td>result[$i][1]</</td></tr>
    </table>";}
      

  4.   

    唠叨大哥 我刚才试了一下 我把memory_limit都设置了200M 但是提示还是内存不够用! 我都不知道那边有问题! 我贴一下我的EXECL类 给你看看<?php
    /**
     * Excel vendor By dx_andy
     * 整理自 class-excel-xml.inc.php
     * 时间 2008-3-27 11:58
     * 文件编码 utf-8
     *
     *
     * 整理记录:
     * 原文件中(function addRow) utf8_encode($v) => $v
     * 并添加判断字符串是 数字型 还是 字符串型的方法
     */class Excel{    /**
         * Header of excel document (prepended to the rows)
         *
         * Copied from the excel xml-specs.
         *
         * @access private
         * @var string
         */
        var $header = "<?xml version=\"1.0\" encoding=\"UTF-8\"?\>
    <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\">";    /**
         * Footer of excel document (appended to the rows)
         *
         * Copied from the excel xml-specs.
         *
         * @access private
         * @var string
         */
        var $footer = "</Workbook>";    /**
         * Document lines (rows in an array)
         *
         * @access private
         * @var array
         */
        var $lines = array ();    /**
         * Worksheet title
         *
         * Contains the title of a single worksheet
         *
         * @access private
         * @var string
         */
        var $worksheet_title = "Table1";    /**
         * Add a single row to the $document string
         *
         * @access private
         * @param array 1-dimensional array
         * @todo Row-creation should be done by $this->addArray
         */
        function addRow ($array) {        // initialize all cells for this row
            $cells = "";        // foreach key -> write value into cells
            foreach ($array as $k => $v):         // 加个字符串与数字的判断 避免生成的 excel 出现数字以字符串存储的警告
             if(is_numeric($v)) {
             // 防止首字母为 0 时生成 excel 后 0 丢失
             if(substr($v, 0, 1) == 0) {
             $cells .= "<Cell><Data ss:Type=\"String\">" . $v . "</Data></Cell>\n";
             } else {
             $cells .= "<Cell><Data ss:Type=\"Number\">" . $v . "</Data></Cell>\n";
             }
             } else {
                 $cells .= "<Cell><Data ss:Type=\"String\">" . $v . "</Data></Cell>\n";
             }        endforeach;        // transform $cells content into one row
            $this->lines[] = "<Row>\n" . $cells . "</Row>\n";    }    /**
         * Add an array to the document
         *
         * This should be the only method needed to generate an excel
         * document.
         *
         * @access public
         * @param array 2-dimensional array
         * @todo Can be transfered to __construct() later on
         */
        function addArray ($array) {        // run through the array and add them into rows
            foreach ($array as $k => $v):
                $this->addRow ($v);
            endforeach;    }    /**
         * Set the worksheet title
         *
         * Checks the string for not allowed characters (:\/?*),
         * cuts it to maximum 31 characters and set the title. Damn
         * why are not-allowed chars nowhere to be found? Windows
         * help's no help...
         *
         * @access public
         * @param string $title Designed title
         */
        function setWorksheetTitle ($title) {        // strip out special chars first
            $title = preg_replace ("/[\\\|:|\/|\?|\*|\[|\]]/", "", $title);        // now cut it to the allowed length
            $title = substr ($title, 0, 31);        // set title
            $this->worksheet_title = $title;    }    /**
         * Generate the excel file
         *
         * Finally generates the excel file and uses the header() function
         * to deliver it to the browser.
         *
         * @access public
         * @param string $filename Name of excel file to generate (...xls)
         */
        function generateXML ($filename) {        // deliver header (as recommended in php manual)
            header("Content-Type: application/vnd.ms-excel; charset=UTF-8");
            header("Content-Disposition: inline; filename=\"" . $filename . ".xls\"");        // print out document to the browser
            // need to use stripslashes for the damn ">"
            echo stripslashes ($this->header);
            echo "\n<Worksheet ss:Name=\"" . $this->worksheet_title . "\">\n<Table>\n";
            echo "<Column ss:Index=\"1\" ss:AutoFitWidth=\"0\" ss:Width=\"110\"/>\n";
            echo implode ("\n", $this->lines);
            echo "</Table>\n</Worksheet>\n";
            echo $this->footer;
        }}
    /**
     *  CakePHP中使用方法
     *  注意 ** cakePHP 配置文件 define('DEBUG', 0);
     *
     *  vendor ('Excel');
     *  $doc = array (
     *       0 => array ('中国', '中国人', '中国人民', '123456');
     *  );
     *  $xls = new Excel;
     *  $xls->addArray ( $doc );
     *  $xls->generateXML ("mytest");
     *//**
     *  非框架使用方法
     *
     *  require_once('excel.php');
     *  $doc = array (
     *       0 => array ('中国', '中国人', '中国人民', '123456');
     *  );
     *  $xls = new Excel;
     *  $xls->addArray ( $doc );
     *  $xls->generateXML ("mytest");
     */?>
      

  5.   

    最简单的方法直接生成excel
    $file_type = "vnd.ms-excel";
         $file_ending = "xls";
         header("Content-Type: application/$file_type; charset=UTF-8");
         header("Content-Disposition : attachment; filename=emailaction.$file_ending");
         header("Pragma: no-cache");
         header("Expires: 0");
      $sep = "\t";
       echo "你要的字段\t";
       echo "你要的字段\t";
       print("\n");
       $i = 0;
      $sql="select * from tt";
      $res=mysql_query($sql);
      while($row = mysql_fetch_row($res)) {
        $schema_insert = "";
        for($j=0; $j<$len;$j++) {
            if(!isset($row[$j]))
                $schema_insert .= "NULL".$sep;
            elseif ($row[$j] != "")
                $schema_insert .= "$row[$j]".$sep;
            else
                $schema_insert .= "".$sep;
        }
        $schema_insert = str_replace($sep."$", "", $schema_insert);
        $schema_insert .= "\t";
        print(trim($schema_insert));
        print "\n";
        $i++;
    }
    return (true);
    }
      

  6.   

    如果就是简单的 操作 就没必要用类了设置一个下 set_time_limit(0);
      

  7.   

    如果数据格式不复杂, 为什么不用 CSV?
      

  8.   

    根据你的类和你的代码可知
    1、将查询结果全部存放于数组,将占去 X 内存空间
    2、传入类并用 foreach 循环,将占去 X 内存空间
    3、缓存结果又将占去 X+Y 内存空间(Y 为标记占用空间的总和)
    至少需内存 3X+Y系统默认的最大可用空间
    memory_limit = 128M
    一般不宜变动,应该从程序中着手优化
    1、查询后,每次读取一条记录,并执行 Excel 类的 addRow 方法
    这样可缩减内存到 X+Y
    2、将格式化后的行直接输出,也可通过文件缓存
      

  9.   


    csv 手册上就有例子  看一下手册