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

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

ただいまの
回答率

90.34%

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

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 2
  • VIEW 4,249

shinoda

score 86

お世話になります。

タイトル通りに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>
------------------------------------------------
  • 気になる質問をクリップする

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 2

checkベストアンサー

0

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

// 配列形式で返す →返さない
$objPExcel->getActiveSheet()->toArray(null,true,true,true);

$writer = PHPExcel_IOFactory::createWriter($objPExcel, 'csv');
$writer->save('fput.csv');
}

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2015/08/27 19:12

    なるほど、同じような境遇の方でも、これほどに知識に差があるということは単純に私の努力不足だということを痛感しました。
    やはり仕事で作ることもないためなかなか落とし込みもできず、結局ローカルでお遊び程度にしかやる機会が無いためなかなか伸びないです。

    Kosuke_Shibuya様のように本番稼働に耐えうるものは現状作れません。
    見た目だけならともかく、やはりセキュリティなどのディフェンスは実務でやらないことにはハードルが高いかと思います。

    ただし、似たような境遇にご指摘いただいて、良い刺激になりました。

    ありがとうございます。

    キャンセル

  • 2015/08/27 19:20

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

    キャンセル

  • 2015/08/27 21:13

    そうでしたか。

    比べることが失礼なことでした。
    私はPHPを学校で三ヶ月ほどやり、基本の構文とMySQLを軽く触った程度でして、今の会社ではプログラムを書くことがほぼない状況なので、忘れていく一方です。

    基本プログラム書くのは好きなのでこれからも少しづつスキルアップしたいと思います。

    キャンセル

0

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

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

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

出力するだけ

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2015/08/24 16:53

    $writer = PHPExcel_IOFactory::createWriter($objPExcel, 'csv');
    $writer->save('fput.csv');

    上記のコードになるということでしょうか?
    試してるのですが同じくエラーがでます。

    キャンセル

  • 2015/08/24 17:30

    そのコードの前後のソースも含めて記述してください。

    > Argument 1 passed to PHPExcel_IOFactory::createWriter() must be an instance of PHPExcel, null given,
    -> 1番目の引数にPHPExcelオブジェクトではなく、NULL が渡されました。

    $objPExcel が正しい値になるようにしましょう。

    キャンセル

  • 2015/08/24 18: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に出力する際には、連想配列の形式で返したいのでどのようにすればよいでしょうか?

    キャンセル

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

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

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