15

php (mysql データベースから取得したデータ) から Excel にデータをエクスポートする必要があります。Zend フレームワークを使用しています。Excel にエクスポートする前に、データに変更を加える必要があります。実際、私が本当に必要としているのは、毎月の現金出納帳を生成することです。

たくさんのドキュメントを読みましたが、混乱してしまいました。どのように始めればよいのか本当に理解できません。本当に PEAR が必要ですか? クラス ライブラリをダウンロードする必要がありますか?これを行う簡単な方法はありませんか?

前もって感謝します

4

5 に答える 5

31

素晴らしいPHPExcelライブラリを使用することをお勧めします。非常に強力で、さまざまな形式をサポートし、視覚的な書式設定を行うことができ、使いやすいです。

詳細については、次の Web ページを参照してください。 http://phpexcel.codeplex.com/.(PHPExcel既にhttps://github.com/PHPOffice/PHPExcelに移動しています)

2019:

PHPExcelPhpSpreadsheet 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 に答える
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 フォーマットがないため、出力は 1 行のテキストとして表示されます。

出力の最初の行は列見出しになります (この場合、フィールド名が使用されます)。値はタブ \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

このコードには、すぐには明らかにならない弱点が既に存在します。出力するフィールドの 1 つにすでに 1 つまたは複数のタブ文字、またはさらに悪いことに改行が含まれている場合はどうなるでしょうか。段区切りと改行を示すためにこれらの文字に依存しているため、プロセス全体が破棄されます。

解決策は、タブ文字を「エスケープ」することです。この場合、タブをリテラル \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 に答える