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

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

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

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

Q&A

解決済

1回答

9184閲覧

PhpSpreadsheetでシートのコピーと削除

mokemoke

総合スコア52

PHP

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

0グッド

1クリップ

投稿2018/08/31 02:07

編集2018/08/31 10:55

前提・実現したいこと

作業テーブル(作業者ID、作業日、作業時間)から作業者毎にデータを抽出し、日報、月報、総計のエクセルを作業者毎のブックに
まとめて出力する事を考えております。
テンプレートのエクセルファイルが用意されており、日報、月報、総計のシートになっております。
出力する際、日報は日付毎にシートを分け、月報は月毎にシートを分け、総計は1シートで全データの総計となるよう、考えております。

発生している問題

PhpSpreadsheetは未経験(旧のPHPExcelも未経験。PHPそのものも未経験)の為、とりあえず動きを確認する意味で、ネット上の情報を
確認しながら動きを確認し、テンプレートを読み込んで、3つのシートにデータをセットし、エクセルファイルを出力するところまでは
確認できました。
しかし、シートをコピーして、コピーしたシートに対してデータをセットする部分と、元のシートを削除する部分が上手く出来ない状況です。
(エクセルファイルの出力まで至らない)
とにかく未経験な上、周りに詳しい人もいない状況なので、アドバイスを頂けると非常に助かります。

該当のソースコード

PHP

1<?php 2 require_once 'c:\windows\system32\vendor\autoload.php'; 3 4 $reader = new PhpOffice\PhpSpreadsheet\Reader\Xlsx(); 5 $reader->setIncludeCharts(TRUE); 6 7 $book = $reader->load('nippou_template.xlsx'); 8 9 $book->setActiveSheetIndex(0); 10 $sheet = $book->getActiveSheet(); 11 $sheet = $baseSheet->copy(); 12 $sheet->setTitle("nippou_new" . $sheetNum, false); 13 $book->addSheet( $sheet ); 14 $book->setActiveSheetIndex(4); 15 $sheet = $book->getActiveSheet(); 16 $sheet->setCellValue('C2', 'AAAAAAAA'); 17 18 $book->setActiveSheetIndex(1); 19 $sheet = $book->getActiveSheet(); 20 $sheet = $baseSheet->copy(); 21 $sheet->setTitle("soukei_new" . $sheetNum, false); 22 $book->addSheet( $sheet ); 23 $book->setActiveSheetIndex(5); 24 $sheet = $book->getActiveSheet(); 25 $sheet->setCellValue('D3', 'AAAAAAAA'); 26 $sheet->setCellValue('V3', 'BBBBBBBB'); 27 $sheet->setCellValue('L3', 'CCCCCCCC'); 28 29 header("Content-Description: File Transfer"); 30 header('Content-Disposition: attachment; filename="nippou_test_download.xlsx"'); 31 header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'); 32 header('Content-Transfer-Encoding: binary'); 33 header('Cache-Control: must-revalidate, post-check=0, pre-check=0'); 34 header('Expires: 0'); 35 ob_end_clean(); //バッファ消去 36 $writer = new PhpOffice\PhpSpreadsheet\Writer\Xlsx($book); 37 $writer->save('php://output'); 38 39?>

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

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

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

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

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

m.ts10806

2018/08/31 02:17

プログラムコード(およびエラーメッセージ)は質問内容としては最も重要な部分であるため、見やすくしていただけると助かります。<code>ボタン押下→「コード」部分にコードを貼り付け→「ここに言語を入力」に対象言語名記入(エラーメッセージの場合は不要)の手順で「コードハイライト化」してください。(質問編集画面ではリアルタイムでプレビューが表示されるので見ながら調整してください)
guest

回答1

0

ベストアンサー

私も開発未経験&一人ぼっちの状態で同じようにPHPでExcel出力するシステムを作らされて苦労しました。
PHPSpreadSheetの日本語情報よりPHPExcelの情報の方がいっぱいヒットするので、
PHPExcelの書き方を公式ドキュメントのMigration from PHPExcelを見ながらPHPSpreadSheet版に書き換えてました。
全部は載ってないと思いますが、ほとんどのことはこれでうまく置き換えれましたよ。

■シートのコピー

シートのコピーは、元シートをクローンしてブックに入れるという作業が必要です。
公式のドキュメントにそのまんま載ってます。

Copying Worksheets

php

1$clonedWorksheet = clone $spreadsheet->getSheetByName('Worksheet 1'); 2$clonedWorksheet->setTitle('Copy of Worksheet 1'); 3$spreadsheet->addSheet($clonedWorksheet); 4

■コピーしたシートに値を入れる

既存のシートに値を入れるのと同じです。
上の例でいくと$clonedWorksheetに値をセットした後で、ブックに差し込めば望む結果になると思います。
ブックに差し込んだ後は、提示されているコードと同じように、シートを特定して値を書き込めばOKです。

私はインデックスがシートを選択する方法ではわけがわからなくなったので、
シート名で取得する方法にしてます。

php

1$sheet = $book->->setActiveSheetIndexByName(シート名); 2$sheet->setCellValue('D3', 'AAAAAAAA'); // 値をセット 3

日付は月をシート名にされるなら、こっちの方がわかりやすいかもしれません。

■元シートの削除

これも公式ドキュメントに載ってます。
Removing a Worksheet

php

1$sheetIndex = $spreadsheet->getIndex( 2 $spreadsheet->getSheetByName('Worksheet 1') 3); 4$spreadsheet->removeSheetByIndex($sheetIndex);

うろ覚えですが、アクティブなシートを削除したらエラーになって
「なんでやー!!」とキレた記憶があります。
もしエラーになったら、その辺りを疑ってみるといいかもしれません。

余談ですが、PHPSpreadSheetのバージョンも確認された方が良いと思います。
どこのタイミングかわかりませんが、Cellクラスとかの名前や階層(名前空間?)が変わったみたいで
ネットで調べた情報がどのバージョンかも確認しないと、同じように書いても「そんなクラス無いよ」って怒られることがありました。

投稿2018/08/31 05:18

SystemAjisai

総合スコア171

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

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

mokemoke

2018/08/31 05:28

SystemAjisaiさん、こんにちは。 アドバイス頂き、ありがとうございます。 さっそく試してみたいと思います。
mokemoke

2018/08/31 06:11

SystemAjisaiさん、こんにちは。 アドバイス頂いた内容で確認したいことが御座います。 >上の例でいくと$clonedWorksheetに値をセットした後で、ブックに差し込めば望む結果になると >思います。 ブックに差し込みというのが、いまいちよくわからない状況です。 教えて頂いたコードで、元のシート名とコピー先のシート名を、こちらのコードに 合わせるだけでは、駄目なのでしょうか?
mokemoke

2018/08/31 06:26

SystemAjisaiさん、こんにちは。 なんとか自己解決出来ました。 シートのコピーは動作確認が出来ましたので、シートの削除も確認してみます。
SystemAjisai

2018/08/31 06:27

ブックに差し込むは変な表現でしたね。追加するというのが正しかったです。 コードでいうと $spreadsheet->addSheet($clonedWorksheet); の部分です。 $clonedWorksheetはコピーされた新しいシートインスタンスなので、 $clonedWorksheet = clone $spreadsheet->getSheetByName('Worksheet 1'); $clonedWorksheet->setTitle('Copy of Worksheet 1'); $spreadsheet->addSheet($clonedWorksheet); // ① $clonedWorkshee->setCellValue('D3', 'AAAAAAAA'); // ② と書けばシートに書き込まれるのかもしれませんが、その辺はいまいち自信がありません。 オブジェクトのスコープ?ライフサイクル?とかいうあたりが何回調べても理解できないので…。 単純な感覚ですが、①と②が逆の方がうまくいきそうだなと思った次第です。 私はシートコピー後にブックに追加した後、改めてコピーシートを選択して書き込んでます。 プロな方がみたら冗長と感じるかもしれませんが。。。 $clonedWorksheet = clone $spreadsheet->getSheetByName('Worksheet 1'); $clonedWorksheet->setTitle('Copy of Worksheet 1'); $spreadsheet->addSheet($clonedWorksheet); $sheet = $spreadsheet->setActiveSheetIndexByName('Copy of Worksheet 1'); $sheet ->setCellValue('D3', 'AAAAAAAA');
mokemoke

2018/08/31 06:35

SystemAjisaiさん、こんにちは。 削除も無事に動作確認出来ました。 とても助かりました。 ありがとうございました。
SystemAjisai

2018/08/31 06:40

解決して何よりです。 mts10806さんがコメントしてくださっている通り、質問文のコード部分も修正されておいた方が良いですよ。 同じようなことで悩まれた方が参照した時も、読みやすい方がピンときやすくなりますので。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問