2015.04.23
Bruce Guetzkow 著

PHPExcelでDB2データからExcelスプレッドシートを作成する

注: この記事に記載のコードはここからダウンロードできます。

より詳細な分析のために、多くのユーザーがレポートから手作業でスプレッドシートに入力しているのは驚きです。PHPExcel というツールを使用して、ユーザーの代わりに直接スプレッドシートに書き込むことができます。ここでは、PHPExcel を使用して、DB2 から簡単なスプレッドシートをインストールして、作成するための手順をご紹介します。


はじめに

以下は Power Systems on IBM i で PHPExcel を使用するための要件です。

  • Zend Server がインストールされ、稼働している
  • PHPExcel をダウンロードし、インストールしている

この記事では Zend Server がすでにインストールされていることを前提としています。まだインストールしていない場合は、Zend Server Installation for IBM i のリンクをご覧になるか、検索エンジンを使用してください。ソフトウェアのバージョンを最新の状態にするのはもっともなのですが、最新版の Zend Server をインストールしておく必要はありません。(私の場合は、PHPExcel をバージョン 5.0.x の Zend Server で使用しました。)

PHPExcel のインストールは極めて簡単です。https://phpexcel.codeplex.com/ に移動して、ZIP ファイルを自分が選んだフォルダーにダウンロードし、好みのアーカイブ・ツールで解凍します。ZIP ファイルには、以下のフォルダーとファイルが入っています。

  • Classes--PHPExcel コードが入っています
  • Documentation--最新の資料すべてが入っています
  • Examples--PHPExcel の使用方法の例が入っています
  • changelog.txt--製品のすべてのアップデートのリストが入っています
  • install.txt--PHPExcel のインストール方法に関する指示が入っています (必ず一読のこと)
  • license.txt--ライセンス交付情報が入っています

「Classes」フォルダーを IFS にコピーします。このフォルダーは好きな場所に置いてかまいません。Web アプリケーションで PHPExcel を使用する場合、Web ルート・フォルダー下に入れておいたほうがよいでしょう。紹介する例はすべて、CL プログラムから PHP スクリプトを呼び出していますが、Web からも使用することができるように、Web ルート内にインストールしている状態をお見せします。

これだけです。これで PHPExcel を使用できるようになります。

最初のスクリプト

PHP スクリプトを始める前に、基本的なハウスキーピング・タスクをいくつか実行します。まず、PHPExcel で提供された関数を参照する必要があります。

// Require PHPExcel Classes
require_once '/www/zendsvr/htdocs/Classes/PHPExcel/PHPExcel.php';

次に、自分のスクリプトに渡したいパラメーターを取り出すことができます。この例では、「年」と「月」のパラメーターを取り出そうとしています。スクリプトがブラウザーの URL から呼び出されている場合、パラメーターは $_GET 配列から利用できます。スクリプトが CL プログラムから呼び出されている場合は、パラメーターは引数配列から利用できます (第 1 引数 $argv[0] は常に実行中のスクリプトの名前です):

// パラメーターを取得する
$year = ( $_GET['year'] ? $_GET['year'] : $argv[1] );
$month = ( $_GET['month'] ? $_GET['month'] : $argv[2] );

ハウスキーピングの最終ビットは IBM i データベースに接続するためのものです。

/データベースを設定する
$database = "SYSTEMNAME";
//*Blanks のユーザー名とパスワードを使用すると QTMHHTTP がデフォルトで使用される
$username = "";
$password = "";

//以下の行は db2 オプションを設定する。ライブラリー・リストは、複数のライブラリーをスペースで区切って表示できる
$options = array("i5_libl" => "LIBRARYA LIBRARYB", "i5_naming" => DB2_I5_NAMING_ON);
//db2 データベースに接続する
$conn = db2_connect($database, $username, $password, $options); if(!$conn)
{
    die("Connection Error");
}

これで PHPExcel を使用できるようになります。スプレッドシート・オブジェクトを作成し、どの属性でもかまいませんので、適切だと思う属性を割り当てます。ここでは詳しく説明しませんが、いくつか例を挙げます。

//PHPExcel オブジェクトおよび文書プロパティーを設定する
$objPHPExcel = new PHPExcel();
$title = 'My Report';
$objPHPExcel->getProperties()->setCreator("Bruce Guetzkow")
        ->setLastModifiedBy("Bruce Guetzkow")
        ->setTitle($title)
        ->setSubject($title)
        ->setDescription($title)
        ->setKeywords($title)
        ->setCategory("report");

書き込むアクティブなワークシートを設定する必要があります。いつもどおり、PHP は 0 を基準としたエレメントを使用しているため、最初のワークシートはエレメント 0 です。

//アクティブなシートの指標を設定する
$objPHPExcel->setActiveSheetIndex(0);

DB2 データを読み込む

データをいくつかスプレッドシートに追加してみましょう。「select」SQL ステートメントを変数にすることから始めます。

//SQL ステートメントを定義する
$sqlstmt ="select fielda, fieldb, fieldc
    from myfile
    where datayear = $year and datamonth = $month";

SQL ステートメントを準備する必要があります。

//SQL ステートメントを準備する
$stmt = db2_prepare($conn, $sqlstmt);
if(!$stmt)
{
    $error = db2_stmt_errormsg();
    die( "Error occured on prepare. " . $error);
}

これでステートメントを実行できるようになりました。

//SQL ステートメントを実行する
$result = db2_execute($stmt);
if(!$result)
{
    $error = db2_stmt_errormsg();
    die("Error occured on execute. " . $error);
}

PHPExcel は、SQL ステートメントで取り出した行全体を、ワンステップでスプレッドシートの行に読み込む簡単な方法を提供しています。個々にセルを読み込むこともできますが、これから始めるのが良いでしょう。

//データをスプレッドシートに読み込む
$currRow = 0;
while ($row = db2_fetch_array($stmt)) {
    $currRow++;
    $objPHPExcel->getActiveSheet()->fromArray($row, ' ', "A$currRow");
}
この時点で、スプレッドシートはまだ PHPExcel オブジェクト内にあります。今度はこれを IFS に書き込みます。

//スプレッドシートを書き込む
$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007');
$objWriter->save("/myfolder/mySpreadsheet.xlsx");

自分でやってみる

これで、スプレッドシートを開き、DB2 ファイルから抽出したデータの行を表示できるようになりました。もちろん、必要なものは、見出し、合計、公式、またはフォーマットではなく、データです。次回は、スプレッドシートをちょっと派手にするような属性をいくつか取り上げましょう。

すでにご想像どおり、前に抽出した Documentation フォルダーには、文書に一味添えるための指示が入っています。基本がわかっていれば、他の設定にもトライしてみて、さらに驚きを発見してみてください。

ページトップ

ボタン