2016-12-21 8 views
1

저는 워드 문서가 수백 개가 넘는 디렉토리가 있습니다. 각 문서에는 표준화 된 테이블 세트가 들어 있습니다. 이 테이블을 구문 분석하고 데이터를 추출해야합니다. 전체 테이블을 뱉어내는 스크립트를 개발했습니다.WIN32 :: OLE perl 패키지를 사용하여 Word 테이블을 탐색하려면 어떻게해야합니까?

#!/usr/bin/perl; 
use strict; 
use warnings; 

use Carp qw(croak); 
use Cwd qw(abs_path); 
use Path::Class; 
use Win32::OLE qw(in); 
use Win32::OLE::Const 'Microsoft Word'; 
$Win32::OLE::Warn = 3; 
=d 
my $datasheet_dir = "./path/to/worddocs"; 
my @files = glob "$datasheet_dir/*.doc"; 
print "scalar: ".scalar(@files)."\n"; 
foreach my $f (@files){ 
    print $f."\n"; 
} 
=cut 
#my $file = $files[0]; 
my $file = "word.doc"; 
print "file: $file\n"; 

run(\@files); 

sub run { 
    my $argv = shift; 
    my $word = get_word(); 

    $word->{DisplayAlerts} = wdAlertsNone; 
    $word->{Visible}  = 1; 

    for my $word_file (@$argv) { 
     print_tables($word, $word_file); 
    } 

    return; 
} 

sub print_tables { 
    my $word = shift; 
    my $word_file = file(abs_path(shift)); 

    my $doc = $word->{Documents}->Open("$word_file"); 
    my $tables = $word->ActiveDocument->{Tables}; 

    for my $table (in $tables) { 
     my $text = $table->ConvertToText(wdSeparateByTabs)->Text; 
     $text =~ s/\r/\n/g; 
     print $text, "\n"; 
    } 

    $doc->Close(0); 
    return; 
} 

sub get_word { 
    my $word; 
    eval { $word = Win32::OLE->GetActiveObject('Word.Application'); 1 } 
     or die "[email protected]\n"; 
    $word and return $word; 
    $word = Win32::OLE->new('Word.Application', sub { $_[0]->Quit }) 
     or die "Oops, cannot start Word: ", Win32::OLE->LastError, "\n"; 
    return $word; 
} 

세포를 탐색 할 수있는 방법이 있습니까? 첫 번째 열에 특정 값이있는 행만 반환하려고합니까?

예를 들어 다음 표에서 첫 번째 열에 열매가있는 행만 grep하고 싶습니다.

apple  pl 
banana  xml 
California csv 
pickle  txt 
Illinois gov 
pear  doc 

답변

0

당신은 먼저 Columns 객체와 Rows 모음을 사용하여 치수를받은 후, 테이블의 개별 셀에 액세스하는 OLE를 사용할 수 있습니다.

또는 텍스트를 Perl 배열로 사후 처리하여 반복 할 수 있습니다. 대신

my $text = $table->ConvertToText(wdSeparateByTabs)->Text; 
$text =~ s/\r/\n/g; 
print $text, "\n"; 

무엇인가 등의 대소 문자 구분을위한

my %fruit; # population of look-up table of fruit omitted 

my $text = $table->ConvertToText(wdSeparateByTabs)->Text; 
my @lines = split /\r/, $text; 
for my $line (@lines) { 
    my @fields = split /\t/, $lines; 

    next unless exists $fruit{$fields[0]}; 

    print "$line\n"; 
} 

의 개선,

같은

의 필요에 따라 추가 할 수 있습니다.