web-dev-qa-db-ja.com

PHPからExcelへのデータのエクスポート

PHPからデータ(mysqlデータベースから取得したデータ)をExcelにエクスポートする必要があります。 Zend Frameworkを使用しています。 Excelにエクスポートする前に、データを変更する必要があります。実際、私が本当に必要なのは、毎月のキャッシュブックを生成することです。

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

前もって感謝します

14
PHP-Zend

すばらしい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ファイルの読み取り、視覚スタイルの設定、プロット、式の作成など、さらに多くのことができます。

28
Samuel Hapak

MySQLからデータを取得し(テーブルごとに6k +レコード)、複数のテーブルから取得したMySQLデータから多次元配列を作成し、すべてを単一の文字列にダンプして.xlsを生成する94行の在庫変動レポートを作成しました。

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

4
ytilanigiroon

phpexcel ライブラリを使用できます。さまざまなスプレッドシートファイル形式の読み書きが可能

zendとの統合については、 link を参照してください。

3
Vinay

少しのグーグルでこれを見つけたでしょう: 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」に置き換えられます。

2
Peon

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が破損し、不要な新しい行が作成される可能性があります。

2
zessx