`
zengshaotao
  • 浏览: 750875 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

perl操作excel

 
阅读更多
#!/usr/bin/perl -w
#用Spreadsheet::ParseExcel 显示一个工作薄的所有表的内容。
 
use strict;
use warnings;
 
use Spreadsheet::ParseExcel;
 
my $file = 'Demo.xls';
 
my $book = Spreadsheet::ParseExcel::Workbook->Parse( $file);
my @sheets = @{ $book->{Worksheet} };
foreach my $sheet ( @sheets ){
    my $sheetName = $sheet->get_name();
    print "工作表: $sheetName\n";
 
    my ( $minRow, $maxRow ) = $sheet->row_range();
    my ( $minCol, $maxCol ) = $sheet->col_range();
 
    foreach my $row ( $minRow .. $maxRow ){
        foreach my $col ( $minCol .. $maxCol ){
            my $cell = $sheet->get_cell( $row, $col );
            next unless $cell;
            print " ($row,$col) ", $cell->value;
        }
        print "\n";
    }
}

 

 

再来段写Excel的代码:

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#!/usr/bin/perl -w
#用Spreadsheet::WriteExcel,生成乘法表,实际从第2行第2列开始,因为0行0列才是第一行第一列。
 
use strict;
use warnings;
 
use Spreadsheet::WriteExcel;
 
my $file = 'Demo_write.xls';
my $sheetName = 'My sheet';
 
my $book = new Spreadsheet::WriteExcel( $file );
my $sheet = $book->add_worksheet( $sheetName );
 
foreach my $row (1 .. 9){
foreach my $col (1 .. 9){
$sheet->write($row, $col, ($row * $col) );
}
}
 
$book->close();

 

 

对这个不是太熟,但从目前我了解情况看,Spreadsheet只能分别读写,不能对一个工作簿既读又写。

如果想既读又写,还得找Microsoft,用OLE。

这里只是简单演示一下用法,还是像上面一样分别来看看读写操作,不混合读写。

用OLE读Excel:

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#!/usr/bin/perl -w
#用OLE,显示一个工作薄的所有表的内容。
 
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');
 
my $file = 'Demo.xls';
my $value = 0;
 
my $book = $Excel->Workbooks->Open( $file );
foreach my $Sheet (in $book->{Worksheets})
{
    my $sheetName = $Sheet->{Name};
    print "工作表: $sheetName\n";
 
  my $minRow = 1;
  my $maxRow = $Sheet->UsedRange->Rows->Count;
  my $minCol = 1;
  my $maxCol = $Sheet->UsedRange->Columns->Count;
    printf("row,col:%d,%d\n",$maxRow,$maxCol);
    foreach my $row ( $minRow .. $maxRow ){
        foreach my $col ( $minCol .. $maxCol ){
            my $cell_value = $Sheet->Cells($row,$col)->{Value};
            next unless defined $cell_value;
            print " ($row,$col) ", $cell_value;
        }
        print "\n";
    }
}
$book->Close();
$Excel->Quit();

用OLE写Excel:

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#!/usr/bin/perl -w
#用OLE 操作excel,生成乘法表。
 
use strict;
use Win32::OLE qw(in with);
use Win32::OLE::Const 'Microsoft Excel';
$Win32::OLE::Warn = 3; # die on errors...
 
my $Excel = Win32::OLE->GetActiveObject('Excel.Application') || Win32::OLE->new('Excel.Application', 'Quit');
 
my $excelfile = "Demo4.xls";
 
my $Book = $Excel->Workbooks->Add();
   $Book->SaveAs($excelfile); #Good habit when working with OLE, save+often.
my $Sheet = $Book->Worksheets("Sheet1");
   $Sheet->Activate();
foreach my $row (1 .. 9){
foreach my $col (1 .. 9){
        $Sheet->Cells($row,$col)->{Value} = ($row * $col);
    }
}
# my $Chart = $Sheet->ChartObjects->Add(200, 200, 200, 200);
$Book->Save();
$Book->Close();
$Excel->Quit();

 

 

到底用哪种好呢?这要看情况:

1.非windows环境,不能用OLE。多平台下,Spreadsheet可用性更好。

2.在windows下,同样水平的代码,用OLE效率更高一些。

3.Spreadsheet用起来更简单一些,OLE要考虑的东西要多些。

 

对一个约一万行左右,200多列的工作表进行读取并处理,Spreadsheet用了30s左右,OLE用了18s左右。

在Perl程序里处理Excel要注意,尽量少调用Excel的函数或变量。

如:

 

[plain] view plaincopy
 
  1. $myCell = $sheet->get_cell( $row, $col );  
  2. $aValue =$myCell->value;  
  3. forearch .....{  
  4.     if($myCell->value == ...){#here  
  5.     ....  
  6.     }  
  7. }  

 

 

如果把#here行里的$myCell->value改为$aValue(保证代码运行正确情况下的修改),可以提高效率。

这样的修改有时能提高3、4倍的性能(这个依赖具体情况)。

还有一点要注意,Spreadsheet里行列是从0开始的,OLE里行列是从1开始的

分享到:
评论

相关推荐

    perl操作Excel示例

    perl操作Excel示例perl操作Excel示例perl操作Excel示例perl操作Excel示例perl操作Excel示例perl操作Excel示例perl操作Excel示例perl操作Excel示例perl操作Excel示例....够20字了吗

    用Perl操作Excel2007 (xlsx) with Excel-Writer-XLSXL

    用Perl操作Excel2007 (xlsx) with Excel-Writer-XLSXL

    perl Excel操作

    perlperl Excel操作

    perl对excel操作封装函数

    perl对excel的表格处理。其中对New excelRead excelWrite相关操作,方便实用

    Perl读写excel

    讲解perl中读写excel用到的库函数,以及如何使用库函数进行操作。

    Perl中使用Win32_OLE模块读写Excel的方法1

    引言脚本语言,其目的是将 Unix shell 的易用性和编程语言( 比如 C) 的功能与可塑性结合起来。它最初只是 Unix 系统管理员的一个工具, 在工作日

    perl 对文本一些常用操作和常用正则表达式

    包含perl对文本的一些常用操作,字符串的操作,excel的操作。相关函数的操作,和经常用到的一些正则表达式~~~(本人平常用到的一点收集,供用perl开发的朋友参考一下)

    Python对Excel操作教程.doc

    Python对Excel操作详解 文档摘要: 本文档主要介绍如何通过python对office excel进行读写操作,使用了xlrd、xlwt和xlutils模块。另外还演示了如何通过Tcl tcom包对excel操作。 关键字: Python、Excel、xlrd、xlwt、...

    Excel-2-Elasticsearch:小型而快速的Perl脚本,可将来自MS Excel(.xlsx和.xls)的记录直接注入Elasticsearch

    小型而快速的perl脚本,用于将来自MS Excel(.xlsx和.xls)的记录直接注入Elasticsearch。 通过使用Kibana导入现有的Excel数据和图表来进行快速演示非常有用。 完成了一些内置的自动化操作,以使用字段名称直接...

    Spreadsheet-WriteExcel-2.40 .tar.gz

    Spreadsheet::WriteEXcel安装包 下载 Spreadsheet-WriteExcel-2.40.tar.gz并解压在DBI-1.13中 ...和安装cpan一样,在目录中执行以下操作: perl Makefile.PL make make test make install make clean

    Win32::OLE

    在perl中如何操作Excel,相当有用,

    QXls与Perl.zip

    Qt操作xlsx格式Excel所需开源库,该库无需调用excel和wps,可以直接读取写xlsx文件。效率高

    Win32::OLE模块

    Win32::OLE安装模块,可以导入perl,以关键词use Win32::OLE开头,即可在perl调用相应函数来操作excel

    xlslib库源代码供大家下载版本3.23

    xlslib是一个用于读写Microsoft Excel文件(XLS和XLSX格式)的C++库。...总而言之,xlslib库是一个强大而灵活的C++库,提供了创建和操作Excel文件的完整功能,是开发者创建高质量Excel文件的理想选择。

    opensuse安装QtXlsxWriter库实现QT操作excel文件

    使用它可以远离微软的office环境,单独操作xlsx表格文件。 @1 下载 QtXlsxWriter  @2 我的系统默认自带perl。 Note: Perl is needed in this step. Download the source code. Put the source code in any ...

    基于MSVC、Qt5、Qt6编译的QXlsx库,附带修改版后的Qt6源码工程,有需要Mingw的可以更改编译器直接编译

    2、QXlsx是比较好用的可以操作excel文件的库,以前项目基于Qt5,现在新开的项目基于Qt6,因此重编编译了这个库,附带了修改后的源码,可以适配Qt6的版本,自己编译前需要先安装perl才能顺利编译...

    监控系统统一Web接口Thruk.zip

    Thruk 是一个独立的多后端监控的 Web 接口,当前支持 Nagios, Icinga 和 Shinken (通过 Livestatus 插件)。其目标是 100% 覆盖监控系统的所有功能。 主要特性: 多后端支持 ... 灵活的操作面板

    ASP.NET编程百例(PDF)

    ASP.NET是微软.NET战略中的一个重要成员,除了可以使用Visual C#、VB.NET、VisualC++.NET、JScript.NET等语言编写外,还可以使用第三方的.NET接口(如COBOL.NET、 Perl.NET等)进行编写。本书通过100个精彩实例...

    ASP.NET编程百例 PDF扫描版 附源代码(vb.net)

    ASP NET是微软.NET战略中的一个重要成员 除了可以使用Visual C# VB.NET VisualC++ NET JScript.NET等语言编写外 还可以使用第三方的.NET接口 如COBOL.NET Perl.NET等 进行编写 本书通过100个精彩实例 由浅入深...

    NTKO OFFICE痕迹保留文档控件.rar

    5.广泛的操作系统,Web服务器和编程语言支持 后台支持Windows,Linux,Unix等各种操作系统;支持IIS,Domino,Websphere,Apache等所有后台服务器类型和JSP,ASP,PHP,PERL等编程语言。 6.支持手写签名和加密的电子...

Global site tag (gtag.js) - Google Analytics