15

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

我已经阅读了很多文件,但最终一团糟。我真的不明白我应该如何开始。我真的需要梨吗?我需要下载任何类库吗?难道没有一种简单的方法可以做到这一点吗?

提前致谢

4

5 回答 5

31

我建议你使用很棒的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 文件、设置视觉样式、创建绘图、表达式等等。

于 2012-07-23T07:39:45.573 回答
5

我写了一份 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 生成警告。

编辑:我应该注意“设置”和“转储”来自以下内容:daniweb.com

于 2014-01-14T21:09:18.153 回答
3

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

对于与 zend 的集成,您可以从以下链接获取帮助。

于 2012-07-23T07:48:13.133 回答
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 并创建不需要的新行。

于 2012-07-23T07:38:16.213 回答
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”。

于 2012-07-23T07:49:04.023 回答