仕事でExcelのデータを読み書きできるPHPのライブラリ、PHPExcelを触っていた時、「そういえばこのPHPExcelとMovable TypeのData APIを組み合わせて使えば、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を走らせると、下記のような画面出力になり、データが登録できたことが分かります。
MTの管理画面で記事一覧を表示させると、下記のようにExcelのデータ6件が登録されています。
編集画面を確認すると、カスタムフィールドのデータも正しく登録されています。
まとめ
このように、簡単なPHPのコードを書くだけでExcelのデータが登録できました。
今回はきれいな表形式のExcelデータを登録しましたが、きれいな表形式になっていなくても、一定の規則に従ってデータが書かれていれば、複数行から構成されるデータでもPHPとPHPExcelを駆使することでなんとかできます。また、英数字を半角にして登録するなど、データを整形しながら登録することも可能です。
データをExcelにエクスポートすることも可能
MTのData APIとPHPExcelを利用すれば、MTからデータを取得してExcelのワークシートに登録することもできます。$objPHPExcel->getActiveSheet()->SetCellValue('[セルの番地]', [セルに書き込むデータ]);
のようなコードで、A1やB2のようにセルを指定して書き込みができるので、既存のフォーマットにデータを落とし込むこともできます。業務資料の作成などに応用できそうですね。
業務では何かとExcelが登場する場面があるので、案件で使ってみたいと思います。