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

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

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


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

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

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


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

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

packageItem;use strict;use warnings;useEncode;useSpreadsheet::ParseExcel;my @DATA_FILES = qw(excel.xls);my @FIELD_LIST = qw(id staff name type category descriptionimg1 img1_description img2 img2_descriptionimg3 img3_description price size);subnew{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を使うメリットは大きそうなので試してみます。

コメントする

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


reCaptcha の認証期間が終了しました。ページを再読み込みしてください。

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