表形式のデータをPHPからExcelに転送する簡単な方法。 phpからExcelにデータをエクスポートするPhpエクスポートテーブルをExcelにエクスポートする

.
そのメモに示されている方法は非常に単純ですが、必ずしも便利であるとは限りません。
表形式のデータをPHPからExcelに転送する方法は他にもたくさんありますが、私にとって最もシンプルで機能的であると思われる方法について説明します。 特に、xlsファイルの生成について話しているのではなく、プログラミングの経験がないユーザーが偽造に気付かないように、ユーザーが受信したデータをExcelを使用して開くことを提案しているだけであることに注意してください。

したがって、最初に行うことは、次のヘッダーを生成するスクリプトへのリンクをページに配置することです。
header( "プラグマ:public");
header( "Expires:0");
header( "Cache-Control:must-revalidate、post-check = 0、pre-check = 0");
header( "Cache-Control:private"、false);
header( "Content-Type:application / x-msexcel");
header( "Content-Disposition:attachment; filename = \" "。iconv(" UTF-8 "、" CP1251 "、$ object-> getFileName())。" \ ";");
header( "Content-Transfer-Encoding:binary");
header( "Content-Length:"。$ object-> getFileSize());

$ objectは真空中の球形のオブジェクトであり、各リーダーは好きなように実装します。 getFileName()およびgetFileSize()ゲッターの目的は、名前から明らかです。 ここで、1つの明白でないニュアンスを強調する価値があります(これについて私に思い出させてくれてありがとう)-getFileName()はもちろん任意のファイル名を返すことができますが、ブラウザが受信したコンテンツをExcelで開くことを提供したい場合は、ファイル拡張子xlsである必要があります。
私はまだ何も新しいことを話していません、しかし、これはすべて私の前に発明されました、そして以下に説明されることと同様に。
メモへのコメントで正しく指摘されているように、ExcelはXMLではるかに高速に動作します。 しかし、おそらく最も重要な利点は、まだ速度ではなく、はるかに広い可能性にあります。 私は荒野を掘り下げることはしませんが、簡単な例とへのリンクを与えるだけです 詳細な説明すべてのタグ。

したがって、ヘッダーが生成された後、ユーザーに実際のデータを提供する必要があります。 私は通常、テーブル生成を別の方法でラップします。
echo $ object-> getContent();

そして、Smartyを使用してテーブルを生成します。

(foreach from = $ data.header item = caption) ($ caption.columnName)(/ foreach)(foreach from = $ data.content item = row) (foreach from = $ row item = col) ($ col)(/ foreach)(/ foreach)

コードからわかるように、2つの配列(テーブルヘッダー行と実際のデータ)を含む$data配列がテンプレートに渡されます。
テンプレートエンジンを使用してXMLを生成するだけでも多少コストがかかることは注目に値します。また、XMLを取得する方法は他にもたくさんあります。 私の特定のケースでは、テンプレートエンジンが不可欠な大規模なプロジェクトでは、XML生成はほんの小さなボーナスです。

例として、最も単純なテーブルを示しました。必要に応じて、はるかに多くの属性を操作できます。 これは、実装にサードパーティのライブラリが必要ないことを考えると特に便利です。
説明されている方法は、同じプロジェクトで数年間機能しており、開いたデータがMSOfficeドキュメントではないと疑っているユーザーはまだ1人もいません。

MS Excelで使用されるXML構造の詳細については、次のURLを参照してください。

(mysqlデータベースから取得したデータ)成功します。 ZendFrameworkを使用しています。 Excelにエクスポートする前に、データにいくつかの変更を加える必要があります。 実際、私は本当に毎月の現金帳を作成する必要があります。

私はたくさんの文書を読みましたが、混乱してしまいました。 どうやって始めたらいいのかよくわかりません。 本当にPEARが必要ですか? クラスライブラリをロードする必要がありますか? そうじゃない? 簡単な方法これをする?

前もって感謝します

PHPExcelライブラリPHPExcelを使用することをお勧めします。 それは本当に強力で、さまざまなフォーマットをサポートし、視覚的なフォーマットを行うことができ、使いやすいです。

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

使用例:

$ objPHPExcel = new PHPExcel(); /**多くのプロパティを設定できます*/$ objPHPExcel-> getProperties()-> setCreator( "My company")-> setLastModifiedBy( "John Doe")-> setTitle( "Annual report")-> setSubject( "Sales ")-> setDescription(" JohnDoeによる年次売上レポート")-> setCategory(" Finance "); /**シートの1つを選択します*/$ activeSheet = $ objPHPExcel-> setActiveSheetIndex(0); /**セルの値を設定するだけです*/$ activeSheet-> setCellValue( "A1"、 "plural");

もちろん、Excelファイルの読み取り、視覚スタイルの設定、グラフ、式の作成など、さらに多くのことができます。

MySQLからデータ(6kb +テーブルあたりのレコード)を取得して作成する94行の在庫変動レポートを作成しました 多次元配列 MySQLデータから、複数のテーブルから取得し、すべてを1行にダンプして、次のような.xlsを生成しました。

拡張機能は必要ありません。

唯一の注意点は、Excelなしで.xlsを吐き出す方法をまだ理解しておらず、データが破損している可能性があることです。また、データの「エクスポート」よりも複雑なフォーマットや何かを試したことはありません。 、file / dataはもちろん大丈夫ですが、Excelから警告が生成されます。

編集:「セットアップ」と「ダンプ」はdaniweb.comを参照していることに注意してください。

phpexcelライブラリを使用できます。 これにより、書き込みと読み取りが可能になります さまざまな形式スプレッドシートファイル

zendと統合するには、次のリンクのヘルプを使用できます。

CSVを使用して、Excel用のインポート可能な形式を作成できます。 これが最も簡単な方法です。

CSVは次のようになります。

「私の最初のセルの内容」、「私の2番目のセルの内容」、「私の3番目のセルの内容」「2行目、最初のセルの内容」、「etc」、「etc

各行はExcelの行を表し、セルの内容を間に配置します 二重引用符カンマで区切ります。 データの一部がある場合は注意してください。これにより、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も使用できますが、少し複雑です)。 このために、次のコードを使用します。

結果をブラウザでより簡単に表示できるように、コンテンツタイプをtext/plainに設定しました。 それ以外の場合、HTML形式がないため、出力は1行のテキストとして表示されます。

出力の最初の行は列見出しになります(この場合、フィールド名が使用されます)。 値はタブ\tと改行のある行\nで区切られます。 結果は次のようになります。

ファーストネームラストネーム年齢メアリージョンソン25アマンダミラー18ジェームスブラウン31パトリシアウィリアムズ7マイケルデイビス43サラミラー24パトリックミラー27

このコードには弱点があり、すぐには明らかにならない場合があります。 出力されるフィールドの1つにすでに1つ以上のタブ文字が含まれている場合、またはさらに悪い場合はどうなりますか? 改行? 列と改行を示すためにこれらの文字に依存しているため、これによりプロセス全体がトリガーされます。

解決策は、タブ文字を「エスケープ」することです。 この場合、タブをリテラル\ tに置き換え、改行をリテラル\ nに置き換えて、フォーマットに影響を与えないようにします。

これで、各行がエコーされる前に、列が壊れないように、タブ文字が「\t」に置き換えられます。 また、データ内の改行はすべて「\n」に置き換えられます。

.
そのメモに示されている方法は非常に単純ですが、必ずしも便利であるとは限りません。
表形式のデータをPHPからExcelに転送する方法は他にもたくさんありますが、私にとって最もシンプルで機能的であると思われる方法について説明します。 特に、xlsファイルの生成について話しているのではなく、プログラミングの経験がないユーザーが偽造に気付かないように、ユーザーが受信したデータをExcelを使用して開くことを提案しているだけであることに注意してください。

したがって、最初に行うことは、次のヘッダーを生成するスクリプトへのリンクをページに配置することです。
header( "プラグマ:public");
header( "Expires:0");
header( "Cache-Control:must-revalidate、post-check = 0、pre-check = 0");
header( "Cache-Control:private"、false);
header( "Content-Type:application / x-msexcel");
header( "Content-Disposition:attachment; filename = \" "。iconv(" UTF-8 "、" CP1251 "、$ object-> getFileName())。" \ ";");
header( "Content-Transfer-Encoding:binary");
header( "Content-Length:"。$ object-> getFileSize());

$ objectは真空中の球形のオブジェクトであり、各リーダーは好きなように実装します。 getFileName()およびgetFileSize()ゲッターの目的は、名前から明らかです。 ここで、1つの明白でないニュアンスを強調する価値があります(これについて私に思い出させてくれたsavostinに感謝します)-getFileName()はもちろん任意のファイル名を返すことができますが、ブラウザが受信したコンテンツをExcelで開くことを提供したい場合は、ファイル拡張子はxlsである必要があります。
私はまだ何も新しいことを話していません、しかし、これはすべて私の前に発明されました、そして以下に説明されることと同様に。
PHPでのxlsの生成に関する投稿へのコメントで正しく指摘されているように、ExcelはXMLを使用するとはるかに高速になります。 しかし、おそらく最も重要な利点は、まだ速度ではなく、はるかに広い可能性にあります。 荒野を掘り下げることはしませんが、簡単な例と、すべてのタグの詳細な説明へのリンクのみを示します。

したがって、ヘッダーが生成された後、ユーザーに実際のデータを提供する必要があります。 私は通常、テーブル生成を別の方法でラップします。
echo $ object-> getContent();

そして、Smartyを使用してテーブルを生成します。

(foreach from = $ data.header item = caption) ($ caption.columnName)(/ foreach)(foreach from = $ data.content item = row) (foreach from = $ row item = col) ($ col)(/ foreach)(/ foreach)

コードからわかるように、2つの配列(テーブルヘッダー行と実際のデータ)を含む$data配列がテンプレートに渡されます。
テンプレートエンジンを使用してXMLを生成するだけでも多少コストがかかることは注目に値します。また、XMLを取得する方法は他にもたくさんあります。 私の特定のケースでは、テンプレートエンジンが不可欠な大規模なプロジェクトでは、XML生成はほんの小さなボーナスです。

例として、最も単純なテーブルを示しました。必要に応じて、はるかに多くの属性を操作できます。 これは、実装にサードパーティのライブラリが必要ないことを考えると特に便利です。
説明されている方法は、同じプロジェクトで数年間機能しており、開いたデータがMSOfficeドキュメントではないと疑っているユーザーはまだ1人もいません。

MS Excelで使用されるXML構造の詳細については、次のURLを参照してください。

多くの人にとって、 PHPとMySQLの組み合わせデータベースからxls形式にデータをエクスポートして、このデータを必要とする人がExcelで処理したり、ユーザーがこのデータを表示しやすくしたりする必要があります。 最近そのようなニーズがありましたが、今日はこのビジネスをどのように実施できるかをお話します。

この方法は非常に簡単ですが、データは正常にアップロードされます。

まず、最終的なxlsファイルの例を示します。Excelでは、アップロードは次のようになります。

つまり、画像やスタイルはアップロードされず、列ヘッダーとデータ自体のみがアップロードされます。

そのようなアップロードオプションにたどり着く前に、csv形式でアップロードしようとしましたが、少し不器用でした。次に、テーブルを描画してxls拡張子を付けて保存しようとしました。これも、ある種のナンセンスであることがわかりました。これから説明する方法は私に完全に適合しており、それをあなたと共有します。

まず、コメントしたすべてのコードを可能な限り提供します。選択して保存できます。 php拡張子そして、データベース接続設定を設定することを忘れないでください。

PHPでMySQLからExcelにデータをエクスポートする

そして、私がアンロードするデータを理解できるように、データベース内の単純なテーブルの例を示します( 私は彼女の名前をテストします):

テストテーブル:

id ファーストネーム 名前
1 イワノフ イワン
2 ペトロフ ピーター
2 ペトロフ2 Petr2
xlsData = pack( "ssssss"、0x809、0x08、0x00,0x10、0x0、0x0); )//数値関数RecNumber($ row、$ col、$ value)($ this->xlsData。=pack( "sssss"、0x0203、14、$ row、$ col、0x00); $this->xlsDataの場合。 = pack( "d"、$ value); return;)//テキスト関数RecText($ row、$ col、$ value)($ len = strlen($ value); $ this->xlsData。=pack( " s * "、0x0204、8 + $ len、$ row、$ col、0x00、$ len); $this->xlsData。=$value; return;)//数値関数InsertNumber($ value)(if($ this-> countCol == $ this-> totalCol)($ this-> countCol = 0; $ this-> countRow ++;)$ this-> RecNumber($ this-> countRow、$ this-> countCol、$ value); $ this-> countCol ++; return;)//テキスト関数InsertText($ value)(if($ this-> countCol == $ this-> totalCol)($ this-> countCol = 0; $ this-> countRow ++; )$ this-> RecText($ this-> countRow、$ this-> countCol、$ value); $ this-> countCol ++; return;)//新しい行関数に移動GoNewLine()($ this-> countCol = 0; $ this-> countRow ++; return;)//データ関数EndData()($ this->xlsData。=pack( "ss"、0x0A、 0x00); 戻る; )//ファイル関数を保存しますSaveFile($ fileName)($ this-> fileName = $ fileName; $ this-> SendFile();)//ファイル関数を送信しますSendFile()($ this-> EndData(); header ("Last-Modified:" .gmdate( "D、d M YH:i:s")。 "GMT"); header( "Cache-Control:no-store、no-cache、must-revalidate");ヘッダー("Pragma:no-cache"); header( "Content-type:application / x-msexcel"); header( "Content-Disposition:attachment; fileName = $ this-> fileName.xls"); print $ this- > xlsData;)))if(isset($ _ GET ["id"]))(//フィルターデータ$ id = mysql_real_escape_string(stripslashes(trim(htmlspecialchars($ _ GET ["id"]、ENT_QUOTES)))); $ filename="File_with_id_"。$id;//ファイル名を設定$excel= new ExportToExcel();//クラスのインスタンスを作成$sql = "SELECT * FROM test.test where id = $ id"; //データベースへのクエリ$rez= mysql_query($ sql); $ excel-> InsertText( "ID"); $ excel-> InsertText( "Last Name"); $ excel-> InsertText( "First Name"); $ excel -> GoNewLine(); While($ row = mysql_fetch_assoc($ rez))($ excel-> InsertNumber($ r ow ["id"]); $ excel-> InsertText($ row ["firstname"]); $ excel-> InsertText($ row ["name"]); $ excel-> GoNewLine(); )$ excel-> SaveFile($ filename); )?>

ここでの全体的なアイデアは関数にあります パック()、データをバイナリ文字列にパックし、次に、データベースからアンロードしたデータをこの文字列に順番に入力します mysql通常の機能を使用する mysql_query().

このコードのパフォーマンスを確認するために、データベースへの接続を設定し、同様のテーブルを作成した場合、次のリクエストを送信できます。

Http:// your_site/file_name。 php?id = 2

また、idが2の2つの行をアンロードする必要があります。

そして今、あなたがデータをアップロードすることを許可する誰もがそれを彼らのローカルコンピュータに簡単にエクスポートすることができます Webインターフェイス。 この方法は、企業ユーザー、組織向けのアプリケーションを開発している場合、およびインターネット上のWebサイトのユーザーの両方にとって便利です。 望む、 この方法あなたを助けました。 幸運を!