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