<head><script type="text/javascript" src="/blog/scripts/shCore.js"></script><script type="text/javascript" src="/blog/scripts/shLegacy.js"></script><script type="text/javascript" src="/blog/scripts/shAutoloader.js"></script><script type="text/javascript" src="/blog/scripts/shBrushXml.js"></script><script type="text/javascript" src="/blog/scripts/shBrushCss.js"></script><script type="text/javascript" src="/blog/scripts/shBrushJScript.js"></script><script type="text/javascript" src="/blog/scripts/shBrushPerl.js"></script><script type="text/javascript" src="/blog/scripts/shBrushPhp.js"></script><script type="text/javascript" src="/blog/scripts/shBrushPython.js"></script><script type="text/javascript" src="/blog/scripts/shBrushRuby.js"></script><script type="text/javascript" src="/blog/scripts/shBrushPowerShell.js"></script><script type="text/javascript" src="/blog/scripts/shBrushBash.js"></script><script type="text/javascript" src="/blog/scripts/shBrushSql.js"></script><script type="text/javascript" src="/blog/scripts/shBrushVb.js"></script><script type="text/javascript" src="/blog/scripts/shBrushPlain.js"></script><link type="text/css" rel="stylesheet" href="/blog/styles/shCore.css"/><link type="text/css" rel="stylesheet" href="/blog/styles/shCoreDefault.css"/><script type="text/javascript">SyntaxHighlighter.config.tagName = "code";SyntaxHighlighter.config.stripBrs=true;SyntaxHighlighter.config.bloggerMode=true;SyntaxHighlighter.all();</script></head>
只今、某所から業務構築の話をもらっています。
簡単に言うと、発注データ、納品データ、出荷データをCSVとしてデータ管理するというものです。
インプットがCSVの生データだけではなく、ExcelやPDFも対象とします。
おそらくLAMP(PはPHPね)環境だと思われるので、PHPでExcelとPDFが処理できるかを試してみました。
PHPのExcelのモジュールとしてPHPExcelを試してみました。
試した環境は以下の通りです。
Linux:CentOS release 5.4 (Final)
Apache:Apache/2.2.22
MySQL:14.12
PHP:5.3.14
PHPExcelというモジュールがあったので、それようにPHPをリコンパイルしました。
# =========================
# phpコンフィグレーション
# =========================
./configure \
--with-apxs2=/usr/local/apache2/bin/apxs \
--with-mysql \
--enable-sqlite-utf8 \
--with-sqlite \
--enable-mbstring \
--enable-calendar \
--enable-zend-multibyte \
--with-oci8=shared,instantclient,/usr/local/lib/instantclient_11_2,11.2.0 \
--with-pdo-oci=shared,instantclient,/usr/local/lib/instantclient_11_2,11.2.0 \
--with-curl \
--enable-zip \
--with-gd \
--with-jpeg-dir \
--with-freetype-dir \
--with-png-dir \
--with-xpm-dir
PHPはPHPExcelで決まりですね。
Excel_Reviserというのもありましたが、動作しませんでした。
業務の仕様としては、Excelのバージョンは2000(拡張子がxls)~2010(拡張子がxlsx)ということで、
PHPExcelは意外と大丈夫でした。
# ====================
# PHPExcelのサンプル
# 参考:PHPExcelでExcel2000/XP形式のファイルをつくる
# ====================
require_once 'PHPExcel.php';
require_once 'PHPExcel/Writer/Excel5.php';
# Excelオブジェクト生成
$excel = new PHPExcel();
$excel->setActiveSheetIndex(0);
# セルの内容を変更
function setExcelData(&$sheet, $col, $row, $data)
{
$sheet->setCellValue($col.$row, $data);
$sheet->getColumnDimension($col)->setAutoSize(true);
$style = $sheet->getStyle($col.$row);
$style->getFont()->setName('MS Gothic');
$style->getBorders()->getRight()->setBorderStyle(PHPExcel_Style_Border::BORDER_THIN);
$style->getBorders()->getLeft()->setBorderStyle(PHPExcel_Style_Border::BORDER_THIN);
$style->getBorders()->getTop()->setBorderStyle(PHPExcel_Style_Border::BORDER_THIN);
$style->getBorders()->getBottom()->setBorderStyle(PHPExcel_Style_Border::BORDER_THIN);
$style->getFill()->getStartColor()->setARGB('FF808080');
}
# 現在のシートを取得し、シート名を変更する(オリジナル)
$excel->getActiveSheet()->setTitle('これはテストです(-∀-)');
$sheet = $excel->getActiveSheet();
$row = 1;
setExcelData($sheet, 'A', $row, '名前');
setExcelData($sheet, 'B', $row, 'フリガナ');
$row++;
setExcelData($sheet, 'A', $row, '鈴木一郎');
setExcelData($sheet, 'B', $row, 'スズキイチロウ');
$row++;
setExcelData($sheet, 'A', $row, '田中太郎');
setExcelData($sheet, 'B', $row, 'タナカタロウ');
# 保存先定義
$savefile = 'list_'.date('Ymd').'.xls';
$savepath = '/tmp/';
# Excel2007より前の形式で保存する
$writer = new PHPExcel_Writer_Excel5($excel);
$writer->save($savepath.$savefile);
# ダウンロード
header("Content-Type: application/vnd.ms-excel");
header("Content-Disposition: attachment; filename=${savefile}");
header("Content-Length: ".filesize($savepath.$savefile));
# 出力
readfile($savepath.$savefile);
exit;
PDFはというと、PHPのモジュールとしては見つけることができませんでした。
いろいろと探した挙句、xpdfにたどり着きました。
とはいえ、pdftocsvなどはないので、pdftotextで代用するしかなく、コマンドラインでCSVの抽出ということになりそうです。
Xpdfのサイトはこちらです。
実験はこんなんで。
# =========================
# PDFTOTEXTのサンプル
# =========================
| Trackback ( )
|
|
|