namazu-ml(ring)


[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Excelの取り込み用ヘルパープログラム



倉部です。

広瀬さんの一言に調子に乗って、Excelの取り込用Helperを作りました。
まだ、十分テストできていませんが、公開します。

広瀬さんへ
 私信で書いた取り込範囲の判定は、属性UsedRangeでわかるようです。

PowerPoint版もあるのですが、TextFrameの切り出しがうまく行かない場合が
見つかりましたので、バグフィックスをしてから公開します。

------------- 以下 私のサンプル --------------
mknmzもWordの場合と同じように2ヶ所変更します。

mknmzを変更したところ
my $TARGET_FILE = '.*\.html?|.*\.txt|.*_default|.*\.doc|.*\.rtf'|.*\.xls
 #xlsを追加
my %HELPER_PROGRAMS = (
    'gz'  => 'zcat',
    'Z'   => 'zcat',
    'man' => 'groff -man -Tnippon',
    'doc' => 'perl.exe d:/usr/local/namazu/bin/ReadMSWord.pl', #doc を
追加
    'rtf' => 'perl.exe d:/usr/local/namazu/bin/ReadMSWord.pl',  #rtfを

追加
 'xls => 'perl.exe d:/usr/local/namazu/bin/ReadExcel.pl',  #xlsを
追加
);

------------ ReadExcel.pl ---------------------
# Created by Jun Kurabe
# 1999/11/01
use Win32::OLE;
use Win32::OLE::Enum;

package ReadExcel;

sub ReadExcel {
    my $fileName = shift;

    my $excel;
# Copy From Win32::OLE Sample Program
# use existing instance if Excel is already running
    eval {$excel = Win32::OLE->GetActiveObject('Excel.Application')};
    die "MSWord not installed" if $@;
    unless (defined $excel) {
 $excel = Win32::OLE->new('Excel.Application', sub {$_[0]->Quit;})
     or die "Oops, cannot start Word";
    }
# End of Copy From Win32::OLE Sample Program
    # for debug
#    $excel->{Visible} = 1;
    my $wb = $excel->{Workbooks}->open($fileName);
    $allText = '';
    $allText .= getProperties($wb);
    $allText .= getSheets($wb);
    $wb->close(0);
    undef $wb;
    undef $excel;

    return $allText;
}

sub getSheets{
    my $wb = shift;
    my $e = Win32::OLE::Enum->new($wb->Worksheets);
    my $allText = '';
    while(($obj = $e->Next)) {
 $allText .= getCells($obj);
 $allText .= getShapes($obj);
    }

    return $allText;
}

sub getProperties {
    my $wb = shift;
    my $allText = '';

    # get Title
    $title = $wb->BuiltInDocumentProperties(1)->{Value};
    $subject = $wb->BuiltInDocumentProperties(2)->{Value};
    $author = $wb->BuiltInDocumentProperties(3)->{Value};
    $lastAuthor = $wb->BuiltInDocumentProperties(7)->{Value};
    $createDate = $wb->BuiltInDocumentProperties(11)->{Value};
    $editDate = $wb->BuiltInDocumentProperties(13)->{Value};

    $allText .= 'Subject: ' . $title . ' ' . $subjext ;
    $allText .= "\n";
    $allText .= 'From: ' . $author . ',' . $lastAuthor;
    $allText .= "\n";
    $allText .= 'Date: ' . $createDate;
    $allText .= "\n";
    $allText .= "\n";

    return $allText;
}

sub getCells {
    my $sheet = shift;
    my $ur = $sheet->{UsedRange};
    my $e_cells = Win32::OLE::Enum->new($ur->Cells);
    my $allText = '';
    my $cell;
    while (($cell = $e_cells->Next)) {
 $allText .= $cell->{Value};
 $allText .= "\n";
    }
    return $allText;
}

sub getShapes {
    my $sheet = shift;
    my $e = Win32::OLE::Enum->new($sheet->Shapes);
    my $allText = '';
    while(($obj = $e->Next)) {
 if ($obj->{Type} == 17 ) { # msoShapeTextBox = 17
     $p = $obj->TextFrame->Characters->{Text};
     $allText .= $p;
     $allText .= "\n";
 }
    }

    return $allText;
}

#main
print ReadExcel::ReadExcel("$ARGV[0]");