Movable TypeのData APIを利用してExcelのデータを一括インポートする

公開

仕事でExcelのデータを読み書きできるPHPのライブラリ、PHPExcelを触っていた時、「そういえばこのPHPExcelとMovable TypeのData APIを組み合わせて使えば、Excelのデータを一括インポートできるな」と思いました。そこで早速テストデータを用意して試してみました。

データはこのような感じです。
Excelのデータ例

コード(import_excel.php)は下記の通りです。データAPIでアクセストークンを取得するコード・エントリーを登録するコードは、Movable Type 6 本格活用ガイドブック (Web Designing BOOKS)のChapter03-04「PHPでData APIを操作する」を参考にしました。コードを全て掲載するのは憚られるので、アクセストークンを取得する所は省きます。

<?php
define("FILENAME", "宿泊施設一覧.xlsx");      // ファイル名
define("START_ROW", 2);                     // データの開始行
define("API_BASE_URL", "http://mt.cms.anothersky.pw/mt/mt-data-api.cgi/v2");    // API URL

mb_http_output("UTF-8");

// MTのアクセストークンを取得
include "./MTDataAPIAuth.php";
$accessToken = getAccessToken();

// Function: データ登録
function postData($postdata) {
    global $accessToken;

    $options = array("http" =>
        array(
            "method" => "POST",
            "header" => array(
                "X-MT-Authorization: MTAuth accessToken=" . $accessToken,
                "Content-Type: application/x-www-form-urlencoded"
            ),
            "content" => http_build_query($postdata)
        )
    );

    $response = file_get_contents(
        API_BASE_URL . "/sites/2/entries",
        false,
        stream_context_create($options)
    );

    return $response;
}

// Excelデータロード
ini_set("include_path", ini_get("include_path") . ":Classes/");
include "PHPExcel.php";

$objPHPExcel = PHPExcel_IOFactory::load(FILENAME);
$objPHPExcel->setActiveSheetIndex(0);
$objSheet = $objPHPExcel->getActiveSheet();

// 1行毎にデータを読み込む
foreach ($objSheet->getRowIterator() as $row) {
    if ($row->getRowIndex() < START_ROW) {
        continue;
    }

    $item = array();

    // セルのデータを読み込む
    foreach ($row->getCellIterator() as $cell) {
        $item[] = $cell->getValue();
    }

    // POSTするデータの組み立て
    $postdata = array(
        "entry" => json_encode(array(
            "title" => $item[1],
            "customFields" => array(
                array("basename" => "facilityid", "value" => $item[0]),
                array("basename" => "address1",   "value" => $item[2]),
                array("basename" => "telephone",  "value" => $item[3])
            )
        ))
    );

    // APIでデータを登録
    $response = postData($postdata);

    if (!$response) {
        echo $row->getRowIndex() . "行目のデータ登録失敗<br>";
    } else {
        // 本来ならここでさらにレスポンスを解析する必要あるはず。
        // 今回は簡易に書いた。
        echo $row->getRowIndex() . "行目のデータ登録成功<br>";
    }
}

echo "インポート完了。";

PHPを走らせると、下記のような画面出力になり、データが登録できたことが分かります。
import_excel.phpの動作結果

MTの管理画面で記事一覧を表示させると、下記のようにExcelのデータ6件が登録されています。
MTの記事一覧画面

編集画面を確認すると、カスタムフィールドのデータも正しく登録されています。
カスタムフィールドのデータ登録結果

まとめ

このように、簡単なPHPのコードを書くだけでExcelのデータが登録できました。

今回はきれいな表形式のExcelデータを登録しましたが、きれいな表形式になっていなくても、一定の規則に従ってデータが書かれていれば、複数行から構成されるデータでもPHPとPHPExcelを駆使することでなんとかできます。また、英数字を半角にして登録するなど、データを整形しながら登録することも可能です。

データをExcelにエクスポートすることも可能

MTのData APIとPHPExcelを利用すれば、MTからデータを取得してExcelのワークシートに登録することもできます。$objPHPExcel->getActiveSheet()->SetCellValue('[セルの番地]', [セルに書き込むデータ]);のようなコードで、A1やB2のようにセルを指定して書き込みができるので、既存のフォーマットにデータを落とし込むこともできます。業務資料の作成などに応用できそうですね。

業務では何かとExcelが登場する場面があるので、案件で使ってみたいと思います。