エクセルをデータベースとするWebアプリって
2007/05/01
小さい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でよさそうです。そのまま続けてみます。
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を使うメリットは大きそうなので試してみます。