我正在尝试打开word文档,只提取文档中的所有文本,并使用Win32::OLE
将其显示给用户#usr/bin/perl
#OLEWord.pl
#Use string and print warnings
use strict;use warnings;
#Using OLE + OLE constants for Variants and OLE enumeration for Enumerations
use Win32::OLE;
use Win32::OLE::Const 'Microsoft Word';
$Win32::OLE::Warn = 3;
#set the file to be opened
my $file = '/work/Test.docx';
#Create a new instance of Win32::OLE for the Word application, die if could not open the application
my $MSWord = Win32::OLE->new('Word.Application','Quit') and "Opened Word" or die "Unable to open document ", Win32::OLE->LastError();
#Set the screen to Visible, so that you can see what is going on
$MSWord->{'Visible'} = 1;
#open the request file or die and print warning message
my $Doc = $MSWord->Documents->Open('C:\work\Test.docx') or die "Could not open ", $file, " Error:", Win32::OLE->LastError();
#$MSWord->ActiveDocument->SaveAs({Filename => 'AlteredTest.docx',
#FileFormat => wdFormatDocument});
sub ShowObjs {
my $obj = shift;
foreach (sort keys %$obj) {
print "Keys: $_ - $obj->{$_}\n"; }
}
my $paragraphs = $Doc->Paragraphs;
ShowObjs($paragraphs);
# Get and print the Text inside the opened file
my $paragraphs = $Doc->Paragraphs;
my $txt = $Doc->Range->Text;
print $txt;
$MSWord->ActiveDocument->Close;
$MSWord->Quit;
我收到此错误代码:
“Microsoft Word”中的OLE异常:
命令失败
Win32 :: OLE(0.1709)错误ox800a1066 在METHOD / PROPERTYGET“打开”在OLEWord.pl第20行
更新:我可以正常打开Word应用程序,就在我尝试打开问题的文件时
答案 0 :(得分:4)
我有几个脚本可以使用Win32::OLE将DOC转换为各种输出格式。他们通常是这样开始的:
use Win32::OLE;
use Win32::OLE::Const 'Microsoft Word';
my $wr = Win32::OLE->new('Word.Application')
or die "Failure - word. \n";
$wr->{DisplayAlerts} = wdAlertsNone;
$wr->{Visible} = 0;
my $Doc = $wr->Documents->Open({
FileName => $input_file_path,
ConfirmConversions => 0,
AddToRecentFiles => 0,
Revert => 0,
ReadOnly => 1,
OpenAndRepair => 0,
}) or exit;
...
请注意$input_file_path
必须包含文件的绝对路径。您还可以启用Visible
和DisplayAlerts
来查看Word可能给您的任何错误。
修改:您可以使用in
枚举器遍历段落:
use Win32::OLE qw(in);
...
my $paragraphs = $Doc->Paragraphs;
for my $par (in $paragraphs) {
print $par->Range->Text();
}
或者您可以使用Word自己的导出方法并将文档另存为支持的格式之一:
$Doc->SaveAs({
FileName => 'c:\\work\\Test.txt',
FileFormat => wdFormatEncodedText,
});
后一种方法的优点是尽可能保留格式,这样可以为子弹,编号等产生更好的结果。
答案 1 :(得分:1)
Win32::OLE
对于互动可能有点搞笑。如果有任何事情触发提示,您可能会收到这样的消息。通常情况下,它可能希望以只读方式打开文件,并设置对话框,但这些对话框可能会在Win32::OLE
的默认初始化下中断。
如果是这种情况,请致电
Win32::OLE->Initialize(Win32::OLE::COINIT_OLEINITIALIZE);
在你做任何事情之前,例如实例化任何对象(即Win32::OLE->new
之前)可能会做的伎俩。