http://topic.csdn.net/u/20091204/15/93ff0f16-9e5d-46b7-b5ed-63f3b7cb689e.html?seed=1275228797&r=61707354#replyachor
这个是我上个星期提出的问题! 我现在还是没弄懂! 湖水清澈 说的方法我也没弄懂! 希望唠叨大哥能赐教! 我在网上找过!基本上说的怎么样实现!没有对数据量大的情况作过多解释!
这个是我上个星期提出的问题! 我现在还是没弄懂! 湖水清澈 说的方法我也没弄懂! 希望唠叨大哥能赐教! 我在网上找过!基本上说的怎么样实现!没有对数据量大的情况作过多解释!
我问的是 你的想法就是 从数据看里面选出文件 然后在循环eacho出来?
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>";}
/**
* 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");
*/?>
$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);
}
1、将查询结果全部存放于数组,将占去 X 内存空间
2、传入类并用 foreach 循环,将占去 X 内存空间
3、缓存结果又将占去 X+Y 内存空间(Y 为标记占用空间的总和)
至少需内存 3X+Y系统默认的最大可用空间
memory_limit = 128M
一般不宜变动,应该从程序中着手优化
1、查询后,每次读取一条记录,并执行 Excel 类的 addRow 方法
这样可缩减内存到 X+Y
2、将格式化后的行直接输出,也可通过文件缓存
csv 手册上就有例子 看一下手册