[php]PHPExcelの使い方

WEB

データベースで云々してたらExcelで書き出せるようにしろとか来たので。

環境

  • データベースバージョン5.6
  • PHPExcel1.8.0

ダウンロード

PHPExcel
右の「download」から。
PHPExcel   Home
「PHPExcel_1.8.0_doc.zip」が落ちてきた。

サーバーにアップロード

zipファイルを解答すると中身はこんな感じ。
無題
「Classes」フォルダをまるっと使う。
例えば今回は「excel」ってフォルダを作ってその中に入れる。
無題
上の画像で言うと「excel_create.php」がジェネレーターになる。
「Classes」は地味にファイルがいっぱい入ってるので、作業する前にサーバーに上げとくのがいいと思う。

Excelを生成する

PHPExcelを読み込む

set_include_path(get_include_path() . PATH_SEPARATOR . '/path/to/Classes/');
include 'Classes/PHPExcel.php';
include 'Classes/PHPExcel/IOFactory.php';

PHPExcelの設置場所により2行目3行目をいじる。

フォーマットを設定する

$excel = new PHPExcel();

// シートの設定
$excel->setActiveSheetIndex(0);
$sheet = $excel->getActiveSheet();
$sheet->setTitle('シート名');

/* ↓土台↓ */

//文字指定
$sheet->getDefaultStyle()->getFont()->setName( 'MS Pゴシック' )->setSize( 9 );

//セルの幅
$sheet->getColumnDimension( 'A' )->setWidth( 20 );

//水平位置 左詰め
$sheet->getStyle( 'B12:B21' )->getAlignment()->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_LEFT);

//水平位置 右詰め
$sheet->getStyle( 'A1:A24' )->getAlignment()->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_RIGHT);

//水平位置 中央寄せ
$sheet->getStyle( 'B1:B8' )->getAlignment()->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_CENTER);

//垂直方向 上詰め
$sheet->getStyle('B24')->getAlignment()->setVertical(PHPExcel_Style_Alignment::VERTICAL_TOP);

//セルの結合
$sheet->mergeCells('B24:H26');

//罫線 追加
$sheet->getStyle( 'B1:B3' )->getBorders()->getAllBorders()->setBorderStyle( PHPExcel_Style_Border::BORDER_THIN );

//罫線 削除
$sheet->getStyleByColumnAndRow(1, 13)->getBorders()->getBottom()->setBorderStyle(PHPExcel_Style_Border::BORDER_NONE);

//太字
$sheet->getStyle('E10')->getFont()->setBold(true);

//背景色
$sheet->getStyleByColumnAndRow(1, 2)->getFill()->setFillType(PHPExcel_Style_Fill::FILL_SOLID);
$sheet->getStyleByColumnAndRow(1, 2)->getFill()->getStartColor()->setRGB('FFFF00');

//表示形式
$sheet->getStyleByColumnAndRow(5,8)->getNumberFormat()->setFormatCode('"\"#,##0');

/* ↑土台↑ */

基本的に使うのはだいたいこの辺りか。

「A1」みたいに普通にカラムを指定する場合と
「0, 1」みたいに数字だけで指定する場合がある。
ちゃんと調べてないけどバージョンの云々でそうなってんのかな。
数字の場合、「A1」は「0,1」、「B1」は「1,1」、「D5」は「3,5」になる。
なんで「A1」が「0,0」もしくは「1,1」じゃないんだろうね。

複数のカラムをまたいでその外側に罫線を引く場合は、
一旦該当カラム全部に線を引いて、
いらないところを削ったほうが楽かもしれない。
その時は、カラムとカラムの間には両カラムの線が入ってる状態なので、
例えばA1とB1の間の線を消したい場合、A1の右とB1の左を削る。

セルを結合した場合、例えば「A1:C4」で作ったとして、
罫線を引く時は「A1:C4」で指定する。
「A1」で引くと「A1」部分にしか線は引かれない。
でもテキストを入れるときは「A1」でいい。

セルはデフォルトで下位置左詰めなので、
都合に合わせて設定してあげないと不細工になりかねないので注意。

文字情報を記入する

// セルに値を入れる
$sheet->setCellValue('A1', 'ああああ');

これが基本形。

$con = mysql_connect('******', '******', '******');
if (!$con) {
exit('データベースに接続できませんでした。');
}

$result = mysql_query('SET NAMES utf8', $con);
if (!$result) {
exit('文字コードを指定できませんでした。');
}

$result = mysql_select_db('******', $con);
if (!$result) {
exit('データベースを選択できませんでした。');
}

//テーブル選択
$sth = mysql_query ( "SELECT * FROM 【tablename】
WHERE 【id】='{$_REQUEST['id']}'", $con );
$row = mysql_fetch_assoc( $sth );

//変数
$aaa = $row['aaa'];
$bbb = explode("/", $row['bbb']);

//セルに挿入する
if(!empty($aaa)){
$sheet->setCellValue('F1', $aaa.'様'.);
}
if(!empty($bbb)){
$sheet->setCellValue('F2', $bbb[1]);
}

データベースから引っ張ってきて、データが入ってたら書き出すみたいな。
「bbb」は「***/***/***」みたいな感じでモノが入ってて、分割したい時の例。
テーブル選択のところは、実用性考えたら「excel/excel_create.php?id=***」みたいな感じで別ページから飛んでくるようにする時用。

出力形式とかファイル名を付ける

$date = date('YmdHis');
$filename = "create/excel_$date.xlsx";

// Excel2007 形式で出力
$writer = PHPExcel_IOFactory::createWriter($excel, 'Excel2007');
$writer->save($filename);

出力するっていうのはサーバーにエクセルデータが保存されること。
名前に日付を付けたら上書きされないのでいいかなと思ってつけてる。
ついでにファイルが混ざっちゃうと後々面倒なので、「create」ってフォルダに保存されるように指定。

ダウンロードのリンクを付ける

<a href="<?php echo $filename ?>">DOWNLOAD</a>

作る度に名前が変わるので、ファイルを変数化しておくととても便利。

まとめ

難易度的には何ら問題ないんだけど、手間が半端じゃない。
項目ズレとか超だるい。
一旦エクセルで完成形を作ってから、そこから地道にやっていこう。

コメント

タイトルとURLをコピーしました