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

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

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

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

Q&A

解決済

1回答

7902閲覧

PHPExcelでaddsheetをしてコピーしたセルのStyleが変更できません。

tokada

総合スコア21

PHP

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

0グッド

0クリップ

投稿2017/04/11 05:56

###PHPExcelでaddsheetをしてコピーしたセルのStyleが変更できません。
現在、エクセルの帳票出力プログラムを作成しており、分類毎に所定のフォーマットにしたがったシートを複製しています。
シートの複製を行い、セルへのデータの書き込みは出来ているのですが、
そのセルのフォーマットを指定すると出力されたファイルが壊れてしまいます。

原因が分かる方、教えて頂けないでしょうか。
よろしくお願い致します。

###発生している問題・エラーメッセージ(出力された壊れたエクセルを開いたもの)

<b>Fatal error</b>: Uncaught PHPExcel_Exception: Your requested sheet index: 3 is out of bounds. The actual number of sheets is 3. in C:\xampp\php\pear\phpexcel\vendor\phpoffice\phpexcel\Classes\PHPExcel.php:577 Stack trace: #0 C:\xampp\php\pear\phpexcel\vendor\phpoffice\phpexcel\Classes\PHPExcel.php(469): PHPExcel-&gt;getSheet(3) #1 C:\xampp\php\pear\phpexcel\vendor\phpoffice\phpexcel\Classes\PHPExcel\Writer\Excel5\Worksheet.php(1310): PHPExcel-&gt;getActiveSheet() #2 C:\xampp\php\pear\phpexcel\vendor\phpoffice\phpexcel\Classes\PHPExcel\Writer\Excel5\Worksheet.php(480): PHPExcel_Writer_Excel5_Worksheet-&gt;_writeWindow2() #3 C:\xampp\php\pear\phpexcel\vendor\phpoffice\phpexcel\Classes\PHPExcel\Writer\Excel5.php(187): PHPExcel_Writer_Excel5_Worksheet-&gt;close() #4 C:\xampp\htdocs\calc_overhead\class\LPHPExcel.php(175): PHPExcel_Writer_Excel5-&gt;save('php://output') #5 C:\xampp\htdocs\calc_overhead\system\calc\manager\self_download.php(13): LPHPExcel-&gt;createExcel() #6 {main} thrown in <b>C:\xampp\php\pear\phpexcel\vendor\phpoffice\phpexcel\Classes\PHPExcel.php</b> on line <b>577</b><br />

###該当のソースコード(抜粋)

//$this->_bookにはエクセルのオブジェクト格納済 $company_sheet = $this->_book->setActiveSheetIndex(2); //コピー開始位置のシート番号 $sheet_no = 3; //データを分類毎に分割して配列に格納([プロジェクト名][カテゴリ名][連番][データ種別]) $items = $this->_summaryCompanyData($this->_data['data']); if(is_array($items)){ foreach($items as $project => $category_data){ $np = self::CompanyStartPosition; //エクセルにデータを書き始める初期位置を設定 //シートをコピー $copy_sheet = $company_sheet->copy(); $copy_sheet->setTitle($project); $this->_book->addSheet($copy_sheet,$sheet_no); if($this->_book->sheetNameExists($project)){ //コピーしたシートをアクティブに変更 $sheet = $this->_book->getSheetByName($project); //見出しの設定 $sheet->setCellValueByColumnAndRow(self::CompanyTitlePosition[0],self::CompanyTitlePosition[1],$project); $sheet->setCellValueByColumnAndRow(self::CompanyDatePosition[0],self::CompanyDatePosition[1],$this->_data['ap_date']); $sheet->getStyleByColumnAndRow(self::CompanyTitlePosition[0],self::CompanyTitlePosition[1])->getFont()->setSize(14); } } }

###試したこと
見出しの設定部分で、3つめのフォントサイズを14にしている行をコメントアウトすると正常にエクセルが出力され、これをいれたままだと上記のエラーとなりファイルが壊れてしまいます。

###補足情報(言語/FW/ツール等のバージョンなど)
php7.0.9
XAMPP for Windows 7.0.9
phpexcel 1.8.1

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

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

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

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

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

guest

回答1

0

自己解決

自己解決しました。
こちらのサイトを参考にしました。
http://d.hatena.ne.jp/reioto/20131119/1384857124

どうやら、

addSheetした最新のシートは次にシートを追加/削除するまでStyleでは参照できない状態

らしいです。。。

PHP

1//$this->_bookにはエクセルのオブジェクト格納済 2$company_sheet = $this->_book->setActiveSheetIndex(2); 3 4//データを分類毎に分割して配列に格納([プロジェクト名][カテゴリ名][連番][データ種別]) 5$items = $this->_summaryCompanyData($this->_data['data']); 6if(is_array($items)){ 7 //コピー開始位置のシート番号 8 $sheet_no = 3; 9 foreach($items as $project => $category_data){ 10 //シートをコピー 11 $copy_sheet = $company_sheet->copy(); 12 $copy_sheet->setTitle($project); 13 $this->_book->addSheet($copy_sheet,$sheet_no); 14 } 15 //テンプレートのシートを削除 16 $this->_book->removeSheetByIndex(2); 17 18 //データの書き込み 19 foreach($items as $project => $category_data){ 20 if($this->_book->sheetNameExists($project)){ 21 //コピーしたシートをアクティブに変更 22 $sheet = $this->_book->getSheetByName($project); 23 24 //見出しの設定 25 $sheet->setCellValueByColumnAndRow(self::CompanyTitlePosition[0],self::CompanyTitlePosition[1],$project); 26 $sheet->setCellValueByColumnAndRow(self::CompanyDatePosition[0],self::CompanyDatePosition[1],$this->_data['ap_date']); 27 $sheet->getStyleByColumnAndRow(self::CompanyTitlePosition[0],self::CompanyTitlePosition[1])->getFont()->setSize(14); 28 } 29 } 30}

投稿2017/04/11 07:51

tokada

総合スコア21

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問