1

我必须创建一个带有 mySQL 表的脚本,并将其导出为 .XLS 格式,然后将该文件保存到 Web 主机上的指定文件夹中。

我让它工作了,但现在我似乎无法让它在不提示用户的情况下自动将文件保存到该位置。

它需要每天在指定的时间运行,因此它可以将前几天的线索保存到虚拟主机上的 .XLS 文件中。

这是代码:

<?php

// DB TABLE Exporter
//
// How to use:
//
// Place this file in a safe place, edit the info just below here
// browse to the file, enjoy!

// CHANGE THIS STUFF FOR WHAT YOU NEED TO DO

     $dbhost  = "-";
     $dbuser  = "-";
     $dbpass  = "-";
     $dbname  = "-";
     $dbtable = "-";

// END CHANGING STUFF

$cdate = date("Y-m-d"); // get current date


// first thing that we are going to do is make some functions for writing out
// and excel file. These functions do some hex writing and to be honest I got 
// them from some where else but hey it works so I am not going to question it 
// just reuse


// This one makes the beginning of the xls file
function xlsBOF() {
    echo pack("ssssss", 0x809, 0x8, 0x0, 0x10, 0x0, 0x0);
    return;
}

// This one makes the end of the xls file
function xlsEOF() {
    echo pack("ss", 0x0A, 0x00);
    return;
}

// this will write text in the cell you specify
function xlsWriteLabel($Row, $Col, $Value ) {
    $L = strlen($Value);
    echo pack("ssssss", 0x204, 8 + $L, $Row, $Col, 0x0, $L);
    echo $Value;
    return;
}



// make the connection an DB query
$dbc = mysql_connect( $dbhost , $dbuser , $dbpass ) or die( mysql_error() );
mysql_select_db( $dbname );
$q = "SELECT * FROM ".$dbtable." WHERE date ='$cdate'";
$qr = mysql_query( $q ) or die( mysql_error() );


// Ok now we are going to send some headers so that this 
// thing that we are going make comes out of browser
// as an xls file.
// 
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");

//this line is important its makes the file name
header("Content-Disposition: attachment;filename=export_".$dbtable.".xls ");

header("Content-Transfer-Encoding: binary ");

// start the file
xlsBOF();

// these will be used for keeping things in order.
$col = 0;
$row = 0;

// This tells us that we are on the first row
$first = true;

while( $qrow = mysql_fetch_assoc( $qr ) )
{
    // Ok we are on the first row
    // lets make some headers of sorts
    if( $first )
    {
        foreach( $qrow as $k => $v )
        {
            // take the key and make label
            // make it uppper case and replace _ with ' '
            xlsWriteLabel( $row, $col, strtoupper( ereg_replace( "_" , " " , $k ) ) );
            $col++;
        }

        // prepare for the first real data row
        $col = 0;
        $row++;
        $first = false;
    }

    // go through the data
    foreach( $qrow as $k => $v )
    {
        // write it out
        xlsWriteLabel( $row, $col, $v );
        $col++;
    }
    // reset col and goto next row
    $col = 0;
    $row++;
}

xlsEOF();
exit();
?>

我尝试使用 fwrite 来完成此操作,但似乎效果不佳,我也删除了标题信息,但没有任何效果。

这是我发现的原始代码,任何帮助将不胜感激。:-)

提前谢谢。:-)

4

3 回答 3

3

首先,由于您通过 cron 将其保存到磁盘,因此您应该删除所有 header() 调用,就像您怀疑的那样。为了尽可能少地重写代码,我建议使用输出缓冲(http://www.php.net/manual/en/ref.outcontrol.php)。为此,请在文件输出开始之前调用 ob_start():

ob_start();
// start the file
xlsBOF();

输出结束后,关闭输出缓冲区,捕获其内容并将它们写入文件:

xlsEOF();
// $filename should be set to some writeable location
file_put_contents($filename, ob_get_clean());
于 2010-03-25T02:00:18.193 回答
3

这是最终的代码,它就像一个魅力。

<?php

    // DB TABLE Exporter
    //
    // How to use:
    //
    // Place this file in a safe place, edit the info just below here
    // browse to the file, enjoy!

    // CHANGE THIS STUFF FOR WHAT YOU NEED TO DO
         $cdate = date("Y-m-d");
         $dbhost  = "-";
         $dbuser  = "-";
         $dbpass  = "-";
         $dbname  = "-";
         $dbtable = "-";
         $filename = "exported_on_$cdate.xls";

    // END CHANGING STUFF


    // first thing that we are going to do is make some functions for writing out
    // and excel file. These functions do some hex writing and to be honest I got 
    // them from some where else but hey it works so I am not going to question it 
    // just reuse


    // This one makes the beginning of the xls file
    function xlsBOF() {
        echo pack("ssssss", 0x809, 0x8, 0x0, 0x10, 0x0, 0x0);
        return;
    }

    // This one makes the end of the xls file
    function xlsEOF() {
        echo pack("ss", 0x0A, 0x00);
        return;
    }

    // this will write text in the cell you specify
    function xlsWriteLabel($Row, $Col, $Value ) {
        $L = strlen($Value);
        echo pack("ssssss", 0x204, 8 + $L, $Row, $Col, 0x0, $L);
        echo $Value;
        return;
    }



    // make the connection an DB query
    $dbc = mysql_connect( $dbhost , $dbuser , $dbpass ) or die( mysql_error() );
    mysql_select_db( $dbname );
    $q = "SELECT * FROM ".$dbtable." WHERE date ='$cdate'";
    $qr = mysql_query( $q ) or die( mysql_error() );

    //start the object
     ob_start();

    // start the file
    xlsBOF();

    // these will be used for keeping things in order.
    $col = 0;
    $row = 0;

    // This tells us that we are on the first row
    $first = true;

    while( $qrow = mysql_fetch_assoc( $qr ) )
    {
        // Ok we are on the first row
        // lets make some headers of sorts
        if( $first )
        {
            foreach( $qrow as $k => $v )
            {
                // take the key and make label
                // make it uppper case and replace _ with ' '
                xlsWriteLabel( $row, $col, strtoupper( ereg_replace( "_" , " " , $k ) ) );
                $col++;
            }

            // prepare for the first real data row
            $col = 0;
            $row++;
            $first = false;
        }

        // go through the data
        foreach( $qrow as $k => $v )
        {

            // write it out
            xlsWriteLabel( $row, $col, $v );
            $col++;
        }

        // reset col and goto next row
        $col = 0;
        $row++;

    }

    xlsEOF();

    //write the contents of the object to a file
    file_put_contents($filename, ob_get_clean());

    ?>

感谢所有帮助家伙!

于 2010-03-25T12:03:05.113 回答
1

是 xls 还是 xsl 文件格式?把我弄糊涂了。

  • 我猜是 XLS :

第一:您是否需要设置字体样式、使用多个选项卡、使用公式?如果是这样,请尝试使用 phpwriteexcel 等 excel 库。

否则,一个简单的 csv 文件就足够了(逗号分隔值,很容易从数组中创建,用 excel 和其他电子表格软件完美读取)。

然后,在不提示的情况下自动保存它:执行计划任务/ cron 任务,调用您的脚本。

于 2010-03-19T14:24:35.987 回答