質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

1回答

3370閲覧

json-rpc×phpでエクセルデータを出力

blue_toppy__

総合スコア10

JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

0クリップ

投稿2016/08/26 16:54

初投稿になります。
下記の事を実現するのに、色々調査しましたが、どうしても解決できません。ご教授いただければ幸いです。

###前提・実現したいこと
現在、下記を使用しシステムを作成しています。
・Apache
・PHP(サーバ)
・PHPEXCEL(エクセル操作)
・javascript(クライアント)
・json-rpc(通信規格)
・Postgres

クライアントとサーバ通信は「json-rpc」の規格を使用しており、
json形式のやり取りにてデータの取得や表示を行っております。

今回実現したい事は、
画面のあるエクセル出力のボタンを押下すると、
クライアントから「json-rpc」でサーバのメソッドを呼び出し
PHP側でDB接続を行って情報を取得し、その情報をPHPEXCELで
エクセルに書き込みを行って、そのエクセルを画面側でダウンロード
させる
という機能になります。

この時、サーバからクライアントにエクセルデータを渡すやり方がわからず
困っております。
PHPEXCELでエクセルデータを文字列にしてクライアント側に渡して、その文字列で何とかファイルを出力できないかとも考えたのですが、PHEXCELでエクセルデータを文字列にする方法がわからず。。。
PHPEXCELで作成したファイルオブジェクトを渡してもクライアント側では
取得出来ず。
もしくは、PHPEXCELでファイルをどこかのパスに保存して、そのパスをクライアント側に返却し、クライアント側でそのパスからファイルを読み込んでダウンロードさせるという事も出来るのかとも考えましたが、そのやり方も不明で行き詰っております。
似たような構成でシステムを組まれた方、「json-rpc」と「PHP」でエクセル出力したご経験がある方など、どうか、ご協力いただければ幸いです。
宜しくお願いいたします。

###該当のソースコード
jsファイル(抜粋しています)
var jsonURI = XXXX;;

var rpc = new jsonrpcphp(jsonURI, function() {
rpc.DoSearch.excel(httpQuery, function(jsonObj) {

var excel = jsonObj.result['excel']; var fileName = 'export.xlsx'; var blob = new Blob([excel], { type: "Content-Type: application/vnd.ms-excel" }); if (window.navigator.msSaveOrOpenBlob) { //IEの場合 navigator.msSaveBlob(blob, fileName); } else { //IE以外(Chrome, Firefox) var downloadLink = $('<a></a>'); downloadLink.attr('href', window.URL.createObjectURL(blob)); downloadLink.attr('download', fileName); downloadLink.attr('target', '_blank'); $('body').append(downloadLink); downloadLink[0].click(); downloadLink.remove(); } return jsonObj; });

});

PHP側
public function excel($query) {

// DB取得処理は記載していません。

//またライブラリ読み込み処理などもはしょっています。
//エクセルデータをクライアント側に返却することに注力しております
$file = "../template/XXXXX.xlsx";
$excel = PHPExcel_IOFactory::createReader('Excel2007');
$book = $excel->load($file);

//シートを設定する $book->setActiveSheetIndex(0);//一番最初のシートを選択 $sheet = $book->getActiveSheet();//選択シートにアクセスを開始 //セルにデータをセット $sheet->setCellValue('A4' , 'テスト'); //A4セルに「テスト」と書き込む $sheet->setCellValue('B4' , 'テスト2');//B4セルに「テスト2」と書き込む //Excel2007形式で出力する準備 header('Content-Type: application/octet-stream');

// //ダウンロードするファイル名を設定
header('Content-Disposition: attachment;filename="download_test.xlsx"');
$writer=PHPExcel_IOFactory::createWriter($excel,'Excel5');
//出力バッファへの書き込む
//$writer->save('php://output'); ⇒これを行うと、※1のエラーが発生したため、コメントアウト

// 多分上記の出力バッファなどやheaderの設定は、
//「json-rpc」の規格では関係ないかなと思っております。
//あくまで「json」でやり取りを行う規格だと思うので。。。

$response['excel'] = $book; return $response;

}

※1
"<br />
<b>Fatal error</b>: 'break' not in the 'loop' or 'switch' context in <b>PHPExcel\Calculation\Functions.php</b> on line <b>581</b><br />
"

他に必要な情報があれば、ご教授いただければと思います。

宜しくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

サーバー側で、エクセルファイルを base64_encode() し、クライアント側で デコード。

php

1$file = file_get_contents('sample.xlsx'); 2$encode = base64_encode($file); 3header('Content-type:application/json'); 4echo json_encode(['excel' => $encode]);

クライアント側のコードは申し訳ないが、詳しくないので。
JavaScript なら、json でやり取りすれば、楽なんだろうと推測します。

投稿2016/08/26 18:05

編集2016/08/26 18:06
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

blue_toppy__

2016/08/26 18:28

解決いたしました。 base64_encode()をして文字列にして渡せば良かったんですね!! クライアント側でもdecode及びダウンロードが出来ました。 本当にありがとうございました!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問