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

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

ただいまの
回答率

90.48%

  • PHP

    24503questions

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

  • JavaScript

    20928questions

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

  • JSON

    1487questions

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

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

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 1,050

blue_toppy__

score 2

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

前提・実現したいこと

現在、下記を使用しシステムを作成しています。
・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 />
"

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

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+1

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

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

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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/08/27 03:28

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

    本当にありがとうございました!!

    キャンセル

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

  • ただいまの回答率 90.48%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る

  • PHP

    24503questions

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

  • JavaScript

    20928questions

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

  • JSON

    1487questions

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