PHPでExcelとCSVの読み込み速度を比較してみる

PHPで、Excelファイルの読み込みに時間がかかるので、
CSVファイルの場合とどれくらい違うのか比較してみる。


100x100マスのExcelファイルを用意し、
全てのセルの数値を合計するプログラムを書いて、
どれくらい時間がかかるか比べてみる。

検証用データ

sample.xlsx

1 2 100
2 3 101
100 101 199

sample.csv

上記のExcelファイルからCSVファイルを生成する。


検証用プログラム

Excelの場合

excel.php

<?php
$time = microtime(true);

// Excelの準備
$excel = new COM("excel.application") or die;
$excel->DisplayAlerts = 0;

// ファイルを開く
$file = $excel->Workbooks->Open(dirname(__FILE__) . "/sample.xlsx");

// 各セルの値を合計する
$count = 0;
foreach ($file->Worksheets as $sheet) {
  for ($rows = 1; $rows <= 100; $rows++) {
    for ($cols = 1; $cols <= 100; $cols++) {
      $count += (int)$sheet->Cells($rows, $cols)->Value;
    }
  }
}

// ファイルを閉じる
$file->Close();

// Excelを終了
$excel->Quit();

// 結果を表示
echo "合計=" . $count . "\n";
echo sprintf("%.4f秒", microtime(true) - $time);
CSVの場合

csv.php

<?php
$time = microtime(true);

// ファイルを開く
$file = fopen(dirname(__FILE__) . "/sample.csv", "r");

// 各セルの値を合計する
$count = 0;
while (($line = fgetcsv($file, 1000, ",")) !== false) {
  foreach ($line as $value) {
    $count += (int)$value;
  }
}

// ファイルを閉じる
fclose($file); 

// 結果を表示
echo "合計=" . $count . "\n";
echo sprintf("%.4f秒", microtime(true) - $time);

結果

Excelの場合
> php excel.php
合計=1000000
3.9025秒

> php excel.php
合計=1000000
3.9993秒

> php excel.php
合計=1000000
3.8887秒

> php excel.php
合計=1000000
3.9860秒

> php excel.php
合計=1000000
3.9707秒
CSVの場合
> php csv.php
合計=1000000
0.0081秒

> php csv.php
合計=1000000
0.0081秒

>php csv.php
合計=1000000
0.0080秒

>php csv.php
合計=1000000
0.0081秒

>php csv.php
合計=1000000
0.0080秒

まとめ

Excelファイルの読み込み 約3.9秒
CSVファイルの読み込み 約0.008秒


Excelファイルの読み込みは時間がかかる。