このサイトは、PHPExcelに関連する内容を淡々と書きとめたものです。
ブラウザはとりあえずChromeの最新版をお勧めいたします。

  • 連結したセル情報を取得する

    連結したセル情報を取得する

    $merged = $sheet->getMergeCells();
    
    /* $mergedの内容(例)
    array (
      'B1:P1' => "B1:P1",
      'Q1:AB1' => "Q1:AB1",
      'A2:A4' => "A2:A4",
    )
    */
    

    シート内の連結したセル情報はgetMergeCellsメソッドで取得できる。取得した内容は連想配列でキーとその値は、「開始セル:終了セル」の書式で表され、配列内の順番は左上からではない。

  • 先頭のシートデータをコピーする

    先頭のシートデータをコピーする

    $baseSheet = $book->getSheet( 0 );
    $newSheet = $baseSheet->copy();
    $newSheet->setTitle( 'SheetX' );
    $book->addSheet( $newSheet );
    

    シートデータをcopyメソッドを使ってデータを複製し、addSheetメソッドでシートを追加する。ポイントはシートデータの複製後にsetTitleメソッドで(ユニークな)シート名を設定しているところ。あとaddSheetメソッドは第2パラメータでシートの挿入位置(インデックス)を指定できる(省略時はnullとなり最後に追加される)。

  • シート名からシートデータを取得する

    シート名’Sheet2’のシートデータを取得する

    if ( ( $sheet = $book->getSheetByName( 'Sheet2' ) ) != null ) {
    	// 'Sheet2'のシートデータが取得できた場合の処理
    
    }
    

    シート名を指定してシートデータを取得する場合はgetSheetByNameメソッドが使える。該当するシートがない場合はnullとなる。Excelファイルでシート名が決まっている場合はこれが楽かも。

  • シート名が使用済みか調べる

    シート名’Sheet2’が使用されているか調べる

    if ( $book->sheetNameExists( 'Sheet2' ) ) {
    	// 'Sheet2'が使用されていた場合の処理
    
    }
    

    ブック内のシート名はユニークである必要があり、シートを追加する前にチェックする時はsheetNameExistsメソッドが使える。

  • セルがリッチテキストの場合はそのプレーンテキストを取得する

    セルB1の値がリッチテキストの場合にそのプレーンテキストを取得する

    $val = $sheet->getCell( 'B1' )->getValue();
    if ( $val instanceof PHPExcel_RichText )
    	$val = $val->getPlainText();
    

    getValueメソッドで取得した値が文字列ではなくPHPExcel_RichTextクラスのオブジェクトの場合がある。この場合はgetPlainTextメソッドを使用することでプレーンテキストを取得する。文章(文字列)が入るセルの値を取得する場合は注意したい。

  • 日付セルの値を取得する

    2列目のセルの値を日付書式で取得する。

    // getFormattedValueメソッドを使用する場合
    for ( $row = 1; $row <= 10; $row++ ) {
    	$date_val = $sheet->getCellByColumnAndRow( 1, $row )->getFormattedValue();
    	if ( preg_match( '/^[0-9]{2}\-[0-9]{2}\-[0-9]{2}$/', $date_val ) )
    		$date_val = DateTime::createFromFormat( 'm-d-y', $date_val )->format( 'Y/m/d' );
    }
    
    // getValueメソッドを使用する場合
    $date_val = $sheet->getCellByColumnAndRow( 0, $row )->getValue();
    if ( $date_val != '' ) {
    	$date_val = PHPExcel_Style_NumberFormat::toFormattedString( $date_val, PHPExcel_Style_NumberFormat::FORMAT_DATE_YYYYMMDD2 );
    

    日付セルの値をgetValueメソッドで取得すると「1900/1/1」からの経過日数となる。PHPExcel_Style_NumberFormat::toFormattedStringメソッドや自前で変換する方法もあるが、getFormattedValueメソッドを使うことで’m-d-y’書式の文字列(例:2010年5月21日なら’05-21-10’)が取得できる。上記の例では取得した値の書式を確認し、DateTimeクラスのcreateFromFormatメソッドを使ってパースし、書式を’Y/m/d’に変換している。

  • シートの名前を取得する

    2番目のシートの名前を取得する。

    $book->setActiveSheetIndex(1);
    $sheet = $book->getActiveSheet();
    $title = $sheet->getTitle();
    

    getActiveSheetで取得できるシートオブジェクトのgetTitleメソッドを使う。

  • 列を削除する

    列を削除する。

    /* B列を削除する */
    $sheet->removeColumn( 'B' );
    
    /* B列とC列を削除する */
    $sheet->removeColumn( 'B', 2 );
    
    /* B列とC列を削除する(カラム番号を指定) */
    $sheet->removeColumnByIndex( 1, 2 );
    

    removeColumnメソッドで列(カラム)名と列数(省略時は1)を指定。カラム番号で指定したい場合はremoveColumnByIndexメソッドを使う。

  • 列を挿入する

    列を挿入する。

    /* E列の前に2列挿入にする */
    $sheet->insertNewColumnBefore( 'E', 2 );
    

    insertNewColumnBeforeメソッドで挿入する列と挿入分を指定。この例では新しいE列とF列が作られ、現在のE列以降がG列以降となる。ちなみに行を挿入するはinsertNewRowBeforeメソッドである。

  • 行を非表示にする

    行を非表示にする。

    /* 5行目を非表示にする */
    $sheet->getRowDimension( 5 )->setVisible( false );
    
    /* カラムEを非表示にする */
    $sheet->getColumnDimension( 'E' )->setVisible( false );
    

    getRowDimensionメソッドで1行分のセルオブジェクトを取得して、setVisibleメソッドでfalseを指定すると非表示になる(trueを指定すると表示になる)。特定のカラムをすべて非表示の場合は、getRowDimensionメソッドの代わりにgetColumnDimensionメソッドを使用する。