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

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

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

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

解決済

phpspreadsheetでシートコピーすると、出来上がったファイルが破損している

makotokw
makotokw

総合スコア24

PHP

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

1回答

0評価

1クリップ

5475閲覧

投稿2020/07/09 21:16

編集2020/07/09 22:40

前提・実現したいこと

ひな形となるシートをコピーし、新しくコピーしたシート側に各種データを埋め込む機能を実装中に以下のエラーメッセージが発生しました。

生成されたExcelファイルが破損してしまいます。


何が問題なのかが理解できず困っております
ご教示いただけますでしょうか、よろしくお願いします


【環境】

Linux側Windows側
CentOS7 + PHP7.3.19 + phpspreadsheet(1.13.0)Windows10 + Excel2019

発生している問題・エラーメッセージ

phpで生成されたExcelファイルを開くと下記のメッセージが表示されます。

エラーメッセージ

該当のソースコード

<?php require '../phpLibs/PhpSpreadsheet/vendor/autoload.php'; use PhpOffice\PhpSpreadsheet\Reader\Xlsx as XlsxReader; use PhpOffice\PhpSpreadsheet\Writer\Xlsx as XlsxWriter; use PhpOffice\PhpSpreadsheet\Reader\Xls as XlsReader; use PhpOffice\PhpSpreadsheet\Writer\Xls as XlsWriter; use PhpOffice\PhpSpreadsheet\Style\Style; use PhpOffice\PhpSpreadsheet\Style\Border; use PhpOffice\PhpSpreadsheet\Style\Fill; use PhpOffice\PhpSpreadsheet\Style\Color; use PhpOffice\PhpSpreadsheet\Style\Conditional; use PhpOffice\PhpSpreadsheet\Shared\Date; use PhpOffice\PhpSpreadsheet\Document\Properties; require '../phpLibs/Ginq/src/Ginq.php'; require '../config.php'; $reader = new XlsxReader(); $spreadsheet = $reader->load('../tmp/新規 Microsoft Excel ワークシート.xlsx'); $spreadsheet->setActiveSheetIndex(0); $mastersheet = $spreadsheet->getSheetByName('Sheet1'); $worksheet = clone $mastersheet; $worksheet->setTitle('シート1'); $spreadsheet->addSheet($worksheet); $worksheet->setCellValue('A1','かきこみ'); $writer = new XlsxWriter($spreadsheet); $writer->save('../tmp/TEST_generate.xlsx');

試したこと

  • Windows10で右クリックして「新規作成」→「Microsoft Excel ワークシート」の操作を行って

新規 Microsoft Excel ワークシート.xlsx を作成し、何も変更していないファイルを
テンプレートとして使用し、上記プログラムを実行。
ファイル破損のメッセージは表示されない。

  • Windows10で右クリックして「新規作成」→「Microsoft Excel ワークシート」の操作を行って

新規 Microsoft Excel ワークシート.xlsx を作成し、適当なセルに値を入力して保存。
保存したファイルをテンプレートとして使用し、上記プログラムを実行。
ファイル破損のメッセージが表示される。

  • .xlsxではなく、.xlsファイルをテンプレートとして使用、上記プログラムを実行。

ファイル破損のメッセージが表示される。

  • テンプレートとなるファイル名を TEST.xlsxに変更して、上記プログラムを実行。

ファイル破損のメッセージが表示される。

  • セルに値を書き込む箇所をコメントにし、シートをコピーするだけでも破損していました。

// $worksheet->setCellValue('A1','かきこみ');
ファイル破損のメッセージが表示される。

補足情報(FW/ツールのバージョンなど)

良い質問の評価を上げる

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

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

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

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

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

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

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

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

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

m.ts10806

2020/07/09 21:58

>の一ぐの内容に問題が見つかりました。 コピペできないメッセージでしたら、画面キャプチャで良いですよ。
m.ts10806

2020/07/09 21:58

>$spreadsheet = $reader->load('../tmp/新規 Microsoft Excel ワークシート.xlsx'); スペースや全角文字なしで半角英数のみのファイル名にした場合はどうでしょうか。
makotokw

2020/07/09 22:23

> コピペできないメッセージでしたら、画面キャプチャで良いですよ。 誤字ありました。画面キャプチャでいいんですね。 承知しました。 > スペースや全角文字なしで半角英数のみのファイル名にした場合はどうでしょうか 入力元となるテンプレートファイルを,TEST.xlsxにして実行しても状況は変わらなかったです。
makotokw

2020/07/09 22:32

セルに値を書き込む箇所をコメントにし、シートをコピーするだけでも破損していました。 // $worksheet->setCellValue('A1','かきこみ');
makotokw

2020/07/09 22:58

IOFactoryを使用するように修正して実行したのですが、変化なしです。 いろいろと調べて下さってうれしいです。 //$spreadsheet = $reader->load('../tmp/TEST.xlsx'); $spreadsheet = IOFactory::load('../tmp/TEST.xlsx'); : : //$writer = new XlsxWriter($spreadsheet); $writer = IOFactory::createWriter($spreadsheet, 'Xlsx'); $writer->save('../tmp/TEST_generate.xlsx');
m.ts10806

2020/07/09 23:43

一応、die()(またはexit())も試してみてください。 私もだいぶ昔ですが、exit()で締めることにより解決した経験はあります。
m.ts10806

2020/07/09 23:44

あ、hentaimanさんの提示されているエラーハンドリングは必須ですね。 ファイル操作なので。(JavaだとIOException書かないと怒られます)
makotokw

2020/07/10 00:00

try ~ catch で囲って実行したのですが、何も例外は発生しませんでした。 > 一応、die()(またはexit())も試してみてください。 ブラウザに直接バイナリをレスポンスとして返すなら、exitを指定した方がいいとの記載も見つけて 既にやっていたのですが、状況は同じでした。 本当に原因不明で困りもんです...
hentaiman

2020/07/10 00:03

そうなると後はテキストエディタで開いて余計な文字やエラーが出力されてないかを確認するしかないな xlsxはxmlなのでテキストエディタで開けるので
m.ts10806

2020/07/10 00:04

CentOS上でなかったらどうなんだろうと気にはなっています。 つまり、きちんとExcelが入っている環境だとどうか。
makotokw

2020/07/10 00:32

作成されたxlsxをバイナリで見たところ、先頭がPKで始まっていてZIPファイル圧縮されている感じだったので、TEST_generate.xlsx.zip にリネームし、ZIPファイルを解凍してみたけど、余分な文字とかエラは出力されていませんでした。
makotokw

2020/07/10 00:45

Linux上のphpspreadsheetフォルダと、テストプログラムをWindows上に持ってきて、同様のテストを 行ったところ、破損のエラーが発生しませんでした。
hentaiman

2020/07/10 01:02

ということはもしかして $worksheet->setTitle('シート1'); を $worksheet->setTitle('sheet999'); にしたら破損しなくならないか?
makotokw

2020/07/10 01:08

$worksheet->setTitle('シート1');             ↓ $worksheet->setTitle('sheet999'); 試してみましたが、ダメでした...
hentaiman

2020/07/10 01:11

$worksheet->setCellValue('A1','かきこみ') の処理無しでもダメでしたか?
makotokw

2020/07/10 11:52

原因追及までしていませんが、なんとなく状況は把握できました。 phpspreadsheet+Excel2019 の組み合わせが悪いみたいです...

まだ回答がついていません

会員登録して回答してみよう

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

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

PHP

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