Perl 从MS Word文件中获取表格数据
我需要从MS Word文件中获取表格数据。我提到的代码只获取第一行和最后一行,但我需要获取整个表 稍后,如果文件夹中存在相同的文件名,则必须交叉检查提取的数据 我甚至不能理解代码的流程,因为我是新来的模块 我提到了一个关于在这个站点上获取数据的类似问题,但没有得到它 请让我知道如何进行Perl 从MS Word文件中获取表格数据,perl,doc,Perl,Doc,我需要从MS Word文件中获取表格数据。我提到的代码只获取第一行和最后一行,但我需要获取整个表 稍后,如果文件夹中存在相同的文件名,则必须交叉检查提取的数据 我甚至不能理解代码的流程,因为我是新来的模块 我提到了一个关于在这个站点上获取数据的类似问题,但没有得到它 请让我知道如何进行 #!/usr/bin/perl use strict; use warnings; use File::Spec::Functions qw( catfile ); use Win32::OLE qw(in
#!/usr/bin/perl
use strict;
use warnings;
use File::Spec::Functions qw( catfile );
use Win32::OLE qw(in);
use Win32::OLE::Const 'Microsoft Word';
$Win32::OLE::Warn = 3;
my $word = get_word();
$word->{DisplayAlerts} = wdAlertsNone;
$word->{Visible} = 1;
my $doc = $word->{Documents}->Open('D:\A.doc');
my $tables = $word->ActiveDocument->{'Tables'};
for my $table (in $tables) {
my $tableText = $table->ConvertToText({ Separator => wdSeparateByTabs });
print "Table: " . $tableText->Text() . "\n";
}
$doc->Close(0);
sub get_word {
my $word;
eval { $word = Win32::OLE->GetActiveObject('Word.Application'); };
die "$@\n" if $@;
unless (defined $word) {
$word = Win32::OLE->new('Word.Application', sub { $_[0]->Quit })
or die "Oops, cannot start Word: ", Win32::OLE->LastError, "\n";
}
return $word;
}
更新:
医生
CMD中的输出
D:\Word>A.pl
D0033 D0033 15 E08.07No Committee
问题的原因是,表行在
ConvertToText
方法返回的文本中以CR
字符结尾:
C:\...\Temp> perl word-table.pl A.doc | xxd
00000000: 4172 7469 636c 6509 4e6f 2e09 436f 756e Article.No..Coun
00000010: 7420 4e6f 0943 6f6d 6d69 7474 6565 0d41 t No.Committee.A
00000020: 3030 3239 0941 3030 3239 0931 3609 4530 0029.A0029.16.E0
00000030: 312e 3037 0d42 3030 3238 0942 3030 3238 1.07.B0028.B0028
00000040: 0933 3409 4530 342e 3039 0d43 3030 3336 .34.E04.09.C0036
00000050: 0943 3030 3336 0931 3709 4530 392e 3030 .C0036.17.E09.00
00000060: 0d44 3030 3333 0944 3030 3333 0931 3509 .D0033.D0033.15.
00000070: 4530 382e 3037 0d0d 0a E08.07...
您需要参考,其中列出了所有可用的类及其属性和方法。但是我不明白为什么您的代码应该只获取第一行和最后一行。
Table.ConvertToText
方法返回一个Range
对象,它本质上只是表的开头和结尾的字符位置。而Range.Text
属性就是这两个位置之间的文本,所以不会出现太多错误。你是在控制台上查看的吗?你能发布你的Word文档以便我们自己试用吗?@Borodin:我是在控制台(cmd)上查看的,我以D:\>a.pl的形式运行程序。我在多个文档文件中尝试了代码,这些文件有多行,也只有两行,但是我得到了相同的输出..更新了.doc文件的示例以及生成的输出@sinan:代码是从@sinan引用的:我只是想给出我引用代码的链接,无意不给你任何信用。我欠你们帮助初学者学习的人情。我想你会帮助我摆脱代码中的这个错误并理解它。。
C:\...\Temp> perl word-table.pl A.doc | xxd
00000000: 4172 7469 636c 6509 4e6f 2e09 436f 756e Article.No..Coun
00000010: 7420 4e6f 0943 6f6d 6d69 7474 6565 0d41 t No.Committee.A
00000020: 3030 3239 0941 3030 3239 0931 3609 4530 0029.A0029.16.E0
00000030: 312e 3037 0d42 3030 3238 0942 3030 3238 1.07.B0028.B0028
00000040: 0933 3409 4530 342e 3039 0d43 3030 3336 .34.E04.09.C0036
00000050: 0943 3030 3336 0931 3709 4530 392e 3030 .C0036.17.E09.00
00000060: 0d44 3030 3333 0944 3030 3333 0931 3509 .D0033.D0033.15.
00000070: 4530 382e 3037 0d0d 0a E08.07...
#!/usr/bin/env 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;
run(\@ARGV);
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 "$@\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;
}