将数据从php导出到excel


Exporting data from php to excel

我需要将php中的数据(从mysql数据库中检索的数据)导出到excel。我使用的是Zend Framework。在导出到excel之前,我需要对我的数据进行一些更改。事实上,我真正需要的是每月生成一本现金簿。

我读了很多文件,但最后却一塌糊涂。我真的不明白该怎么开始。我真的需要PEAR吗?我需要下载任何类库吗?难道没有一个简单的方法吗?

提前感谢

我建议您使用很棒的PHPExcel库。它真的很强大,支持各种格式,可以进行可视化格式化,而且很容易使用。

你可以在他们的网页上找到更多关于它的信息:

http://phpexcel.codeplex.com/ PHPExcel已移动到https://github.com/PHPOffice/PHPExcel)

2019年:

PHPExcel现已被PhpSpreadsheet GitHub取代.

用法示例:

    $objPHPExcel = new PHPExcel();
    /** You can set many properties */
    $objPHPExcel->getProperties()->setCreator("My company")
                 ->setLastModifiedBy("John Doe")
                 ->setTitle("Annual report")
                 ->setSubject("Sales")
                 ->setDescription("Annual sales report by John Doe")
                 ->setCategory("Finance");
    /** Choose one of sheets */
    $activeSheet = $objPHPExcel->setActiveSheetIndex(0);
    /** Simply set value of cell */
    $activeSheet->setCellValue("A1", 'plural');

当然,你可以做更多的事情,阅读excel文件,设置视觉样式,创建绘图、表达式等等。

我写了一份94行的库存差异报告,其中我从MySQL中获取数据(每个表有6k多条记录),从多个表中提取的MySQL数据创建一个多维数组,然后将所有数据转储到一个字符串中,并生成一个.xls:

<?php
////////////////////////////////// BEGIN SETUP
    $filename ="document_name.xls";
    header('Content-type: application/ms-excel');
    header('Content-Disposition: attachment; filename='.$filename);
////////////////////////////////// END SETUP
////////////////////////////////// BEGIN GATHER
    // Your MySQL queries, fopens, et cetera go here.
    // Cells are delimited by 't
    // 'n is just like you might expect; new line/row below
    // E.G:
    $stuff="PART'tQTY'tVALUE't'n";
    $stuff=$stuff."01-001-0001't37't28.76't'n";
    $stuff=$stuff."01-001-0002't6't347.06't'n";
    $stuff=$stuff."01-001-0003't12't7.11't'n";
////////////////////////////////// END GATHER
// The point is to get all of your data into one string and then:
////////////////////////////////// BEGIN DUMP
    echo $stuff;
////////////////////////////////// END DUMP
?>

无需扩展。

唯一需要注意的是,我还没有弄清楚如何在Excel不告诉我数据可能已损坏的情况下吐出.xls,我也没有尝试过任何格式化或比简单地"导出"数据更复杂的操作。文件/数据当然很好,但它确实会从Excel中生成警告。

编辑:我应该注意,"setup"answers"dump"来自以下内容:daniweb.com

您可以使用phpexcel库。它允许您写入和读取不同的电子表格文件格式

若要和zend集成,您可以从以下链接获得帮助。

您可以使用CSV为excel创建可导入的格式。这是最简单的方法。

CSV看起来像这样:

"my first cellcontent", "my second cell content", "my third cell content"
"second line, first cell content", "etc", "etc

每一行代表一个Excel行,您可以将单元格内容放在双引号之间,并用逗号分隔。小心'r'n如果你的数据中有一些,它可能会破坏你的CSV并创建不需要的新行。

如果有一点谷歌,你会发现:http://www.the-art-of-web.com/php/dataexport/

准备数据

$data = array(
    array( "firstname" => "Mary", "lastname" => "Johnson", "age" => 25 ),
    array( "firstname" => "Amanda", "lastname" => "Miller", "age" => 18 ),
    array( "firstname" => "James", "lastname" => "Brown", "age" => 31 ),
    array( "firstname" => "Patricia", "lastname" => "Williams", "age" => 7 ),
    array( "firstname" => "Michael", "lastname" => "Davis", "age" => 43 ),
    array( "firstname" => "Sarah", "lastname" => "Miller", "age" => 24 ),
    array( "firstname" => "Patrick", "lastname" => "Miller", "age" => 27 )
);

第一步是以制表符分隔的格式输出数据(也可以使用CSV,但稍微复杂一些)。为了实现这一点,我们使用以下代码:

<?php
    header("Content-Type: text/plain");
    $flag = false;
    foreach( $data as $row ) {
        if( !$flag ) {
        // display field/column names as first row
        echo implode( "'t", array_keys( $row ) ) . "'r'n";
        $flag = true;
    }
    echo implode( "'t", array_values( $row ) ) . "'r'n";
}
exit;
?>

我们将内容类型设置为text/plain,以便在浏览器中更容易地查看输出。否则,由于没有HTML格式,输出将显示为单行文本。

输出的第一行将是列标题(在本例中使用字段名)。值用制表符分隔,行用换行符分隔。输出应该如下所示:

firstname  lastname  age
Mary Johnson 25 
Amanda Miller 18 
James Brown 31 
Patricia    Williams     7 
Michael Davis 43 
Sarah Miller 24 
Patrick Miller 27

这段代码中已经存在一个弱点,可能不会立即显现出来。如果要输出的字段之一已经包含一个或多个制表符,或者更糟的是,包含换行符,该怎么办?这将抛出整个过程,因为我们依赖这些字符来指示分栏符和换行符。

解决方案是"转义"制表符。在这种情况下,我们将用文字替换制表符,用文字替换换行符,这样它们就不会影响格式:

<?php
    function cleanData( &$str ) {
        $str = preg_replace( "/'t/", "''t", $str );
        $str = preg_replace("/'r?'n/", "''n", $str);
    }
    header("Content-Type: text/plain");
    $flag = false;
    foreach( $data as $row ) {
        if( !$flag ) {
            // display field/column names as first row
            echo implode( "'t", array_keys( $row ) ) . "'r'n";
            $flag = true;
        }
        array_walk( $row, 'cleanData' );
        echo implode( "'t", array_values( $row ) ) . "'r'n";
    }
    exit;
?>

现在,在每一行被呼应之前,任何制表符都被替换为"''t",这样我们的列就不会被分解。此外,数据中的任何换行符都将替换为"''n"。