将数据从php导出到excel

时间:2012-07-23 07:33:59

标签: php export-to-excel

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

我已阅读了很多文件,但结果却很乱。我真的无法理解我应该如何开始。我真的需要梨吗?我是否需要下载任何类库?这不是一种简单的方法吗?

提前致谢

5 个答案:

答案 0 :(得分:28)

我建议你使用优秀的PHPExcel库。它功能强大,支持多种格式,可以进行视觉格式化,易于使用。

您可以在他们的网页上找到更多相关信息: <删除> http://phpexcel.codeplex.com/ 。 (PHPExcel已移至https://github.com/PHPOffice/PHPExcel

使用示例:

    $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文件,设置视觉风格,创建情节,表达等等。

答案 1 :(得分:4)

我写了一个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'和'dump'来自以下内容:daniweb.com

答案 2 :(得分:3)

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

与zend集成,您可以通过以下link获得帮助。

答案 3 :(得分:2)

您可以使用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并创建不需要的新行。

答案 4 :(得分:2)

有点谷歌你会发现这个: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格式,输出将显示为单行文本。

第一行输出将是列标题(在这种情况下使用字段名称)。值使用制表符\ t和带换行符的行分隔\ n。输出应如下所示:

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

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

解决方案是“转义”制表符。在这种情况下,我们将使用文字\ t替换制表符和使用文字\ n的换行符,以便它们不会影响格式:

<?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”。