按日期归档:2013 年 5 月 19 日

PHP彩蛋入侵

关于“PHP彩蛋”的说法也许很多老PHPer已经都知道或听说了,好像是早在PHP4版本的时候就有彩蛋了,挺好玩儿的,可能近年来逐渐被人们遗忘了,其实彩蛋功能在PHP脚本引擎默认情况下是开启。
下面就用Discuz官方论坛做一下测试:
http://www.discuz.net/?=PHPE9568F34-D428-11d2-A769-00AA001ACF42
http://www.discuz.net/?=PHPE9568F35-D428-11d2-A769-00AA001ACF42
http://www.discuz.net/?=PHPE9568F36-D428-11d2-A769-00AA001ACF42
http://www.discuz.net/?=PHPB8B5F2A0-3C92-11d3-A3A9-4C7B08C10000
如上4个链接加红色的部分是PHP源码/ext/standard/info.h中定义的GUID值,如下图所示
关于PHP彩蛋这个玩法已经被国外的某些Web漏洞扫描器(例如:HP WebInspect)所使用了,用其来探测被扫描的网站使用的是何种Web开发语言。其实在渗透测试过程中经常遇见某些网站难以辨别出使用了何种Web开发语言,因为有些网站采用动态脚本生成纯静态HTML页或者是采用URL重写实现伪静态页面,如果网站使用的是PHP开发的话,可以尝试使用彩蛋的探测法,在很多情况下可以一针见血的鉴定出来,因为默认情况下彩蛋的功能在php.ini中是开启的,当然如果不想让别人通过彩蛋的方式来获取网站的敏感信息的话,那就在php.ini中将expose_php = Off即可!
看完上面这些可能有些人会说既然php.ini中的expose_php = On,那么直接抓包看看http头信息不就OK了,可是某些大站点Web服务器的前面都是有反向代理服务器的,所以还不能完全依赖于捕获http头中的信息。

mysql密码找回

1、cmd进入命令行,切换到mysql的安装目录(本机mysql安装路径D:\MySQL)

C:\Documents and Settings\Administrator>d:
D:\>cd D:\MySQL\MySQL Server 5.0\bin
D:\MySQL\MySQL Server 5.0\bin>dir
 驱动器 D 中的卷是 新加卷
 卷的序列号是 923D-971E
 D:\MySQL\MySQL Server 5.0\bin 的目录
2010-01-12  15:44    <DIR>          .
2010-01-12  15:44    <DIR>          ..
2006-05-26  04:50         1,196,032 comp-err.exe
2006-05-26  04:50         1,470,464 libmySQL.dll
2006-05-26  04:50         1,433,600 myisamchk.exe
2006-05-26  04:50         1,339,392 myisamlog.exe
2006-05-26  04:50         1,351,680 myisampack.exe
2006-05-26  04:50         1,314,816 myisam_ftdump.exe
2006-05-26  04:50         1,572,864 mysql.exe
2006-05-26  04:50         1,437,696 mysqladmin.exe
2006-05-26  04:50         1,454,080 mysqlbinlog.exe
2006-05-26  04:50         1,425,408 mysqlcheck.exe
2006-05-26  04:50         6,680,576 mysqld-debug.exe
2006-05-26  04:50         4,648,960 mysqld-max-nt.exe
2006-05-26  04:50         4,644,864 mysqld-max.exe
2006-05-26  04:50         4,149,248 mysqld-nt.exe
2006-05-26  04:50         4,149,248 mysqld.exe
2006-05-26  04:50         1,466,368 mysqldump.exe
2006-05-26  04:50         1,429,504 mysqlimport.exe
2006-04-19  04:41         1,561,600 MySQLInstanceConfig.exe
2006-05-26  04:50         1,470,464 mysqlmanager.exe
2006-05-26  04:50         1,429,504 mysqlshow.exe
2006-05-26  04:50         1,527,808 mysqltest.exe
2006-05-26  04:50         1,761,280 mysql_client_test.exe
2006-05-26  04:50         1,191,936 my_print_defaults.exe
2006-05-26  04:50         1,171,456 perror.exe
2006-05-26  04:50         1,187,840 replace.exe
              25 个文件     52,466,688 字节
               2 个目录 23,282,192,384 可用字节
D:\MySQL\MySQL Server 5.0\bin>mysqld-nt –skip-grant-tables
2、cmd打开另一个命令行窗口
Microsoft Windows XP [版本 5.1.2600]
(C) 版权所有 1985-2001 Microsoft Corp.
C:\Documents and Settings\Administrator>mysql -uroot -p
Enter password:(这里提示输入密码直接回车即可)
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 3 to server version: 5.0.22-community-nt
Type ‘help;’ or ‘\h’ for help. Type ‘\c’ to clear the buffer.
mysql> update mysql.user set password=password(‘admin’) where user=’root’;(修改root用户密码)
Query OK, 2 rows affected (0.09 sec)
Rows matched: 2  Changed: 2  Warnings: 0
mysql> flush privileges;
Query OK, 0 rows affected (0.16 sec)
mysql> exit;
Bye
win7/win8使用管理员权限运行  kill mysqld进程

C:\Documents and Settings\Administrator>net start mysql
MySQL 服务已经启动成功。
C:\Documents and Settings\Administrator>net stop mysql
没有启动 MySQL 服务。
请键入 NET HELPMSG 3521 以获得更多的帮助。
C:\Documents and Settings\Administrator>net helpmsg 3521
没有启动 *** 服务。
C:\Documents and Settings\Administrator>net start mysql
MySQL 服务已经启动成功。

验证win7 win8是否激活的方法

方法一.直接打开WIN7 Activation点击”点击验证”(推荐);
方法二.在”运行”里输入 slmgr.vbs -dli 并回车;
方法二.在”运行”里输入 slmgr.vbs -xpr 并回车;
方法二.在”运行”里输入 winver 并回车;
方法四.在”运行”里输入 slmgr.vbs -dlv 并回车;
方法五.右键我的电脑属性 查看是否处于激活状态.

完美去掉Discuz x1.5中powered by discuz!

标题中的版权

在原来的discuz X1版本中,标题中去掉“Powered by Discuz!”版权标识很容易,只需要修改模板文件的头部公用文件,将[‘bbname’] – <!–{/if}–> Powered by Discuz!</title> 中红色部分去掉即可。
但是discuz X1.5直接把- Powered by Discuz!中的 – 放在了变量里,所以删除后,标题一句话结束后会有一个小 – 尾巴,对搜索引擎很不友好,所以也有一个好的办法完美解决,即:

打开\template\default\common\header_common.htm文件,找到<title><!–{if !empty($navtitle)}–>$navtitle – <!–{/if}–><!–{if empty
($nobbname)}–> $_G[‘setting’][‘bbname’] – <!–{/if}–> Powered by Discuz!</title>

将其中的“Powered By Discuz!”字串改为“{lang secondtitle}”。
再打开source/language/lang_template.php。在变量的最后,也就是整个数组的目录后按以前的格式,加上引号内的内容”  ‘secondtitle’ => ‘网站或论坛名称’,“。
更新缓存即可。
页底导航中的版权
打开\template\default\common\foot.htm文件
找到 <p>Powered by <strong><a href=”http://www.discuz.net” target=”_blank”>Discuz!</a></strong> <em>$_G[‘setting’][‘version’]</em><!–{if !empty($_G[‘setting’][‘boardlicensed’])}–> <a href=”http://license.comsenz.com/?pid=1&host=$_SERVER[HTTP_HOST]” target=”_blank”>Licensed</a><!–{/if}–></p><p>&copy; 2001-2010 <a href=”http://www.comsenz.com” target=”_blank”>Comsenz Inc.</a></p>
全部删除即可。
或者添加自己的代码如:
<p>24小时服务热线:0000-00000000</p>
   <p>Copyright &copy; 2011 ***.com Inc. All Rights Reserved. <a href=”http://www.***.com/” target=”_blank”>**公司</a> 版权所有</p>
  </div>

关于apache的域名重定向

同志们以后有可能用到域名301重定向,这个是apache的一般配置

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{HTTP_HOST} ^coolaj.cn$
RewriteRule ^(.*)$ http://www.coolaj.cn$1 [R=301,L]
</IfModule>

这个的意思是吧所有coolaj.cn的请求 301重定向到www.coolaj.cn

这个的前提是apache要开启mod_rewrite(apache的一个模块,是一个严格的Apache配置文件)
详情查看百度百科:http://baike.baidu.com/view/5016366.html?wtp=tt

MySQL复制表结构和内容到另一张表中的SQL

1.复制表结构及数据到新表

CREATE TABLE 新表
SELECT * FROM 旧表

2.只复制表结构到新表

CREATE TABLE 新表
SELECT * FROM 旧表 WHERE 1=2
即:让WHERE条件不成立.
方法二:(低版本的mysql不支持,mysql4.0.25 不支持,mysql5已经支持了)
CREATE TABLE 新表
LIKE 旧表

3.复制旧表的数据到新表(假设两个表结构一样)

INSERT INTO 新表
SELECT * FROM 旧表

4.复制旧表的数据到新表(假设两个表结构不一样)

INSERT INTO 新表(字段1,字段2,…….)
SELECT 字段1,字段2,…… FROM 旧表

php采集程序

其实,采集程序最简单的思路就是:获取页面代码——分析代码——获取需要的部分——写入数据库

对于采集程序来说,使用PHP来写的话,其实不算太好的,因为PHP并不支持多线程,对于采集来说,若没有多线程,将会是非常痛苦的一件事

不过可以使用frame等来设置同时几个页面一起采集,这样就能增加速度了,在这里我不讨论怎么多线程,我只说怎么用PHP来进行简单的采集

先确定采集目标:http://cn.jokes.yahoo.com/jok/index.html

这是雅虎的笑话栏目,我就以这个来进行讲解吧

首先分析一下网页,可以知道连接形式为:<img src=”http://cn.yimg.com/i/cn/px_ar.gif” width=5 height=12 border=0 hspace=5><a href=”http://cn.jokes.yahoo.com/07-07-/55/27lot.html” target=_blank><big>头发与智慧</big></a>

使用正则表达式将它表示出来为:/hspace=5><a href=”http://cn.jokes.yahoo.com/(.*).html” target=_blank>/isU

书写PHP代码:

代码
// 采集首页地址
$url = “<a href=\”http://cn.jokes.yahoo.com/jok/index.html\”>http://cn.jokes.yahoo.com/jok/index.html</a>”;
// 获取页面代码
$r = file_get_contents($url);
// 设置匹配正则
$preg = ‘/hspace=5><a href=”http://cn.jokes.yahoo.com/(.*).html” target=_blank>/isU’;
// 进行正则搜索
preg_match_all($preg, $r, $title);

通过上面的代码,$title[1][num]就是连接的地址了,接着分析内容页,得到内容匹配正则为:/<div id=”newscontent”>(.*)</div>/isU

继续写代码:

代码
// 计算标题数量
$count = count($title[1]);
// 通过标题数量进行内容采集
for($i=0;$i<$count;$i++) {
// 设置内容页地址
$jurl = “<a href=\”http://cn.jokes.yahoo.com/\”>http://cn.jokes.yahoo.com/</a>” . $title[1][$i] . “.html”;
// 获取内容页代码
$c = file_get_contents($jurl);
// 设置内容页匹配正则
$p = ‘/<div id=”newscontent”>(.*)</div>/isU’;
// 进行正则匹配搜索
preg_match($p, $c, $content);
// 输出标题
echo $title[1][$i] . ”
“;
// 输出内容
echo $content[$i];
}

这样,一个简单的采集工具就写出来了,其他的功能只需要再进一步的完善就可以了

完整代码:

<?php 
// 采集首页地址 
$url = "<a href=\"http://cn.jokes.yahoo.com/jok/index.html\">http://cn.jokes.yahoo.com/jok/index.html</a>"; 
// 获取页面代码 
$r = file_get_contents($url); 
// 设置匹配正则 
$preg = '/hspace=5><a href="http://cn.jokes.yahoo.com/(.*).html" class=list target=_blank>/isU'; 
// 进行正则搜索 
preg_match_all($preg, $r, $title); 
// 计算标题数量 
$count = count($title[1]); 
// 通过标题数量进行内容采集 
for($i=0;$i<$count;$i++) { 
   // 设置内容页地址 
   $jurl = "<a href=\"http://cn.jokes.yahoo.com/\">http://cn.jokes.yahoo.com/</a>" . $title[1][$i] . ".html"; 
   // 获取内容页代码 
   $c = file_get_contents($jurl); 
   // 设置内容页匹配正则 
   $p = '/<div id="newscontent">(.*)</div>/isU'; 
   // 进行正则匹配搜索 
   preg_match($p, $c, $content); 
   // 输出标题 
   echo $title[1][$i] . "
"; 
   // 输出内容 
   echo $content[$i]; 
} 
?>

 

ucenter创始人密码忘了解决方法

打开uc下面/data/config.inc.php文件

里面有

define(‘UC_FOUNDERPW’, ‘924a2bd32289075d8055e7e30261dfb1’);

define(‘UC_FOUNDERSALT’, ‘116414’);

记下116414这个值,然后

用php输出下面的一个代码

$ucfounderpw= md5(md5($ucfounderpw).$ucsalt);

其中$ucsalt就是116414(这个根据您的需要而定)

$ucfounderpw是您要设置的密码。

得到的$ucfounderpw替换

define(‘UC_FOUNDERPW’, ‘924a2bd32289075d8055e7e30261dfb1’);

这个里面的924a2bd32289075d8055e7e30261dfb1就可以了。

还有另外一种方法,将以下代码保存为PHP,传至UC根目录,运行即可

<?php

define(ROOT_DIR,dirname(__FILE__)."/");

if(!file_exists('./data/config.inc.php') || !is_writeable('./data')){

   $isucdir= 0;

   echo 'UCenter创始人密码重置工具必须放在UCenter根目录下才能正常使用.';

   exit;

}else{

   $isucdir = 1;

}

$info="";

setucadministrator();

function setucadministrator(){

global $isucdir;

global $info;

if($_POST['setucsubmit']){

   if($isucdir){

    $configfile = ROOT_DIR."./data/config.inc.php";

    $uc_password = $_POST["uc_password"];

    $salt = substr(uniqid(rand()), 0, 6);

    if(!$uc_password){

     $info = "密码不能为空";

    }else{

     $md5_uc_password = md5(md5($uc_password).$salt);

     $config = file_get_contents($configfile);

     $config = preg_replace("/define\('UC_FOUNDERSALT',\s*'.*?'\);/i", "define('UC_FOUNDERSALT', '$salt');", $config);

     $config = preg_replace("/define\('UC_FOUNDERPW',\s*'.*?'\);/i", "define('UC_FOUNDERPW', '$md5_uc_password');", $config);

     $fp = @fopen($configfile, 'w');

     @fwrite($fp, $config);

     @fclose($fp);

     $info = "UCenter创始人密码更改成功为:$uc_password";

    }

   }else{

    $info = "本程序文件放置在UCenter跟目录,才能通过程序修改UCenter创始人管理员的密码<br />";

   }

}

templates("setucadministrator");

}

function errorpage($message,$title = '',$isheader = 1,$isfooter = 1){

   $message = "<h4>$title</h4><br><br><table><tr><th>提示信息</th></tr><tr><td>$message</td></tr></table>";

   echo $message;

   exit;

}

function templates($tpl){

switch ($tpl){

   case "header":

    echo '<html>

    <head>

    <meta http-equiv="Content-Type" content="text/html; charset=gb2312">

    <title>UCenter 创始人密码更改工具</title>

    <style type="text/css">

    <!--

    body {font-family: Arial, Helvetica, sans-serif, "宋体";font-size: 12px;color:#000;line-height: 120%;padding:0;margin:0;background:#DDE0FF;overflow-x:hidden;word-break:break-all;white-space:normal;scrollbar-3d-light-color:#606BFF;scrollbar-highlight-color:#E3 EFF9;scrollbar-face-color:#CEE3F4;scrollbar-arrow-color:#509AD8;scrollbar-shadow-color:#F0F1FF;scrollbar-base-color:#CEE3F4;}

    a:hover {color:#60F;}

    ul {padding:2px 0 10px 0;margin:0;}

    textarea,table,td,th,select{border:1px solid #868CFF;border-collapse:collapse;}

    input{margin:10px 0 0px 30px;border-width:1px;border-style:solid;border-color:#FFF #64A7DD #64A7DD #FFF;padding:2px 8px;background:#E3EFF9;}

     input.radio,input.checkbox,input.textinput,input.specialsubmit {margin:0;padding:0;border:0;padding:0;background:none;}

    input.textinput,input.specialsubmit {border:1px solid #AFD2ED;background:#FFF;height:24px;}

    input.textinput {padding:4px 0;}     input.specialsubmit {border-color:#FFF #64A7DD #64A7DD #FFF;background:#E3EFF9;padding:0 5px;}

    option {background:#FFF;}

    select {background:#F0F1FF;}

    #header {height:60px;width:100%;padding:0;margin:0;}

      h2 {font-size:24px;font-weight:bold;position:absolute;top:24px;left:20px;padding:10px;margin:0;}

      h3 {font-size:14px;position:absolute;top:28px;right:20px;padding:10px;margin:0;}

    #content {height:510px;background:#F0F1FF;overflow-x:hidden;z-index:1000;}

      #nav {top:60px;left:0;height:510px;width:180px;border-right:1px solid #DDE0FF;position:absolute;z-index:2000;}

          #nav ul {padding:0 10px;padding-top:30px;}

          #nav li {list-style:none;}

          #nav li a {font-size:14px;line-height:180%;font-weight:400;color:#000;}

          #nav li a:hover {color:#60F;}

      #textcontent {padding-left:200px;height:510px;width:100%;line-height:160%;overflow-y:auto;overflow-x:hidden;}

       h4,h5,h6 {padding:4px;font-size:16px;font-weight:bold;margin-top:20px;margin-bottom:5px;color:#006;}

     h5,h6 {font-size:14px;color:#000;}

     h6 {color:#F00;padding-top:5px;margin-top:0;}

     .specialdiv {width:70%;border:1px dashed #C8CCFF;padding:0 5px;margin-top:20px;background:#F9F9FF;}

     #textcontent ul {margin-left:30px;}

     textarea {width:78%;height:320px;text-align:left;border-color:#AFD2ED;}

     select {border-color:#AFD2ED;}

     table {width:74%;font-size:12px;margin-left:18px;margin-top:10px;}

        table.specialtable,table.specialtable td {border:0;}

      td,th {padding:5px;text-align:left;}

        caption {font-weight:bold;padding:8px 0;color:#3544FF;text-align:left;}

        th {background:#D9DCFF;font-weight:600;}

      td.specialtd {text-align:left;}

     .specialtext {background:#FCFBFF;margin-top:20px;padding:5px 40px;width:64.5%;margin-bottom:10px;color:#006;}

    #footer p {padding:0 5px;text-align:center;}

    -->

    </style>

    </head>

    <body>

    <div id="content">

    <div id="textcontent">';

    break;

   case "footer":

    echo '

      </div></div>

      <div id="footer"><p>UCenter 创始人密码更改工具 &nbsp;

      版权所有 &copy;2001-2007 <a href="http://www.comsenz.com" style="color: #888888; text-decoration: none">

      康盛创想(北京)科技有限公司 Comsenz Inc.</a></font></td></tr><tr style="font-size: 0px; line-height: 0px; spacing: 0px; padding: 0px; background-color: #698CC3">

      </p></div>

      </body>

      </html>';

    exit;

    break;

   case "setucadministrator":

    templates("header");

    if(!empty($_POST['setucsubmit'])){

     echo "<h5>UCenter 创始人密码更改工具</h5><h5> <font color=red>使用完毕后请及时删除本文件,以免给您造成不必要的损失</font></h5>";

     echo '<form action="?action=setadmin" method="post"><input type="hidden" name="action" value="login" />';

     global $info;

     errorpage($info,'',0,0);

     echo '</form>';

    }else{

     echo '<form action="?action=setucadministrator" method="post">

     <h5>UCenter 创始人密码更改工具</h5>

     <h5> <font color=red>使用完毕后请及时删除本文件,以免给您造成不必要的损失</font></h5>

     <table>

     <tr><th width="30%">用户名</th><td width="70%"><input class="textinput" readonly="readonly" disabled type="text" name="username" size="25" maxlength="40" value="UCenter Administrator"></td></tr>

     <tr><th width="30%">请输入密码</th><td width="70%"><input class="textinput" type="text" name="uc_password" size="25"></td></tr>

     </table>

     <input type="submit" name="setucsubmit" value="提 &nbsp; 交">

     </form>';

    }

    templates("footer");

    break;

}

}

?>

 

JS实现div左右自动滚动(可设置滚动高度,速度,停留时间)

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd";>
<html xmlns="http://www.w3.org/1999/xhtml";>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>JS实现div自动滚动</title>
<style>
.ylp-show div{height:20px;}
</style>
</head>
<body>
<div id="show" style="overflow:hidden;height:40px;" class="ylp-show">  
    <div>aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa1</div>
    <div>bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb2</div>
    <div>ccccccccccccccccccccccccccccccccccccccccccccc3</div>
    <div>ddddddddddddddddddddddddddddddddddddddddddddd4</div>
    <div>eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee5</div>
    <div>fffffffffffffffffffffffffffffffffffffffffffff6</div>
    <div>ggggggggggggggggggggggggggggggggggggggggggggg7</div>
</div>  
<script>  
function startmarquee(lh,speed,delay){    
     var t;    
    var oHeight = 210; /**//** div的高度 **/  
    var p=false;  
    var o=document.getElementById("show");    
     var preTop = 0;  
    o.scrollTop = 0;    
    function start(){    
       t=setInterval(scrolling,speed);    
        o.scrollTop += 1;    
    }    
    function scrolling(){    
        if(o.scrollTop%lh!=0 && o.scrollTop%(o.scrollHeight-oHeight-1)!=0){  
            preTop = o.scrollTop;  
           o.scrollTop+=1;  
            if(preTop >= o.scrollHeight || preTop==o.scrollTop){  
                o.scrollTop = 0;  
            }  
        }else{  
           clearInterval(t);    
           setTimeout(start,delay);    
       }  
    }    
    setTimeout(start,delay);    
}    
startmarquee(20,20,1500);    
/**//**startmarquee(一次滚动高度,速度,停留时间);**/    
</script>  
</body>
</html>

 

PHP导入导出Excel方法小结

基本上导出的文件分为两种:
1:类Excel格式,这个其实不是传统意义上的Excel文件,只是因为Excel的兼容能力强,能够正确打开而已。修改这种文件后再保存,通常会提示你是否要转换成Excel文件。
优点:简单。
缺点:难以生成格式,如果用来导入需要自己分别编写相应的程序。
2:Excel格式,与类Excel相对应,这种方法生成的文件更接近于真正的Excel格式。

如果导出中文时出现乱码,可以尝试将字符串转换成gb2312,例如下面就把$yourStr从utf-8转换成了gb2312:
$yourStr = mb_convert_encoding(“gb2312”, “UTF-8”, $yourStr);

下面详细列举几种方法。
一、PHP导出Excel

1:第一推荐无比风骚的PHPExcel,官方网站:http://www.codeplex.com/PHPExcel
导入导出都成,可以导出office2007格式,同时兼容2003。
下载下来的包中有文档和例子,大家可以自行研究。
抄段例子出来:
<?php
/**
* PHPExcel
*
* Copyright (C) 2006 – 2007 PHPExcel
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*
* @category   PHPExcel
* @package    PHPExcel
* @copyright Copyright (c) 2006 – 2007 PHPExcel (http://www.codeplex.com/PHPExcel)
* @license    http://www.gnu.org/licenses/lgpl.txt    LGPL
* @version    1.5.0, 2007-10-23
*/

/** Error reporting */
error_reporting(E_ALL);

/** Include path **/
set_include_path(get_include_path() . PATH_SEPARATOR . ‘../Classes/’);

/** PHPExcel */
include ‘PHPExcel.php’;

/** PHPExcel_Writer_Excel2007 */
include ‘PHPExcel/Writer/Excel2007.php’;

// Create new PHPExcel object
echo date(‘H:i:s’) . ” Create new PHPExcel objectn”;
$objPHPExcel = new PHPExcel();

// Set properties
echo date(‘H:i:s’) . ” Set propertiesn”;
$objPHPExcel->getProperties()->setCreator(“Maarten Balliauw”);
$objPHPExcel->getProperties()->setLastModifiedBy(“Maarten Balliauw”);
$objPHPExcel->getProperties()->setTitle(“Office 2007 XLSX Test Document”);
$objPHPExcel->getProperties()->setSubject(“Office 2007 XLSX Test Document”);
$objPHPExcel->getProperties()->setDescrīption(“Test document for Office 2007 XLSX, generated using php classes.”);
$objPHPExcel->getProperties()->setKeywords(“office 2007 openxml php”);
$objPHPExcel->getProperties()->setCategory(“Test result file”);

// Add some data
echo date(‘H:i:s’) . ” Add some datan”;
$objPHPExcel->setActiveSheetIndex(0);
$objPHPExcel->getActiveSheet()->setCellValue(‘A1’, ‘Hello’);
$objPHPExcel->getActiveSheet()->setCellValue(‘B2’, ‘world!’);
$objPHPExcel->getActiveSheet()->setCellValue(‘C1’, ‘Hello’);
$objPHPExcel->getActiveSheet()->setCellValue(‘D2’, ‘world!’);

// Rename sheet
echo date(‘H:i:s’) . ” Rename sheetn”;
$objPHPExcel->getActiveSheet()->setTitle(‘Simple’);

// Set active sheet index to the first sheet, so Excel opens this as the first sheet
$objPHPExcel->setActiveSheetIndex(0);

// Save Excel 2007 file
echo date(‘H:i:s’) . ” Write to Excel2007 formatn”;
$objWriter = new PHPExcel_Writer_Excel2007($objPHPExcel);
$objWriter->save(str_replace(‘.php’, ‘.xlsx’, __FILE__));

// Echo done
echo date(‘H:i:s’) . ” Done writing file.rn”;

2、使用pear的Spreadsheet_Excel_Writer类
下载地址:http://pear.php.net/package/Spreadsheet_Excel_Writer
此类依赖于OLE,下载地址:http://pear.php.net/package/OLE
需要注意的是导出的Excel文件格式比较老,修改后保存会提示是否转换成更新的格式。
不过可以设定格式,很强大。
<?php
require_once ‘Spreadsheet/Excel/Writer.php’;

// Creating a workbook
$workbook = new Spreadsheet_Excel_Writer();

// sending HTTP headers
$workbook->send(‘test.xls’);

// Creating a worksheet
$worksheet =& $workbook->addWorksheet(‘My first worksheet’);

// The actual data
$worksheet->write(0, 0, ‘Name’);
$worksheet->write(0, 1, ‘Age’);
$worksheet->write(1, 0, ‘John Smith’);
$worksheet->write(1, 1, 30);
$worksheet->write(2, 0, ‘Johann Schmidt’);
$worksheet->write(2, 1, 31);
$worksheet->write(3, 0, ‘Juan Herrera’);
$worksheet->write(3, 1, 32);

// Let’s send the file
$workbook->close();
?>

3:利用smarty,生成符合Excel规范的XML或HTML文件
支持格式,非常完美的导出方案。不过导出来的的本质上还是XML文件,如果用来导入就需要另外处理了。
详细内容请见rardge大侠的帖子:http://bbs.chinaunix.net/viewthread.php?tid=745757

需要注意的是如果导出的表格行数不确定时,最好在模板中把”ss:ExpandedColumnCount=”5″ ss:ExpandedRowCount=”21″”之类的东西删掉。

4、利用pack函数打印出模拟Excel格式的断句符号,这种更接近于Excel标准格式,用office2003修改后保存,还不会弹出提示,推荐用这种方法。
缺点是无格式。
<?php
// Send Header
header(“Pragma: public”);
header(“Expires: 0”);
header(“Cache-Control: must-revalidate, post-check=0, pre-check=0”);
header(“Content-Type: application/force-download”);
header(“Content-Type: application/octet-stream”);
header(“Content-Type: application/download”);;
header(“Content-Disposition: attachment;filename=test.xls “);
header(“Content-Transfer-Encoding: binary “);
// XLS Data Cell

xlsBOF();
xlsWriteLabel(1,0,”My excel line one”);
xlsWriteLabel(2,0,”My excel line two : “);
xlsWriteLabel(2,1,”Hello everybody”);

xlsEOF();

function xlsBOF() {
echo pack(“ssssss”, 0x809, 0x8, 0x0, 0x10, 0x0, 0x0);
return;
}
function xlsEOF() {
echo pack(“ss”, 0x0A, 0x00);
return;
}
function xlsWriteNumber($Row, $Col, $Value) {
echo pack(“sssss”, 0x203, 14, $Row, $Col, 0x0);
echo pack(“d”, $Value);
return;
}
function xlsWriteLabel($Row, $Col, $Value ) {
$L = strlen($Value);
echo pack(“ssssss”, 0x204, 8 + $L, $Row, $Col, 0x0, $L);
echo $Value;
return;
}
?>
不过笔者在64位linux系统中使用时失败了,断句符号全部变成了乱码。

5、使用制表符、换行符的方法
制表符”t”用户分割同一行中的列,换行符”tn”可以开启下一行。
<?php
header(“Content-Type: application/vnd.ms-execl”);
header(“Content-Disposition: attachment; filename=myExcel.xls”);
header(“Pragma: no-cache”);
header(“Expires: 0”);
/*first line*/
echo “hello”.”t”;
echo “world”.”t”;
echo “tn”;

/*start of second line*/
echo “this is second line”.”t”;
echo “Hi,pretty girl”.”t”;
echo “tn”;
?>

6、使用com
如果你的PHP可以开启com模块,就可以用它来导出Excel文件
<?PHP
$filename = “c:/spreadhseet/test.xls”;
$sheet1 = 1;
$sheet2 = “sheet2”;
$excel_app = new COM(“Excel.application”) or Die (“Did not connect”);
print “Application name: {$excel_app->Application->value}n” ;
print “Loaded version: {$excel_app->Application->version}n”;
$Workbook = $excel_app->Workbooks->Open(“$filename”) or Die(“Did not open $filename $Workbook”);
$Worksheet = $Workbook->Worksheets($sheet1);
$Worksheet->activate;
$excel_cell = $Worksheet->Range(“C4”);
$excel_cell->activate;
$excel_result = $excel_cell->value;
print “$excel_resultn”;
$Worksheet = $Workbook->Worksheets($sheet2);
$Worksheet->activate;
$excel_cell = $Worksheet->Range(“C4”);
$excel_cell->activate;
$excel_result = $excel_cell->value;
print “$excel_resultn”;
#To close all instances of excel:
$Workbook->Close;
unset($Worksheet);
unset($Workbook);
$excel_app->Workbooks->Close();
$excel_app->Quit();
unset($excel_app);
?>

7、可以添加图片到 EXcel

Add a drawing to a worksheet
A drawing is always represented as a separate object, which can be added to a worksheet. Therefore, you must first instantiate a new PHPExcel_Worksheet_Drawing, and assign its properties a meaningful value:
$objDrawing = new PHPExcel_Worksheet_Drawing();
$objDrawing->setName(‘Logo’);
$objDrawing->setDescription(‘Logo’);
$objDrawing->setPath(‘./images/officelogo.jpg’);
$objDrawing->setHeight(36);

To add the above drawing to the worksheet, use the following snippet of code. PHPExcel creates the link between the drawing and the worksheet:
$objDrawing->setWorksheet($objPHPExcel->getActiveSheet());

You can set numerous properties on a drawing, here are some examples:
$objDrawing->setName(‘Paid’);
$objDrawing->setDescription(‘Paid’);
$objDrawing->setPath(‘./images/paid.png’);
$objDrawing->setCoordinates(‘B15’);
$objDrawing->setOffsetX(110);
$objDrawing->setRotation(25);
$objDrawing->getShadow()->setVisible(true);
$objDrawing->getShadow()->setDirection(45);