如何自动 Excel 使用 Win32 Perl
#!/usr/bin/perl -w
use strict;
use Win32::OLE qw(in with);
use Win32::OLE::Const 'Microsoft Excel';
$Win32::OLE::Warn = 3; # die on errors...
# get already active Excel application or open new
my $Excel = Win32::OLE->GetActiveObject('Excel.Application')
|| Win32::OLE->new('Excel.Application', 'Quit');
# open Excel file
my $Book = $Excel->Workbooks->Open("c:/komodo projects/test.xls");
# You can dynamically obtain the number of worksheets, rows, and columns
# through the Excel OLE interface. Excel's Visual Basic Editor has more
# information on the Excel OLE interface. Here we just use the first
# worksheet, rows 1 through 4 and columns 1 through 3.
# select worksheet number 1 (you can also select a worksheet by name)
my $Sheet = $Book->Worksheets(1);
foreach my $row (1..4)
{
foreach my $col (1..3)
{
# skip empty cells
next unless defined $Sheet->Cells($row,$col)->{'Value'};
# print out the contents of a cell
printf "At ($row, $col) the value is %s and the formula is %s\n",
$Sheet->Cells($row,$col)->{'Value'},
$Sheet->Cells($row,$col)->{'Formula'};
}
}
# clean up after ourselves
$Book->Close;
或者
#!/usr/bin/perl -w
use strict;
use Spreadsheet::ParseExcel;
my $oExcel = new Spreadsheet::ParseExcel;
die "You must provide a filename to $0 to be parsed as an Excel file" unless @ARGV;
my $oBook = $oExcel->Parse($ARGV[0]);
my($iR, $iC, $oWkS, $oWkC);
print "FILE :", $oBook->{File} , "\n";
print "COUNT :", $oBook->{SheetCount} , "\n";
print "AUTHOR:", $oBook->{Author} , "\n"
if defined $oBook->{Author};
for(my $iSheet=0; $iSheet {SheetCount} ; $iSheet++)
{
$oWkS = $oBook->{Worksheet}[$iSheet];
print "--------- SHEET:", $oWkS->{Name}, "\n";
for(my $iR = $oWkS->{MinRow} ;
defined $oWkS->{MaxRow} && $iR {MaxRow} ;
$iR++)
{
for(my $iC = $oWkS->{MinCol} ;
defined $oWkS->{MaxCol} && $iC {MaxCol} ;
$iC++)
{
$oWkC = $oWkS->{Cells}[$iR][$iC];
print "( $iR , $iC ) =>", $oWkC->Value, "\n" if($oWkC);
}
}
}
或者
#!perl -w
# $Id: excel.pl,v 1.4 2004/07/19 20:20:58 szabgab Exp $
#
use strict;
use Win32::GuiTest qw(FindWindowLike GetWindowText SetForegroundWindow);
$Win32::GuiTest::debug = 0; # Set to "1" to enable verbose mode
# Find top level (1) windows containg Excel in their title
my @windows = FindWindowLike(undef, "Excel", "", undef, 1);
for (@windows) {
print "$_>\t'", GetWindowText($_), "'\n";
}
print "------------\n";
# Find all windows matching Microsoft Excel in the title, and XLMAIN$
# as the class.
@windows = FindWindowLike(undef, "^Microsoft Excel", "^XLMAIN\$");
for (@windows) {
print "$_>\t'", GetWindowText($_), "'\n";
SetForegroundWindow($_);
}
print "------------\n";
die "You should start Excel before running this example.\n"
unless @windows;
# Find all children of a specified window.
my @children = FindWindowLike($windows[0]);
for (@children) {
print "$_>\t'", GetWindowText($_), "'\n";
}
Perl问题关于my $Excel = Win32::OLE->GetActiveObject('Excel.Application')
my $Excel = Win32::OLE->new('Excel.Application', sub{(shift)->Quit;});是用来新建一个Win32::OLE对象
而my $Excel= Win32::OLE->GetActiveObject('Excel.Application'); 是使用已经打开的Excel进行工作。
如果目前你没有打开Excel,必须使用new新建一个,如果打开了就可以使用GetActiveObject了。你的第二种写法很怪,一般会写成if (!$excel){$Excel = Win32::OLE->new('Excel.Application', sub{(shift)->Quit;});
},因此也就与第一种一样了。因此你的两种写法本质上没有什么区别,既然出错了,建议关闭打开的Excel,然后使用new新建Win32::OLE对象进行操作。你遇到的问题估计是程序那个地方写错了,还是再查看一下程序吧。
perl和python选哪个
就 语法来看,Python比Perl优美得多。Perl里面充满了像$!和$_这类的天书标记,初学的时候每读一段代码,就会碰到几个从来没见过的标记,然 后过两个星期,他们又以全新的面目出现在我面前。在我看来,这决不是什么紧凑,只是疯狂。不过同样的尼采,有的人看到的是伟大的哲学家,有的人看到的只是 一个疯子。
类库,Python的类库不如Perl的多。但是这很大程度上是因为Python没有一个像CPAN这样的类库集散地。其实Python的类库也是很全的,只是要找。SourceForge是一个,此外还有freshmeat。就我自己的经验,有些类库是无意中找到的。比方说,我看IBM的 developer network,看到一个twisted,安装的时候读了它的README,发现还有pycrypto,和pyopenssl类库。
如 果你觉得Python的开发效率还不及C++,那只能说你对Python还是太不熟悉,不过有C++的底子,用不了多久你就会闯过这一关的。其实 Python的文本处理能力一点都不比Perl逊色。它的re模块的思路同java的regex很像,而中文处理则要用到codecs。真正学懂之后,你 会觉得Python模块的逻辑性很强。不像Perl,虽然很方便,但是一个一个模块之间没有什么必然的联系。
关 于Python的大型项目,最知名的就是Zope,然后有twisted(它既是一个类库,也是一个framework)。此外还有 gadfly,medusa(其实这两个是Zope的子项目,但是Perl没有这个重量级的产品吧),以及Chandler。这些都是纯Python的程 序。
敢问Perl 比 Python 好在哪里
1. perl正则好用: sed, awk, grep的正则有细微差异, 难以记忆, 基本上一个正则表达式需要试很久. 而perl在onelinar写shell脚本中, 可以替换sed/awk/grep. 只需要记住统一的perl正则即可, 统一简洁好用.
2. 形式自由, 可以随心所欲. 用perl写脚本, 可以有多种写法. 想简洁就简洁, 想整洁就整洁, 风格自己定.
3. 繁杂的extension和精简的语言内核很吸引人. 函数(sub)和符号表(%::)都是first-citizen, 所以高阶函数和typeglob都用起来很爽.
4. 最最重要原因, 用perl的人, 内心强烈的认为perl比python好, 不用不知道这种偏好是多么强烈. 偏好是一种强烈的执念, 执念容易虚妄.
5. 其实ruby要比perl和python都好. 但脚本语言, 属于小语种, 熟悉了常用的一种, 就不想学其他小语种了.