Excel出力の案件があったんでに組み込んでおく。
今は、暗礁にのりあげてるけどなぁ。

PHPでExcelを出力するライブラリーを調べたところ
Excel_Reviser が候補となる。

Excel_Reviserの対応ファイル形式は、
BIFF8形式(Excel97~2003)
事前にテンプレートファイルを作成しておいて、そのExcelファイルを読み込み
セルに値をセットしていく というのが使い方かな

一方PHPExcelはExcel2007の読込に対応。Excelファイルを読み込むことは当然で新規に作成することもできるようだ。

とりあえず今回は自分のPCにはExcel2003しか入ってないのでExcel_Reviserを組み込む。
(一応PHPExcelも組み込んではみたが)

1.ダウンロード

茶漬けブログさんのところからダウンロード

2.ファイルをコピー

ダウンロードしたファイルを解凍するとこんな感じ
file
その中の「reviser.」をincludeが通っている場所にコピー。
今回は、system/application/user_lib というディレクトリを作って、ここにInclude_pathを設定している。
Include_pathの設定は、ルートにindex.phpで行っている。

//独自のインクルードパスを追加
ini_set( 'include_path', APPPATH . 'user_lib/' . PATH_SEPARATOR . APPPATH . 'user_lib' );
/*
|---------------------------------------------------------------
| LOAD THE FRONT CONTROLLER
|---------------------------------------------------------------
|
| And away we go...
|
*/
require_once BASEPATH.'/CodeIgniter'.EXT;

/* End of file index.php */
/* Location: ./index.php */

3.ライブラリファイルの作成

system/application/libraries/配下にExcelr.phpを作成。

ソース

php if ( ! defined('BASEPATH')) exit('No direct script access allowed');   
  
class Excelr  
{
    // public variable to store an instance of the  object
    public $workbook = '';

    // class constructor
    public function __construct()
    {   
        require_once('excelreviser/reviser.php');

        // instantiate the object
        return $this->new_workbook();
  
    } // end constructor
  
    // new workbook function
    private function new_workbook() {
  
        // reset the workbook to a new object
        unset($this->workbook);
        $this->workbook =new Excel_Reviser;

        // ファイルの文字コードをShift_jisに設定
        $this->workbook->setInternalCharset('shift_jis');

        if(isset($this->workbook)) {
            return TRUE;
        } else {
            return FALSE;
        }

    } // end function to start a new workbook
}
// END Excelr Class

/* End of file Excelr.php */
/* Location: ./system/application/libraries/Excelr.php */

4.サンプル

コントローラー

load->library('excelr'); 
    }

    function index()
    {
        $this->load->view('excel_index');
    }

    public function Sample1 () 
    {
        // 既存の文字を書き換える例です
        // changeStrは今後削除する可能性が有ります。できるだけ利用を避けて下さい
        $this->excelr->workbook->changeStr('[顧客名]', 'ミッキー鼠');
        $this->excelr->workbook->changeStr('[管理番号]', 'CHAZUKE001');
        $this->excelr->workbook->changeStr('[備考]', 'これは、Reviserのテスト用サンプルです');

        // 空白セルに文字を追加する例です
        $this->excelr->workbook->addString(0,18,0, 'サンバイザー');
        $this->excelr->workbook->addString(0,19,0, 'ミニーとのデート券');

        // 空白セルに数値を追加する例です
        $this->excelr->workbook->addNumber(0,18,2, 2980);
        $this->excelr->workbook->addNumber(0,18,3, 2);
        $this->excelr->workbook->addNumber(0,19,2, 20000);
        $this->excelr->workbook->addNumber(0,19,3, 1);

        // 日時も数値として追加します。UNIXタイムは事前にMSタイムに変更します
        $mst=strtotime("2006-11-23 11:27:35");  // UNIXタイムを取得
        $this->excelr->workbook->addNumber(0,45,0, unixtime2ms($mst));

        // シート名を書き換える例です
        $this->excelr->workbook->setSheetname(0,'ミッキー様');

        // フッターを書き換える例です
        // ヘッダー/フッター用のコマンド(&C &R 等)を入れることができます
        $this->excelr->workbook->setFooter(0,'&CExcel_Reviser Ver0.10beta');

        // ヘッダーを書き換える例です
        $this->excelr->workbook->setHeader(0,'&CExcel_Reviser &Rベータ版');

        // セルにハイパーリンクを追加する例です。
        $this->excelr->workbook->addHLink(0,48,0,'リンクテスト','http://chazuke.com/');

        // シートを削除する例です。
        $this->excelr->workbook->rmSheet(1);

        // セルを削除する例です。
        $this->excelr->workbook->rmCell(0,46,2);

        // 入力出力ファイル名の設定
        $readfile=BASEPATH.'application/controllers//template/sample1_bill.xls'; // テンプレートファイルの指定
        $outfile="test.xls";           // 出力するファイル名です

        // 最後に書換えを実行します
        $this->excelr->workbook->reviseFile($readfile,$outfile);

    }

    public function Sample2()
    {
        // データベースからの読込みの代用です。配列 $access[月][日]に1日毎の数を入れます
        // 本来はデータベースから読み込みます
        $access[]=array(526,685,715,825,966,125,256,312,255,22,1022,666,251,245,256,333,
                           99,125,321,432,555,235,265,222,555,223,235,256,258,299,301);
        $access[]=array(222,323,123,44,99,87,55,23,16,5,15,67,88,76,97,44,
                           99,123,134,152,155,135,165,122,255,123,135,156);
        $access[]=array(226,385,315,325,466,225,356,212,355,122,722,666,551,445,356,233,
                           199,225,321,432,445,335,365,322,455,323,135,256,358,199,201);
        $access[]=array(326,385,315,325,366,225,356,212,355,222,222,366,351,345,356,233,
                           299,125,421,432,255,335,365,322,455,423,335,356,358,199);
        // $access[]=array(326,385,315,325,366,225,356,212,355,222,222,366);

        // バージョン依存のメソッドが有る為、includeしたReviserの
        // バージョンを事前チェックします
        if (!defined('Reviser_Version')) die('"reviser.php" is not included.');
        if (!defined('Version_Num')) die('unknown Excel_Revise\'s version');
        if (Version_Num < 0.20 )
                die('Excel_Revise\'s version is not match.');

        // もしも、EUC-JP以外の文字コードを使用している場合は
        // 最初に文字コードの設定を変更しておきます
        // 変更した場合は、このファイルもその文字コードで保存し直しが必要です
        // $reviser->setInternalCharset('utf-8');

        // このサンプルでは、追加したシート内にはグラフオブジェクトが有り
        // それぞれ同じシート内のセルを参照しているため参照先変更を有効にします
        // ちなみに、 この値を 0 にすると各シートのグラフはすべて元(最初の)シート
        // のセルを参照します。試してみてください
        $this->excelr->workbook->setOptionRef3d(1);


        // シートの不足分を追加します
        $this->excelr->workbook->addSheet(0,count($access)-1);

        $total=0;

        // 各シートに必要なデータとシート名を書き込みます
        foreach($access as $mkey=>$mval){
            $this->excelr->workbook->addNumber($mkey,4,4,$total);
            $this->excelr->workbook->setSheetname($mkey,"".($mkey+1)."月のアクセス");
            $this->excelr->workbook->setHeader($mkey,'&CExcel_Reviser &RaddSheet Sample '.$mkey);
            foreach($mval as $dkey=>$dval){
                $this->excelr->workbook->addNumber($mkey,$dkey+3,2,$dval);
                $total+=$dval;
            }
        }

        // 入力出力ファイル名の設定
        $readfile=BASEPATH.'application/controllers/excel/template/sample2_addsheet.xls'; // テンプレートファイルの指定
        $outfile="addsheet.xls";    // WEBから出力するファイル名です

        // 最後に書換えを実行します
        $this->excelr->workbook->reviseFile($readfile,$outfile);
    }
}

ビュー



Excelサンプル



Excelサンプル

Excel出力サンプル1

Excel出力サンプル2

カテゴリー: CodeIgniter