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

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

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

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

JavaScript

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

Q&A

解決済

2回答

8104閲覧

Excelファイルをphpで取り込みCSVで出力する

shinoda

総合スコア75

PHP

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

JavaScript

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

0グッド

2クリップ

投稿2015/08/24 05:44

編集2015/08/24 05:53

お世話になります。

タイトル通りにExcelファイルをphpで取り込みCSVで出力したいのですが、まずはやりたいことを記載します。

1)phpでExcelファイルをドラッグ&ドロップなどで読み込み、配列に格納してから、CSVで出力する。

2)CSVファイルをJavaScriptで読み込み、配列の中から条件にあったものをweb上に表示する

現在作成中のコードを記載します


<?php // ファイル名の指定 $readFile = "sample.xlsx"; // 連想配列でデータ受け取り $data = null; $data = readXlsx($readFile); // 出力確認 /*print '<pre>'; var_dump($data); print '</pre>';*/ // ファイル名渡したら配列返すラッパー関数 function readXlsx($readFile) { // ライブラリファイルの読み込み (パス指定し直す) require_once dirname(__FILE__) . './../Classes/PHPExcel/IOFactory.php'; // ファイルの存在チェック if (!file_exists($readFile)) { exit($readFile. "が見つかりません。" . EOL); } // xlsxをPHPExcelに食わせる $objPExcel = PHPExcel_IOFactory::load($readFile); // 配列形式で返す return $objPExcel->getActiveSheet()->toArray(null,true,true,true); } -------------------------------------------- 上記のようにExcelファイルをphpで配列に格納する部分はできているのですが、ここにドラッグ&ドロップで渡されたExcelファイルを配列に格納し、CSVで出力するにはどうしたら良いのでしょうか? ドラッグ&ドロップでファイルをアップロードする機能は調べたところいろいろあるのはわかったのですが、どうしてもこの中に組み込むのができなくて困っています。 ご教授いただければ幸いです。 以上、宜しくお願い致します。 【追記】 ドラッグ&ドロップする機能の部分を記載します。 長くなりますがご了承ください。 簡単に言ってしまうとこの2つを上手く融合したいのですが、うまくいかないということです。 -------------------------------------- <!DOCTYPE html> <html> <head> <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.10.1/jquery.min.js"></script> <style> #dragandrophandler { border:2px dotted #0B85A1; width:500px; height:300px; color:#92AAB0; text-align:center; vertical-align:middle; padding:10px 10px 10 10px; margin: 0 auto; font-size:200%; } .progressBar { width: 200px; height: 22px; border: 1px solid #ddd; border-radius: 5px; overflow: hidden; display:inline-block; margin:0px 10px 5px 5px; vertical-align:top; } .progressBar div { height: 100%; color: #fff; text-align: right; line-height: 22px; /* same as #progressBar height if we want text middle aligned */ width: 0; background-color: #0ba1b5; border-radius: 3px; } .statusbar { border-top:1px solid #A9CCD1; min-height:25px; width:700px; padding:10px 10px 0px 10px; vertical-align:top; } .statusbar:nth-child(odd){ background:#EBEFF0; } .filename { display:inline-block; vertical-align:top; width:250px; } .filesize { display:inline-block; vertical-align:top; color:#30693D; width:100px; margin-left:10px; margin-right:5px; } .abort{ background-color:#A8352F; -moz-border-radius:4px; -webkit-border-radius:4px; border-radius:4px;display:inline-block; color:#fff; font-family:arial;font-size:13px;font-weight:normal; padding:4px 15px; cursor:pointer; vertical-align:top } </style> </head> <body> <div id="dragandrophandler">ここにドロップしてください。</div> <br><br> <div id="status1"></div> <script> function sendFileToServer(formData,status) { var uploadURL ="http://hayageek.com/examples/jquery/drag-drop-file-upload/upload.php"; //Upload URL var extraData ={}; //Extra Data. var jqXHR=$.ajax({ xhr: function() { var xhrobj = $.ajaxSettings.xhr(); if (xhrobj.upload) { xhrobj.upload.addEventListener('progress', function(event) { var percent = 0; var position = event.loaded || event.position; var total = event.total; if (event.lengthComputable) { percent = Math.ceil(position / total * 100); } //Set progress status.setProgress(percent); }, false); } return xhrobj; }, url: uploadURL, type: "POST", contentType:false, processData: false, cache: false, data: formData, success: function(data){ status.setProgress(100); $("#status1").append("File upload Done<br>"); } }); status.setAbort(jqXHR); } var rowCount=0; function createStatusbar(obj) { rowCount++; var row="odd"; if(rowCount %2 ==0) row ="even"; this.statusbar = $("<div class='statusbar "+row+"'></div>"); this.filename = $("<div class='filename'></div>").appendTo(this.statusbar); this.size = $("<div class='filesize'></div>").appendTo(this.statusbar); this.progressBar = $("<div class='progressBar'><div></div></div>").appendTo(this.statusbar); this.abort = $("<div class='abort'>中断</div>").appendTo(this.statusbar); obj.after(this.statusbar); this.setFileNameSize = function(name,size) { var sizeStr=""; var sizeKB = size/1024; if(parseInt(sizeKB) > 1024) { var sizeMB = sizeKB/1024; sizeStr = sizeMB.toFixed(2)+" MB"; } else { sizeStr = sizeKB.toFixed(2)+" KB"; } this.filename.html(name); this.size.html(sizeStr); } this.setProgress = function(progress) { var progressBarWidth =progress*this.progressBar.width()/ 100; this.progressBar.find('div').animate({ width: progressBarWidth }, 10).html(progress + "% "); if(parseInt(progress) >= 100) { this.abort.hide(); } } this.setAbort = function(jqxhr) { var sb = this.statusbar; this.abort.click(function() { jqxhr.abort(); sb.hide(); }); } } function handleFileUpload(files,obj) { for (var i = 0; i < files.length; i++) { var fd = new FormData(); fd.append('file', files[i]); var status = new createStatusbar(obj); //Using this we can set progress. status.setFileNameSize(files[i].name,files[i].size); sendFileToServer(fd,status); } } $(document).ready(function() { var obj = $("#dragandrophandler"); obj.on('dragenter', function (e) { e.stopPropagation(); e.preventDefault(); $(this).css('border', '2px solid #0B85A1'); }); obj.on('dragover', function (e) { e.stopPropagation(); e.preventDefault(); }); obj.on('drop', function (e) { $(this).css('border', '2px dotted #0B85A1'); e.preventDefault(); var files = e.originalEvent.dataTransfer.files; //We need to send dropped files to Server handleFileUpload(files,obj); }); $(document).on('dragenter', function (e) { e.stopPropagation(); e.preventDefault(); }); $(document).on('dragover', function (e) { e.stopPropagation(); e.preventDefault(); obj.css('border', '2px dotted #0B85A1'); }); $(document).on('drop', function (e) { e.stopPropagation(); e.preventDefault(); }); }); </script> </body> </html> ------------------------------------------------

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

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

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

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

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

guest

回答2

0

ベストアンサー

php

1<?php 2 3// ファイル名の指定 4$readFile = "sample.xlsx"; 5 6// 連想配列でデータ受け取り 7$data = readXlsx($readFile); 8 9// 出力確認 10/*print '<pre>'; 11var_dump($data); 12print '</pre>';*/ 13 14// ファイル名渡したら配列返すラッパー関数 15function readXlsx($readFile) 16{ 17// ライブラリファイルの読み込み (パス指定し直す) 18require_once dirname(__FILE__) . './../Classes/PHPExcel/IOFactory.php'; 19 20// ファイルの存在チェック 21if (!file_exists($readFile)) { 22exit($readFile. "が見つかりません。" . EOL); 23} 24 25// xlsxをPHPExcelに食わせる 26$objPExcel = PHPExcel_IOFactory::load($readFile); 27 28// 配列形式で返す →返さない 29$objPExcel->getActiveSheet()->toArray(null,true,true,true); 30 31$writer = PHPExcel_IOFactory::createWriter($objPExcel, 'csv'); 32$writer->save('fput.csv'); 33} 34

投稿2015/08/25 03:26

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

shinoda

2015/08/26 09:52

返信遅くなり申し訳ありません。 仰るとおりにしたらCSVで出力が出来ました。 ありがとうございます。 また作成していたドラッグ&ドロップでエクセルファイルをこのPHPに投げ、CSVに出力までうまく実装できました。 本当に有難うございます。
退会済みユーザー

退会済みユーザー

2015/08/26 10:04

すべてドキュメントに書いてあることですので、ドキュメントを読むことを面倒がらずに習慣化しましょう。教えてもらったコードを理解もなく動いた、ラッキー!ではメンテナンスできませんから…。 一朝一夕ではできないことですが、頑張って下さい。 余談ですが… エクセルではないファイルがドラッグされたら…をちゃんと想定してますか?
shinoda

2015/08/26 11:45

仰るとおりです。 少し学校で勉強した程度で業務で行うことも殆ど無いため人のソースをみて理解するところから始めている次第です。 懸念されているExcel以外のファイルがドラッグ&ドロップされたらについてですが、エラーを吐くようにはしていますが最適の方法かと言われれば自信がありません... 別件ですが、CSVに出力ではなくJSONにする場合においては、PHPで配列にして、JSONでエンコードすればよいのですか?
退会済みユーザー

退会済みユーザー

2015/08/26 11:49

> 懸念されているExcel以外のファイルがドラッグ&ドロップされたらについてですが、エラーを吐くようにはしていますが最適の方法かと言われれば自信がありません... 実装方法によりますね。拡張子だけで判断しているようなコードではダメですし。 > JSONにする場合 json_encode(array, true) で。
shinoda

2015/08/27 05:33

お世話になっております。 header("Content-Type-: application/json; charset=UTF-8"); // IEがヘッダーを無視しないように header("X-Content-Type-Options: nosniff"); file_put_contents('array.json', json_encode($data,JSON_UNESCAPED_UNICODE, JSON_HEX_TAG | JSON_HEX_APOS | JSON_HEX_QUOT | JSON_HEX_AMP )); JSONファイルに出力も出来ました。 配列をjavascriptで読むので、CSVよりJSONのほうが良いのかな?と思い2つのパターンで試してみます。 差し支えなければ、勉強法などお聞きしてもよろしいでしょうか? 私がしていることは、ドットインストールのようなeラーニングを使ったり、本を読む程度なのですが、なかなか実務で使うことが無いため身につかないという問題があり、かつ社内にエンジニアもいないためわからないことを聞ける環境もないため苦労しています。 宜しくお願い致します。
退会済みユーザー

退会済みユーザー

2015/08/27 05:56 編集

勉強法ですか… 勉強という意識はあまりないのですが、とにかくコードを書きまくっているということと、そこで得た知識は、ブログやQiita( http://qiita.com/ )などでアウトプットするようにしています。自分のコードを他人に見せることで、各所からありがたいツッコミ(笑)をいただけるので、そこから新たなノウハウを得られることが多いです。 とはいえ、やはり自分でサービスを作り、運用して利用してもらうことが一番の勉強になりますね。1年、2年と時間が経てば、「この記述書き直したいな…」とか「こうしておけばよかったなー」とか思うことも多く、まして運用中のサイトを修正するということが難しくなってきます。そのような失敗を繰り返して、「次はこうしよう!」と自作のフレームワークを強化していってます。 > かつ社内にエンジニアもいないため 同じ境遇ですね(笑)。もともと経験もなく(趣味でVBはやったことがあるくらい) 思いついたアイディアを社内プレゼンのためにサービスをサンプルのつもりで作ったのがきっかけでした。サンプルが本稼動させられたのはさすがに焦ったけど… なんとかなります(笑)
shinoda

2015/08/27 10:12

なるほど、同じような境遇の方でも、これほどに知識に差があるということは単純に私の努力不足だということを痛感しました。 やはり仕事で作ることもないためなかなか落とし込みもできず、結局ローカルでお遊び程度にしかやる機会が無いためなかなか伸びないです。 Kosuke_Shibuya様のように本番稼働に耐えうるものは現状作れません。 見た目だけならともかく、やはりセキュリティなどのディフェンスは実務でやらないことにはハードルが高いかと思います。 ただし、似たような境遇にご指摘いただいて、良い刺激になりました。 ありがとうございます。
退会済みユーザー

退会済みユーザー

2015/08/27 10:20

かなり長いことやってますから…PHPに触ってからもうかれこれ8年くらい?
shinoda

2015/08/27 12:13

そうでしたか。 比べることが失礼なことでした。 私はPHPを学校で三ヶ月ほどやり、基本の構文とMySQLを軽く触った程度でして、今の会社ではプログラムを書くことがほぼない状況なので、忘れていく一方です。 基本プログラム書くのは好きなのでこれからも少しづつスキルアップしたいと思います。
guest

0

PHPExcel オブジェクトに読み込みできているのだったら、

http://qiita.com/hodade/items/13aa1df16bb5f4c2702a

php

1$writer = PHPExcel_IOFactory::createWriter($book, 'csv'); 2$writer->save('filename.csv');

出力するだけ

投稿2015/08/24 06:20

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

shinoda

2015/08/24 07:10

早速のご回答有難うございます。 試してみたのですが、以下の様なエラーが出ました。 Notice: Undefined variable: book in C:\xampp\htdocs\tita\test.php on line 33 Catchable fatal error: Argument 1 passed to PHPExcel_IOFactory::createWriter() must be an instance of PHPExcel, null given, called in C:\xampp\htdocs\tita\test.php on line 33 and defined in C:\xampp\htdocs\Classes\PHPExcel\IOFactory.php on line 132 どういった意味でしょうか? 宜しくお願い致します。
退会済みユーザー

退会済みユーザー

2015/08/24 07:13

いやいや… あなたのコードだったら、 $bookじゃなくて$objPExcelでしょ。
shinoda

2015/08/24 07:53

$writer = PHPExcel_IOFactory::createWriter($objPExcel, 'csv'); $writer->save('fput.csv'); 上記のコードになるということでしょうか? 試してるのですが同じくエラーがでます。
退会済みユーザー

退会済みユーザー

2015/08/24 08:30

そのコードの前後のソースも含めて記述してください。 > Argument 1 passed to PHPExcel_IOFactory::createWriter() must be an instance of PHPExcel, null given, -> 1番目の引数にPHPExcelオブジェクトではなく、NULL が渡されました。 $objPExcel が正しい値になるようにしましょう。
shinoda

2015/08/24 09:00

コードを記載します ------------------------ <?php // ファイル名の指定 $readFile = "sample.xlsx"; // 連想配列でデータ受け取り $data = readXlsx($readFile); // 出力確認 /*print '<pre>'; var_dump($data); print '</pre>';*/ // ファイル名渡したら配列返すラッパー関数 function readXlsx($readFile) { // ライブラリファイルの読み込み (パス指定し直す) require_once dirname(__FILE__) . './../Classes/PHPExcel/IOFactory.php'; // ファイルの存在チェック if (!file_exists($readFile)) { exit($readFile. "が見つかりません。" . EOL); } // xlsxをPHPExcelに食わせる $objPExcel = PHPExcel_IOFactory::load($readFile); // 配列形式で返す return $objPExcel->getActiveSheet()->toArray(null,true,true,true); } $writer = PHPExcel_IOFactory::createWriter($objPExcel, 'csv'); $writer->save('fput.csv'); ----------------------- returnで配列で返すところがダメということでしょうか? CSVに出力する際には、連想配列の形式で返したいのでどのようにすればよいでしょうか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問