PHPExcelというライブラリーで方眼紙を作成したお話(Mac)
先日、PHPでExcelの方眼紙作って画像ごにょごにょしてよとの依頼が入ったので
ごにょごにょしました。
方眼紙だと!?
Excelの使い方が若干違うのでは。。。と思ってしまいますが、
日本を支えるExcel職人の為にやりましょう!!
Excel方眼紙作成のまとめです。
使ったライブラリはこれphpexcel.codeplex.com
PHPでExcelしちゃうLibraryです。
使い方は簡単で
<?php require '/PATH/PHPExcel.php'; $PHPExcel= new PHPExcel(); //一番最初のsheetを取得 $sheet = $PHPExcel->setActiveSheetIndex(0); //A列のサイズを50 $sheet->getColumnDimension('A')->setWidth(50); //1行目をサイズ50 $sheet->getRowDimension(1)->setRowHeight(50); //出力 $Writer = PHPExcel_IOFactory::createWriter($PHPExcel, 'Excel5'); $Writer->save('php://output');
こんな感じで簡単に使えます。
動作要件
- PHP 5.4以上
- PHPExcel 1.8.0
実際に方眼紙を作ってみた
問題の方眼紙についてなんですが、問題が4つありました
- 横のセルは'A'等の文字列で指定する必要がある。
- セルの縦横指定のメソッドはPixcel指定ではない。
- 横幅に至っては意味不明なサイズ(em)になる。
- 画像の縦横比が変わらない。setResizeProportionalメソッドにFALSE指定しても変わらない。
試行錯誤の末の暫定的な結果の解決方法
横のセルは'A'等の文字列で指定する必要がある。
セル名の問題はドキュメントを読むと「PHPExcel_Cell::stringFromColumnIndex」というメソッドがあるのでコレを使う。
気をつけたいのが、列の番号が「0」から始まります。
なので「PHPExcel_Cell::stringFromColumnIndex(0)」で「A」になります。
1を指定すると「B」になります。
セルの縦横指定のメソッドはPixcel指定ではない。
正直どうしようもないので、Pixcel指定っぽい閾値をさがす。
横幅に至っては意味不明なサイズ(em)になる。
本当にどうしようもないのでそれっぽい閾値を探す。
方眼紙の閾値がコレです。
<?php require '/PATH/PHPExcel.php'; $PHPExcel= new PHPExcel(); //一番最初のsheet objectを取得 $sheet = $PHPExcel->setActiveSheetIndex(0); //方眼紙の横幅 $width = 20; //方眼紙の縦幅 $height = 20; $pixcel_size = 25; //1pixcelに対しての閾値 $cell_size = $pixcel_size - $pixcel_size * 0.234; $col_name = 'A'; for ( $i = 1; $i <= $width; $i++ ) { //横幅の文字サイズに対する閾値 $sheet->getColumnDimension($col_name)->setWidth($cell_size / 6); $col_name++: } for ( $i = 1; $i <= $height; $i++ ) { $sheet->getRowDimension($i)->setRowHeight($cell_size) } $Writer = PHPExcel_IOFactory::createWriter($PHPExcel, 'Excel5'); $Writer->save('php://output');
但しこのコードは正確なPixcelではないので気をつけてください。
0.234をpixcelに対してかけて引く。
横幅(デフォルトフォントサイズの場合)6で割る。
このコードで
25px 50px 75px 100px
の方眼紙の描画はできました。
画像の縦横比が変わらない。setResizeProportionalメソッドにFALSE指定しても変わらない。
これは、
「$Writer = PHPExcel_IOFactory::createWriter($PHPExcel, 'Excel5');」
ここが原因でした。
何故かは全くわかりませんがそういう仕様なのでしょう。
うん。きっと。
「$Writer = PHPExcel_IOFactory::createWriter($PHPExcel, 'Excel2007');」
と2007形式で指定してあげると縦横比を正しく解除してくれます。
Documentを読んで「setWidthAndHeightメソッド」で縦横比を指定しても「setWidthAndHeightメソッド」は中を読む限り、縦横比を設定している時しか使えなさそうです。
画像のpixelもズレるので閾値を設定して解決しました。
無いとは思いますが、PHPでExcel方眼紙を作ってくれという場合に是非ご活用ください。(笑)