PHP開発で使ったライブラリ

  • Excelファイル読み込み

Excel_Peruser
http://chazuke.com/forum/

Excel_Reviserを作った方が作った、Excelファイルのデータを読み込むライブラリです。
割とシンプルなファイル向けのようです。(画像を山ほど貼ったりしたらメモリオーバーになりました。)
こんな感じで。

  <input type="file" name="importfile111" />


require_once('../tools/Excel_Peruser/peruser.php');

(中略)

$file = $_FILES['importfile111'];
$tmpfile = $file['tmp_name'];
$peruser = new Excel_Peruser();
$peruser->setInternalCharset($charset='utf-8');
$peruser->setErrorHandling(1);
$result = $peruser->fileread($tmpfile);
if ($peruser->isError($result)) $errmes=$result->getMessage();
for ($row = 1; $row < $rowcnt; $row++) {
$col = $this->GetExcelColNo('A');
$wk = $peruser->dispcell($sn, $row, $col, $mode=0);
}

ファイルの形式だとかサイズだとかのチェックは適当にお願いします。
Excel_Reviserと一緒に使う場合は「ErrMess」というクラス名が重複してエラーになりますので、とりあえず、Excel_PeruserのErrMessをErrMess_peruser のように、重複しない名称に変更します。peruser.php内で「ErrMess」を使ってるところも全部併せて変更します。
(今回はExcel_Reviserをメインに使ってるので、Excel_Peruserの方の名称を変えましたが、どちらを変えてもよいようです。)
エクセルの列から列番号を取得する関数を作りました。(GetExcelColNo())
かっこよさとか美しさよりも、後で忘れてもなんとかなる!をテーマに作ってます。(すぐ忘れます。)
どっかに適当に記述します。

const _ALPHABET_CNT = 26;
const _ALPHABET = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
public function GetExcelColNo($colstr) {
$rtn = '';
if ($colstr != '') {
$len = strlen($colstr);
for ($i = 1; $i <= $len; $i++){
$wk = substr($colstr, -1 * $i, 1);
$wk = strtoupper($wk);
$pos = strpos(self::_ALPHABET, $wk);
if ($pos >= 0 and $pos < self::_ALPHABET_CNT) {
$rtn = $rtn + (($pos + 1) * pow(self::_ALPHABET_CNT, ($i-1)));
}
}
}
return $rtn;
}
アップロードしたExcelファイルの中身を取得してDBに登録、とかが簡単にできていい感じです。
csv形式で保存してもらってもいいんだけど、csv形式に保存する説明をするのが結構めんどいので、こっちで用意したExcelファイルにデータだけ入れてもらって、そのファイルを直接アップロードしてもらう方が手順も説明も簡単なのでいいと思います。
Excel_Peruserは、Excel2003形式用のライブラリなので2007形式のファイルは読み込めないようですが、まだまだOffice2003ユーザは残ってるからしばらくはこれでいいんじゃないかなーと思います。2007形式(.xlsx)で保存されると、Excel2003で読めないですもんね。(読めると思うけど、互換パックの説明とかめんどい。)(ひどい。)

  • メール送信

Qdmail
http://hal456.net/qdmail/
Qdsmtp
http://hal456.net/qdsmtp/

あっさりと送れました。添付ファイルとかあるとまた違うのかもしれないですけど。


require_once('../tools/qdmail/qdmail.php');
require_once('../tools/qdmail/qdsmtp.php');

(中略)

$qdmail = & new Qdmail();
$qdmail->smtp(true);
$param = array(
'host'=>'smtp.example.com', // メールサーバー
'port'=> 587, // これはSMTPAuthの例。認証が必要ないなら25でOK。
'from'=>'from@example.com', // Return-path: になります。
'protocol'=>'SMTP_AUTH', // 認証が必要ないなら、'SMTP'
'user'=>'userid@example.com', // SMTPサーバーのユーザーID
'pass' => 'pass999', // SMTPサーバーの認証パスワード
);
$qdmail->smtpServer($param);
$qdmail->errorDisplay(false);
$qdmail->smtpObject()->errorDisplay = false;
$qdmail->smtpLoglevelLink(true);
$qdmail->logPath(LOGS);
$qdmail->logFileName("mail.log");
$qdmail->errorlogPath(LOGS);
$qdmail->errorlogFilename("error_mail.log");

$qdmail->to('test@test.com', 'テストさん'); // あて先
$qdmail->from('info@test.com'); // 送信元
$qdmail->bcc('mymail@test.com'); // BCCで送る場合に設定

$subject = 'テスト';
$qdmail->subject($subject); // 題名
$text = 'テストですよー。';
$qdmail->text($text); // 本文

$rtn = $qdmail->send(); // メールを送信

  • PDFファイル作成

tcpdf
http://www.fpdf.org

PDFファイルを作成するライブラリです。
私が使ってるのはバージョン 5.9.029 ですが、日本語も特に化けることなくすんなり使えました。


require_once('../tools/tcpdf/config/lang/eng.php');
require_once('../tools/tcpdf/tcpdf.php');

const FONT_GOTHIC = 'kozgopromedium';
const FONT_MINCHO = 'kozminproregular';

(中略)

$pdf = new TCPDF($orientation='P', $unit='mm', $format='A4', $unicode=true, $encoding='UTF-8', $diskcache=false);

$pdf->SetTitle($title);

$pdf->SetDefaultMonospacedFont(PDF_FONT_MONOSPACED);
$language = array('a_meta_charset' => 'UTF-8', 'a_meta_dir' => 'ltr', 'a_meta_language' => 'ja', 'w_page' => 'ページ : ');
$pdf->setLanguageArray($language);

$pdf->SetMargins($marginleft=20, $margintop=30, $marginright=20);
$pdf->SetHeaderMargin(15);
$pdf->SetFooterMargin(15);

$pdf->SetAutoPageBreak(TRUE, PDF_MARGIN_BOTTOM);
$pdf->setImageScale(PDF_IMAGE_SCALE_RATIO);

$pdf->setHeaderFont(Array(self::FONT_GOTHIC, '', 11));
$pdf->setFooterFont(Array(self::FONT_GOTHIC, '', 10));

$pdf->setHeaderData($logo='', $logowidth=0, $headertitle='', $headerstring=$title);
$pdf->setPrintHeader(true);
$pdf->setPrintFooter($withpage);

$this->pdf->AddPage();

$this->pdf->SetFont(self::FONT_GOTHIC, '', 12);

$txt = 'テストです!';
$this->pdf->Write($h=0, $txt, $link='', $fill=0, $align='L', $ln=true, $stretch=0, $firstline=false, $firstblock=false, $maxh=0);
$this->pdf->Ln(3);

$txt = 'テストですよ!';
$this->pdf->Write($h=0, $txt, $link='', $fill=0, $align='L', $ln=true, $stretch=0, $firstline=false, $firstblock=false, $maxh=0);

$filename = 'test.pdf';
$this->pdf->Output($filename, 'D');

ちなみに、Output() の第2引数は
I : ブラウザに出力する(既定)、保存時のファイル名が$nameで指定した名前になる。
D : ブラウザで(強制的に)ダウンロードする。
F : ローカルファイルとして保存する。
S : PDFドキュメントの内容を文字列として出力する。
だそうです。

ちなみに日本語ファイル名でファイル出力したい場合は、こんな感じにしないとブラウザによっては化けまくりです。
(プログラムの文字コードUTF-8です。)


$charset_pg = 'UTF-8'; // PGはUTF-8
$charset = 'UTF-8'; // 基本はUTF-8
$ua = $_SERVER['HTTP_USER_AGENT'];
if (strstr($ua, 'MSIE') && !strstr($ua, 'Opera')) {
// IE(オペラの仮装でない)はSJISにしないと化ける
$charset = 'SJIS-win';
}
if ($charset != $charset_pg) {
$filename = mb_convert_encoding($filename, $charset, $charset_pg);
}