読者です 読者をやめる 読者になる 読者になる

PHPExcelというライブラリーで方眼紙を作成したお話(Mac)

PHP Excel

先日、PHPExcelの方眼紙作って画像ごにょごにょしてよとの依頼が入ったので
ごにょごにょしました。

方眼紙だと!?

Excelの使い方が若干違うのでは。。。と思ってしまいますが、
日本を支えるExcel職人の為にやりましょう!!

Excel方眼紙作成のまとめです。
使ったライブラリはこれphpexcel.codeplex.com


PHPExcelしちゃう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');

こんな感じで簡単に使えます。

動作要件

  1. PHP 5.4以上
  2. PHPExcel 1.8.0

実際に方眼紙を作ってみた


問題の方眼紙についてなんですが、問題が4つありました

  1. 横のセルは'A'等の文字列で指定する必要がある。
  2. セルの縦横指定のメソッドはPixcel指定ではない。
  3. 横幅に至っては意味不明なサイズ(em)になる。
  4. 画像の縦横比が変わらない。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もズレるので閾値を設定して解決しました。
無いとは思いますが、PHPExcel方眼紙を作ってくれという場合に是非ご活用ください。(笑)