有谁用perl操作过excel

有谁用perl操作过excel

RT!
帮忙贡献一段代码,供偶学习一下
Spreadsheet-ParseExcel-0.32
上CPAN看document..但是只能支援 office 97...

office 2003与office 2007我试过没办法.....

也可以直接打开 xls档......里面都是XML内容...
谢谢..


QUOTE:
原帖由 apile 于 2008-1-25 09:37 发表
Spreadsheet-ParseExcel-0.32
上CPAN看document..但是只能支援 office 97...

office 2003与office 2007我试过没办法.....

也可以直接打开 xls档......里面都是XML内容...
谢谢..

其实通过Spreadsheet::Read分析更好一些,
不过我觉得lz好像更需要Win32::OLE
提供直接操作EXCEL对象的给你做参考,要在本机上装有EXCEL,知名见意我就不多解释了.

use Win32::OLE;
use Win32::OLE::Const 'Microsoft Excel';

sub         WriteXLS
{
        my ($Sheet,$row,$col,$ne,$cmdinfo,$flag)=@_;
        my (@sp)=split(/\|/,$cmdinfo);
        $Sheet->Cells($row,$col)->{'Value'}=$ne;
        $Sheet->Cells($row,$col)->Font->{'Bold'}=1;
        $Sheet->Cells($row,$col)->Borders->{'ColorIndex'}=1;
        $Sheet->Cells($row,$col)->Borders->{'LineStyle'}=1;

        for(my $i=0;$i<=$#sp;$i++)
        {
                $sp[$i]=~s/^\d+\,//;
                if($flag==0)
                {
                        $Sheet->Cells($row,$col+$i+1)->{'Value'}=$sp[$i];
                }
                elsif($flag==1)
                {
                        my @tmp=split(/\,/,$sp[$i]);
                        $tmp[0]=~s/\@/\n/g;$tmp[0]=~s/\#/ /g;$tmp[0]=~s/\!/ /g;
                        $Sheet->Cells($row,$col+$i+1)->{'Value'}=$tmp[0];
                        $Sheet->HyperLinks->Add($Sheet->Cells($row,$col+$i+1),$tmp[1]);
                }
                $Sheet->Cells($row,$col+$i+1)->Font->{'Bold'}=1;
                $Sheet->Cells($row,$col+$i+1)->{WrapText}=1;
                $Sheet->Cells($row,$col+$i+1)->Borders->{'ColorIndex'}=1;
                $Sheet->Cells($row,$col+$i+1)->Borders->{'LineStyle'}=1;
        }
}

my $Excel = Win32::OLE->new("Excel.Application");  #建立对象
$Excel->{Visible} = 0;#是否可见
$Excel->{DisplayAlerts} = 0;#是否显示弹出对话框
my $Book = $Excel->Workbooks->Add;
my $Sheet = $Book->Worksheets("Sheet1");
for(my $i=1;$i<=20;$i++)
{
        $Sheet->Cells(1,$i)->{'ColumnWidth'}=15 if($i==1);
        $Sheet->Cells(1,$i)->{'ColumnWidth'}=25 if($i>1) ;
}

$Sheet->Cells(1,1)->Font->{'Size'}=20;
$Sheet->Cells(1,1)->Font->{'Bold'}=1;
$Sheet->Cells(1,1)->{'Value'}= GetTaskName($nTaskId);
WriteXLS($Sheet,3,1,"NE_NAME",$Cmd,0);


my $xls=$path.$time."_".$nTaskId.".xls";
$Sheet->SaveAs($xls);
$Excel->Quit();
再给一个简单的例子


#!/usr/bin/perl
#!调用Microsoft Excel中对GB2312字串排序

use strict;
use warnings;
use Cwd;
use Win32::OLE qw();
use Win32::OLE::Const 'Microsoft Excel';

my @glossary = (
    '北京',
    '上海',
    '天津',
    '广州',
    '深圳',
    '南京',
    '武汉',
);

print join "\n", &sort_gloss_in_excel(@glossary);

##############################################################################
### SUBROUTINE sort_gloss_in_excel:
###     call Microsoft Excel to sort @gloss and return @sorted_gloss
###     Please refer to Microsoft Excel Visual Basic Reference for usage of
###     available objects and methods:
###     Excel > Tools > Macro > Visual Basic Editor > Help.
##############################################################################

sub sort_gloss_in_excel {
    print ">>>>>>>>>>>>  Exporting glossary entries into Microsoft Excel.\n";
    my (@gloss) = @_;
    my @sorted_gloss;
    my $gloss_sheet_file = "gloss_entry.xls";
    my $current_path = getcwd;
    my $gloss_nums = @gloss;

    # delete last $gloss_sheet_file
    unlink($gloss_sheet_file) if (-e $gloss_sheet_file);

    # create new Excel objects
    my $Gloss_Excel = Win32::OLE->new( 'Excel.Application', sub {$_[0]->Quit;} )
        or die "\n      \$%\@&#!  DID YOU INSTALL MS Excel IN YOUR MACHINE?\n";
    my $Gloss_Book  = $Gloss_Excel->Workbooks->Add(1);
    my $Gloss_Sheet = $Gloss_Book->Worksheets(1);

    # write @gloss to Excel
    foreach my $row (1..$gloss_nums) {
        $Gloss_Sheet->Cells($row, 1)->{'Value'} = $gloss[$row-1];
    }

    print ">>>>>>>>>>>>  Sorting glossary entries in Microsoft Excel.\n";
    # sort @gloss in Excel
    $Gloss_Sheet->Range("A1:A$gloss_nums")->Sort( $Gloss_Sheet->Cells(1, 1) );

    # get @sorted_gloss
    foreach my $row_s (1..$gloss_nums) {
        $sorted_gloss[$row_s-1] = $Gloss_Sheet->Cells($row_s, 1)->{'Value'};
    }

    print ">>>>>>>>>>>>  Save Excel worksheet to $gloss_sheet_file at current path\n";
    $Gloss_Book->SaveAs("$current_path/$gloss_sheet_file");
    undef $Gloss_Book;
    undef $Gloss_Excel;

    return @sorted_gloss;
}
这是我前几天写着玩的读excel并入oracle数据库的一个例子,你可以参考一下,我已经测试ok了
#!usr/bin/perl
use strict;
use warnings;
use DBI;
use DBD::ODBC;
use Win32::OLE;    #导入win32 OLE包


my $dir = 'D:\\myperl\\win32ole\\';
my $src_name = $dir."test1"."\.xls";
my $nowstr;
#新建一个EXCEL应用对象,然后我们就可以对excel进行操作。
my $app_xls = Win32::OLE->new('Excel.Application', sub{$_[0]->Quit}) or die"Can't install Excel01!";
#打开一个EXCEL文件,'True' 表示是只读
my $src_book = $app_xls->WorkBooks->Open($src_name, 0, 'True');
my $src_sheet = $src_book->Worksheets(1); #选中一工作表
my $row_counts= $src_sheet->{UsedRange}->{Rows}->{Count};   #   得到行数
my $column_counts = $src_sheet->{UsedRange}->{Columns}->{Count}; #   得到列数
print "$column_counts \n";
print "$row_counts \n";
my $row;
my $col;
my @nowstr;
my @home;
my $vol;
my $dbh = DBI->connect("DBI:ODBC:testodbc","xxf","xxf") or die "$!";
for( $row=1;$row<=$row_counts;$row++)
{
   for( $col=1;$col<=$column_counts;$col++)
   {
    #printf "%s ",
    $nowstr[$column_counts-1] = $src_sheet->Cells($row,$col)->{'Value'};
    #$nowstr = $src_sheet->Cells(1,'A')->{Value};
    #print $nowstr[$column_counts-1];
    $vol = $vol." ".$nowstr[$column_counts-1]
   }
   print $vol;
   #$vol="";
   
    @home=split(" ",$vol);
      if(@home ne ""){
          my $sql = $dbh ->prepare("insert into p_lc(aa,bb) values (?,?)");
          $sql ->execute($home[0],$home[1]);
                    }
    $vol="";
print "\n";
}

undef $src_book;
undef $app_xls;   #关掉所打开的excel应用
03没问题...不知道07怎么样..
请楼主是说明自己的用意
是win下还是unix下
是要读取excel还是写入excel