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

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

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

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

Q&A

解決済

3回答

6761閲覧

PHPExcelでのシート削除で処理落ちしてしまう

mocchiri

総合スコア47

PHP

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

0グッド

0クリップ

投稿2016/09/04 03:57

###実現したいこと
PHPExcelを用いて、ファイルのアウトプットを試みています。

テンプレートとなるExcelファイルを読み込んで、該当シートを削除して出力するものです。
削除するシート枚数が増えると、エラーが発生してしまい破損したファイルが生成されてしまい困っています。

テンプレートファイルには25枚のシートが含まれており、そのうち20枚のシートを削除してファイルを出力したいです。

###前提
テンプレートとなるExcelファイル
ファイル名:template.xlsx
サイズ容量:500KB
シートが『サンプルあ』『サンプルい』『サンプルう』『サンプルえ』『サンプルお』のように
『サンプルあ』から『サンプルの』まで25枚のシートが含まれています。

そのうち
『サンプルあ』から『サンプルと』までの20枚のシートを削除したうえで、ファイルを出力します。

ファイルは最終的に同じディレクトリ内に保存されるものとします。

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

Uncaught exception 'PHPExcel_Exception' with message 'Sheet does not exist.' in /example.com/file/Classes/PHPExcel.php:628 Stack trace: #0 /example.com/file/Classes/PHPExcel/Writer/Excel2007/Workbook.php(325): PHPExcel->getIndex(Object(PHPExcel_Worksheet)) #1 /example.com/file/Classes/PHPExcel/Writer/Excel2007/Workbook.php(308): PHPExcel_Writer_Excel2007_Workbook->_writeDefinedNameForNamedRange(Object(PHPExcel_Shared_XMLWriter), Object(PHPExcel_NamedRange)) #2 /example.com/file/Classes/PHPExcel/Writer/Excel2007/Workbook.php(277): PHPExcel_Writer_Excel2007_Workbook->_writeNamedRanges(Object(PHPExcel_Shared_XMLWriter), Object(PHPExcel)) #3 /example.com/file/Classes/PHPExcel/Writer/Excel2007/W in /example.com/file/Classes/PHPExcel.php on line 628

どうやらファイル出力時の処理で、シートが存在しないと表示されているようです。

###該当のソースコード
//PHPExcelの読み込み
$reader = PHPExcel_IOFactory::createReader('Excel2007');
$excel = $reader->load(dirname(FILE) . '/template.xlsx');

//削除するシート名を配列入力。
$deleteSheet = array('サンプルあ','サンプルい','サンプルう','サンプルえ','サンプルお','サンプルか','サンプルき','サンプルく','サンプルけ','サンプルこ','サンプルさ','サンプルし','サンプルす','サンプルせ','サンプルそ','サンプルた','サンプルち','サンプルつ','サンプルて','サンプルと');

// シートをExcelブックから削除する
for ($i = 0; $i < count($deleteSheet); $i++) {
$deleteSheetindex = $excel->getIndex($excel-> getSheetByName($deleteSheet[$i]));
$excel->removeSheetByIndex($deleteSheetindex);
}

//output.xlsxとして出力する
$objWriter = PHPExcel_IOFactory::createWriter($excel, 'Excel2007');
$objWriter->save("output.xlsx");

###試したこと

  1. 削除するシート数を少なくする。→成功

$deleteSheetを『サンプルあ』から『サンプルそ』までの15枚のシートを設定したら、無事に処理が完了します。

  1. 各シートに含まれる記載量を少なくする。→成功

各シートを全て空白にすると問題なく出力ができます。
3. キャッシュを設定して処理する。→失敗
// キャッシュを設定してみる
$cacheMethod = PHPExcel_CachedObjectStorageFactory::cache_to_phpTemp;
$cacheSettings = array( 'memoryCacheSize' => '32MB');
PHPExcel_Settings::setCacheStorageMethod($cacheMethod, $cacheSettings);

###補足情報
テンプレートとなる元のファイルは、サイズ容量が500KBで、ファイルの出力に少し時間がかかっている印象があります。15枚のシート削除は無事に完了し、20枚のシート削除では処理落ちしているということは何らかメモリなどの数字を上げればいいのでは等の検討はつくのですが、最終的に解決に至ってない状況です。

皆さまのお知恵をお借りしたいです。よろしくお願いします。

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

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

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

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

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

guest

回答3

0

自己解決

自己解決できました。
特定のシートがなぜかPHPExcelからは削除できない事象でした。具体的な解決方法はわかりませんでしたが、テンプレートファイル内に名前の管理で定義されているものを削除することで、PHPExcelでのシート削除ができるようになりました。

投稿2016/09/04 08:35

mocchiri

総合スコア47

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

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

0

php

1<?php 2 3// メモリサイズ変更 4ini_set('memory_limit', '512M'); 5 6require 'PHPExcel/Classes/PHPExcel.php'; 7 8//PHPExcelの読み込み 9$reader = PHPExcel_IOFactory::createReader('Excel2007'); 10$excel = $reader->load(dirname(__FILE__) . '/sample.xlsx'); 11 12//削除するシート名を配列入力。 13$deleteSheet = array('サンプルあ', 'サンプルい', 'サンプルう', 'サンプルえ', 'サンプルお', 'サンプルか', 'サンプルき', 'サンプルく', 'サンプルけ', 'サンプルこ', 'サンプルさ', 'サンプルし', 'サンプルす', 'サンプルせ', 'サンプルそ', 'サンプルた', 'サンプルち', 'サンプルつ', 'サンプルて', 'サンプルと'); 14 15// 存在しているシートの確認 16$sheets = $excel->getAllSheets(); 17$arrExistsSheets = array(); 18foreach ($sheets as $sheet) { 19 $arrExistsSheets[] = $sheet->getTitle(); 20} 21//var_dump($arrExistsSheets); // <- 確認用 22 23// シートをExcelブックから削除する 24foreach ($deleteSheet as $sheetName) { 25 $objSheet = $excel->getSheetByName($sheetName); 26 27 // シートが存在していない時に例外 28 if (is_null($objSheet)) { 29 throw new Exception(sprintf('%s シートがありません。', $sheetName)); 30 } 31 $deleteSheetindex = $excel->getIndex($objSheet); 32 $excel->removeSheetByIndex($deleteSheetindex); 33} 34 35//output.xlsxとして出力する 36$objWriter = PHPExcel_IOFactory::createWriter($excel, 'Excel2007'); 37$objWriter->save("output.xlsx"); 38

投稿2016/09/04 08:28

編集2016/09/04 08:31
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

mocchiri

2016/09/04 08:41

Kosuke_shibuyaさん、回答ありがとうございました。 つい先ほど自己解決できました。 頂きましたソース内容は参考にさせていただきます。
guest

0

一度に全部削除せずに、10枚削除して、一時ファイルに保存、以下のようにしてメモリ開放。

php

1$excel->disconnectWorksheets(); 2unset($excel); 3```そして、もう一度読み込んで、削除。 4でどうですか?

投稿2016/09/04 08:00

shi_ue

総合スコア4437

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

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

mocchiri

2016/09/04 08:34

回答ありがとうございました。 自己解決できました。 特定のシートがなぜかPHPExcelからは削除できない事象でした。具体的な解決方法はわかりませんでしたが、テンプレートファイル内に名前の管理で定義されているものを削除することで、PHPExcelでのシート削除ができるようになりました。 (ひょっとすると解釈が違っているかもしれませんが。。。) いずれにしてもshi_ueさんから頂きました情報についても参考にさせて頂きます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問