エクセルをデータベースとするWebアプリって

小さいWebアプリのデータストレージとしてはSQLiteも簡単な選択肢としてはいいですが、扱うデータを編集する必要があるので管理ツールを作成する必要があります。小さいアプリ程、管理ツールを作るのって面倒です。

最近は「そこでrailsですよ」という流れになるんでしょうが、エクセルをデータベースとして扱うようにしてみます。データの編集方法は、エクセルで編集して一括アップロードのみにしてしまいますw


エクセルを読みこむperlのライブラリはいくつかあるようでした。

  • Spreadsheet::ParseExcel
  • Spreadsheet::Read
  • Spreadsheet::BasicRead
  • Spreadsheet::BasicReadNamedCol

どれがいいんでしょうか。比較してくれてるひといないかな?


Spreadsheet::ParseExcelを試してみたら、予想より簡単だった。

以下、エクセルの表を読んで、perlのhashに詰め込むクラス。

package Item;
use strict;
use warnings;
use Encode;
use Spreadsheet::ParseExcel;
my @DATA_FILES = qw(excel.xls);
my @FIELD_LIST = qw(id staff name type category description
                  img1 img1_description img2 img2_description
                  img3 img3_description price size);
sub new {
my ($class, %opt) = @_;
my $self = {items => _parse_item($opt{dir})};
return bless $self, $class;
}
sub _parse_item {
my $data_dir = shift;
my $excel = new Spreadsheet::ParseExcel;
my @items = ();
foreach my $file (@DATA_FILES) {
my $book = $excel->Parse("$data_dir/$file") or die "cannot parse excel file. $@";
my $sheet = $book->{Worksheet}[0];
FILE: for (my $row = $sheet->{MinRow}; defined $sheet->{MaxRow} && $row <= $sheet->{MaxRow}; $row++) {
#1行目は無視する。
next FILE if $sheet->{Cells}[$row][0]->Value eq 'ID';
#END_OF_DATAの行で終了する。
last FILE if $sheet->{Cells}[$row][0]->Value eq 'END_OF_DATA';
my $item = {};
for (my $i = 0; $i < $#FIELD_LIST; $i++) {
my $col = $sheet->{Cells}[$row][$i];
$item->{$FIELD_LIST[$i]} = encode_utf8($col->Value) if $col;
}
push @items, $item;
}
}
return \@items;
}
1;

Spreadsheet::ParseExcelでよさそうです。そのまま続けてみます。

2件のコメント

  • DBD::Excel は如何でしょうか

  • likkさん、コメントありがとうございます。
    DBI系は盲点でした。
    たしかに、DBI経由でアクセスできた方が汎用的ですね。
    http://search.cpan.org/dist/DBD-Excel/Excel.pm
    ↑によると、DBD::Excelは、読みにSpreadsheet::ParseExcel、書きにSpreadsheet::WriteExcelを使用しているようでした。
    読みの実装としては、Spreadsheet::ParseExcelがデファクトスタンダードなんですかね?

    DBD::Excel経由ならカラム番号ではなくカラム名でアクセスできそうだし、DBD::Excelを使うメリットは大きそうなので試してみます。

コメントする

メールアドレスが公開されることはありません。 が付いている欄は必須項目です


The reCAPTCHA verification period has expired. Please reload the page.

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください