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

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

ただいまの
回答率

90.40%

  • PHP

    21867questions

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

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

解決済

回答 3

投稿

  • 評価
  • クリップ 0
  • VIEW 1,995

mocchiri

score 2

実現したいこと

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枚のシートを設定したら、無事に処理が完了します。

  2. 各シートに含まれる記載量を少なくする。→成功
    各シートを全て空白にすると問題なく出力ができます。

  3. キャッシュを設定して処理する。→失敗
    // キャッシュを設定してみる
    $cacheMethod = PHPExcel_CachedObjectStorageFactory::cache_to_phpTemp;
    $cacheSettings = array( 'memoryCacheSize' => '32MB');
    PHPExcel_Settings::setCacheStorageMethod($cacheMethod, $cacheSettings);

補足情報

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

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

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 3

check解決した方法

0

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

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

0

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

$excel->disconnectWorksheets();  
unset($excel);

そして、もう一度読み込んで、削除。
でどうですか?

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2016/09/04 17:34

    回答ありがとうございました。

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

    いずれにしてもshi_ueさんから頂きました情報についても参考にさせて頂きます。

    キャンセル

0

<?php

// メモリサイズ変更
ini_set('memory_limit', '512M');

require 'PHPExcel/Classes/PHPExcel.php';

//PHPExcelの読み込み
$reader = PHPExcel_IOFactory::createReader('Excel2007');
$excel = $reader->load(dirname(__FILE__) . '/sample.xlsx');

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

// 存在しているシートの確認
$sheets = $excel->getAllSheets();
$arrExistsSheets = array();
foreach ($sheets as $sheet) {
    $arrExistsSheets[] = $sheet->getTitle();
}
//var_dump($arrExistsSheets); // <- 確認用

// シートをExcelブックから削除する
foreach ($deleteSheet as $sheetName) {
    $objSheet = $excel->getSheetByName($sheetName);

    // シートが存在していない時に例外
    if (is_null($objSheet)) {
        throw new Exception(sprintf('%s シートがありません。', $sheetName));
    }
    $deleteSheetindex = $excel->getIndex($objSheet);
    $excel->removeSheetByIndex($deleteSheetindex);
}

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

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2016/09/04 17:41

    Kosuke_shibuyaさん、回答ありがとうございました。

    つい先ほど自己解決できました。
    頂きましたソース内容は参考にさせていただきます。

    キャンセル

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

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

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

  • PHP

    21867questions

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