yoga9999
@yoga9999 (yoga)

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

phpでエクセルファイルをCSVファイルに変換したい

■やりたいこと
PHPExelライブラリを使用し、サーバ側に保存されたエクセルファイルをcsvファイルに変換し、
新たにcsvファイルとして保存したい。

◯サーバ側にすでに保存されたエクセルファイルのイメージ(juchuu.xls)
item1 item2 item3
2 3 6

◯新たに変換させたいcsvファイル
item1,item2,item3
2,3,6

■実際のプログラム
・サーバ側の該当フォルダにjuchuu.xlsが保存されている
・ライブラリとしてPHPEXLELのプログラム一式がサーバ側に保存されている

csv.php
<?php

echo "段階0";
require_once(__DIR__ . "/lib/PHPExcel.php");
require_once(__DIR__ . "/lib/PHPExcel/IOFactory.php");

echo "段階1";
// PHPExcelオブジェクトを生成する
$reader = PHPExcel_IOFactory::createReader("Excel2007");

echo "段階2";
//Excel読み込み
$book = $objReader->load('./juchuu.xls');

echo "段階3";
//CSV保存
 $writer = PHPExcel_IOFactory::createWriter($book, 'csv');
 $writer->save('./juchuu3.csv');

?>

■できないこと(結果)
・段階2 まで表示された
・当然、csvファイルも保存されていない。

■おしえていただきたいこと
・どこが間違っていますか?

■参考にしたQuita記事
https://qiita.com/hodade/items/13aa1df16bb5f4c2702a

0

3Answer

  • ソースを貼り付ける場合は、「コードの挿入 (Qiita公式ヘルプ)」をお使いください。
    • 特に、一部の言語は、正しく挿入しないと表示されない部分が生じます。
    • ```php:」の行で始めると、PHPの文法に基づいて着色されて読みやすくなります。
  • 既に投稿した質問でも、再度編集して書き替えることができます。
    • 記事の右上辺りに「編集する」リンクがあると思います。
0Like

Comments

  1. @yoga9999

    Questioner

    ありがとうございます。
    質問内容を、修正いたしました。
    $が非表示になっていいました。
  2. PHPは素人なのですが、フォルダに書き込むためのアクセス権がないとかはないでしょうか?

    (あと、コードの最後と「```」の間に改行が足りないようです。)
  3. @yoga9999

    Questioner

    ありがとうございます。
    アクセス権を変更したのですが、変わらなかったです。
    第2段階まで実行されました。
  4. となると、私の手には負えなさそうです。
    お力になれず申し訳ありません。
  5. あっ!!

    $reader = PHPExcel_IOFactory::createReader("Excel2007");
    $book = $objReader->load('./juchuu.xls');

    `$reader`にオブジェクトを作ったのに、`$objReader`で読み込もうとしていませんか?
  6. @yoga9999

    Questioner

    ありがとうございます。
    修正いたしましたが、第3段階までいきました!

    が、それからは、ストップしました。
  7. 「第3段階までいった」というのは、「第3段階が完了してCSVが正しく保存された」ということではなく、「第3段階の開始へ至った」という意味でしたでしょうか?
  8. @yoga9999

    Questioner

    ご連絡が遅くなり、申し訳ございません。

    そのとおりです。

    「第3段階が完了してCSVが正しく保存された」ということではなく、
    「第3段階の開始へ至った」という意味です。

    よろしくお願いいたします。

  9. 「ストップした」というのは、具体的に何が起きたのでしょうか?
    エラーで止まったのであれば具体的なエラー内容とか、正常終了したけどファイルができなかったとか、そういったことを教えてください。
  10. @yoga9999

    Questioner

    エラーがでているわけではありません。
    正常に終了したと思われます。

    ■画面表示内容:

    段階0段階1段階2段階3

    ■サーバのフォルダには:
    csvファイルは作成されていません。

    よろしくお願いいたします。
  11. 情報ありがとうございます。
    エラー無く終了したにもかかわらず、ファイルが作成されないものと理解しました。

    `PHPExcel_IOFactory`の仕様を存じないのですが、戻り値などでファイル作成時のエラーを検知できないでしょうか?
    例えば、最後に`echo $writer`とすると、何が表示されるでしょうか?

    もし、`PHPExcel_IOFactory`のWriterオブジェクトとして不適切な値(`NULL`とか)になっていたら、`createWriter()`でエラーしているものと考えられます。
  12. @yoga9999

    Questioner

    ありがとうございます。
    以下ともに、結果はかわらずです。

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


    $writer = PHPExcel_IOFactory::createWriter($book, 'csv');
    echo $writer;
    $writer->save('./juchuu3.csv');
  13. `echo $writer;`したのに表示が変わらないということは、`$writer`の値が`NULL`もしくは空文字だったということですね。
    つまり、「Writerオブジェクトの生成に失敗した」ということなのでしょう。

    KEINOSさんが書かれているように、`PHPExcel_IOFactory`側に課題が存在するのかも知れませんね。
    お力になれず申し訳ありません。
  14. @yoga9999

    Questioner

    とんでもありません。
    ここまで、貴重なお時間を割いていたただいたことに、心より感謝申し上げます。
    とても勉強になりました。

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

  15. 多少なりともお役に立てたのでしたら幸いです。

echo "段階2"; 直後の Excel 読み込みで $ 抜けの typo があるように見受けられます。@tetr4lab さんがおっしゃるようにコードハイライトされていないため、$ が非表示になってしまっているのかもですが。

- book= objReader->load('./juchuu.xls');
+ book= $objReader->load('./juchuu.xls');
0Like

Comments

  1. @yoga9999

    Questioner

    ありがとうございます。
    質問内容を、修正いたしました。
    $が非表示になっていいました。
  2. > $が非表示に

    と言うことは typo が原因は別ということですね。残念! 😆

ざっと見た限り @tetr4lab さんが指摘されている $reader のオブジェクト名が $objReader になっている以外では構文エラーはなさそうだし、typo が原因ではないとなると、「どのタイミング」で「どのようなエラーが出ているのか」を把握することが先決だと思われます。

サーバーのエラー・ログ、もしくはエラーレベルを変更して何かエラーは出ていませんでしょうか。そのエラーメッセージの内容から紐解いて行った方が皆さん的確なアドバイスができると思われます。

おそらく、PHPExcel が依存しているエクステンション(PHP 拡張モジュール)のうち XML 関連、もしくはファイルの読み込み権限あたりがトラブルを起こしているのだと思われます。

また、質問の答えとは掛け離れるのですが、PHP の開発はローカルでされているのでしょうか、レンタルサーバーにアップロードして開発でしょうか。

というのも、PHPExcel は3年前に開発が中止され、現在は後続の PHPSpreadsheet を使うようにアナウンスされています。セキュリティ・パッチも当たらないので、せっかく頑張って動かせるようになっていても、トラブルは続くと思われます。

PhpSpreadsheet は現在も活気がある反面、PHP 7.2 以上だったり必要なモジュールや PHP 拡張機能が PHPExcel と比較して要件が多いので導入は一筋縄では行かないと思いますが、可能なら PhpSpreadsheet を検討してみるのもおすすめします。質問の答えになってませんが。

それでもエラーから原因を特定し解決するのは勉強になります。何かエラー情報や付加情報があれば教えてください。

0Like

Comments

  1. @yoga9999

    Questioner

    ありがとうございます!
    この問題は、これで、解決させたいですが、
    PhpSpreadsheet を検討する必要がありそうですね。

Your answer might help someone💌