【spout】PHPでcsvやExcelファイルを扱う

公開:2021年02月02日

こんにちは、新人エンジニアのスズキです。

phpでcsvやxlsxを扱いたいときはありませんか?

今回はおすすめのライブラリ、spoutを紹介します。

spoutとは

spoutは、phpでcsvやxlsxを扱うためのオープンソースライブラリです。

box/spout

メモリの消費が少なく、シンプルかつ軽量な動作が特徴です。

spoutの準備

spoutには、

  • PHP7.1以上
  • composer
  • PHP拡張(php-zip, php-xmlreader)

が必要です。

順番に進めていきましょう。

# phpのインストール
apt install -y php

# composeのインストール
php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"

php -r "if (hash_file('sha384', 'composer-setup.php') === '756890a4488ce9024fc62c56153228907f1545c228516cbf63f885e036d37e9a59d27d63f46af1d4d07ee0f76181c7d3') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;"

php composer-setup.php

php -r "unlink('composer-setup.php');"

# php拡張のインストール
apt install -y php-zip php-xmlreader

# spoutのインストール
composer require "box/spout"

引用元: Composer Command-line installation

引用元: spout Installation

使用例「csvファイルからxlsxファイルへの変換」

spoutライブラリの使用例として、「csvファイルからxlsxファイルへの変換」を紹介します。

csvファイルとxlsxファイルはExcelで開くとほとんど同じように見えます。

しかし、csvファイルは「コンマ区切りのテキストファイル」であるのに対して、xlsxファイルは「圧縮されたxmlファイル群」です。

このように全くの別物の2つのファイルですが、spoutを使えば簡単に変換することができます。

今回は、

  1. 空のxlsxファイルを作成
  2. csvファイルを1行読み込み、配列に格納
  3. 配列から、xlsxファイルに1行書き出す
  4. csvファイルの最終行まで繰り返す

の手順で中身の同じxlsxファイルを作成し、変換を行います。

use Box\spout\Reader\Common\Creator\ReaderEntityFactory;
use Box\spout\Writer\Common\Creator\WriterEntityFactory;

function csv_to_xlsx($csv_path, $xlsx_path)
{
    $csv_reader = ReaderEntityFactory::createCSVReader();
    $csv_reader->open($csv_path);

    // 空のxlsxファイルを作成
    $xlsx_writer = WriterEntityFactory::createXLSXWriter();
    $xlsx_writer->openToFile($xlsx_path);

    // csvファイルから1シート読み込み
    foreach ($csv_reader->getSheetIterator() as $sheet) {
        // 1シートから1行読み込み
        foreach ($sheet->getRowIterator() as $row) {
            $array = [];

            // 1行から1セル読み込み
            foreach ($row->getCells() as $cell) {
                // 配列に格納
                $array[] = $cell;
            }

            // 配列のデータを格納した1行を作成
            $create_row = WriterEntityFactory::createRow($array);
            
            // xlsxに1行を追加
            $xlsx_writer->addRow($create_row);
        }
    }

    $csv_reader->close();
    $xlsx_writer->close();
}

さいごに

spoutライブラリは、

  • 非常に少ないメモリ消費
  • 軽量かつシンプルな動作

が特徴です。

大きいサイズのファイルでも簡単に扱うことができます。

phpでcsvファイルやxlsxファイルを扱う際には、ぜひ検討してみてはいかがでしょうか。

この記事が気に入ったら
いいね ! しよう

Twitter でフォームズのブログを
フォーム作成クラウドサービス「Formzu(フォームズ)」を運営しているフォームズ株式会社です。
オフィスで働く方、ホームページを運営されている皆様へ
仕事の効率化、ビジネススキル、ITノウハウなど役立つ情報をお届けします。
  • 【初めての方へ】メールフォームについて