perl EXCEL处理
package GetExcelData;use Win32::OLE; #导入win32 OLE包
use Win32::OLE::Const "Microsoft Excel";
use Cwd;#获取本地路径模块
#数据类型如下所示
#$EXCEL->$sheet->{@rowdata,@coulmndata}
#@rowdata={@row1,@row2,....};
#@rowdata={@coulmndata1,@coulmndata2,....};
#存储行和列的所有数据都是一个三维的数组
push (@INC,'pwd');
#new一个新的对象
sub new
{
my $class = shift;
#一个空的引用
my $ref = {};
#将引用和对象绑定
bless($ref,$class);
#返回引用
return $ref;
}
#析构函数
sub DESTROY
{
my $self = shift @_;
foreach my $keY (keys %{$self})
{
print $keY is destroy;
}
}
#获得所有EXCEL文件的内容
sub GetAllExcelDate
{
#获取对象引用
my $self = shift @_;
#获取本地路径
my $dir = getcwd;
my @FilePathArray;
#获取本地路径下的所有文件
&GetLocalFile($dir,\\\\@FilePathArray);
#获取路径下的Excel文件
my @ExcelFilePath = &GetFileExcelFile(@FilePathArray);
#获取文件夹下Excel的数量
my $iExcelNum = @ExcelFilePath;
#目录下没有EXCEL文件
if($iExcelNum == 0)
{
print "There is no Excel File";
return 0;
}
#遍历所有的Excel文件
foreach my $ExcelPaht( @ExcelFilePath )
{
#Excel文件不存在给出提示
die "the $ExcelPaht does notexit\\\\n" unless -e $ExcelPaht;
#创建一个Excel操作对象
my $excel =Win32::OLE->GetActiveObject('Excel.Application') || Win32::OLE->new('Excel.Application');
#使这个对象可见
$excel -> {Visible} = 0;
#打开一个Excel工作簿
my $workbook = $excel-> Workbooks -> Open("$ExcelPaht");
# 关掉Excel的提示,比如是否保存之类的。
$excel->{DisplayAlerts} = 'False';
#获得该Excel文件的所有sheet名字
my @AllSheetName;
#获得工作表的数量
my $sheets_num = $excel->WorkSheets->{'Count'};
foreach my $num (1..$sheets_num)
{
my $sheet = $excel->WorkSheets($num);
push @AllSheetName, $sheet->{'Name'};
}
print "*" x 20,".\\\\n";
print "\\\\nInput Excel File is $ExcelPaht\\\\n";
print "*" x 20,".\\\\n";
print "\\\\nSheet is\\\\n";
print "@AllSheetName\\\\n";
print "*" x 20,".\\\\n";
#存储sheet内容的哈希
my %SheetContent;
foreach $SheetName(@AllSheetName)
{
#激活要导入数据的sheet
my $sheet = $workbook -> Worksheets($SheetName);
$sheet-> Activate;
#获取EXCEL激活sheet的行和列数目
my $row_num = $sheet->{UsedRange}->{Rows}->{Count};
my $coulmn_num = $sheet->{UsedRange}->{Columns}->{Count};
#获取某个sheet的所有行和列数据
my @AllSheetContent;
#获得所有行的数据
my @AllRowDate;
#获得该sheet的行数目
my $i_SheetRowNum = $sheet->{UsedRange}->{Rows}->{Count};
#遍历每一行
foreach my $i_RowIndex(1..$i_SheetRowNum)
{
#获取一个sheet每一行的数据
my @RowArrayTemp;
die "The search index $i_RowIndex is bigger than max row num$row_num" if($i_RowIndex > $row_num);
#获取这个sheet某一行的数据
foreach my $coulmnIndex(1..$coulmn_num)
{
my $Excelvalue = $sheet->Cells($i_RowIndex,$coulmnIndex)->{'Value'};
push@RowArrayTemp,$Excelvalue;
}
push @AllRowDate,[@RowArrayTemp];
}
#获取sheet所有列的数据
my @AllCoulmnDate;
my $i_SheetCoulmnNum =$sheet->{UsedRange}->{Columns}->{Count};
#遍历所有列
foreach my $i_CoulmnIndex(1..$i_SheetCoulmnNum)
{
#获取一个sheet每一列的数据
my @CoulmnArrayTemp;
die "The search index $i_CoulmnIndex is bigger than max row num " if($i_CoulmnIndex > $coulmn_num);
#获取这个sheet某一列的数据
foreach my $RowIndex(1..$row_num)
{
my $Excelvalue = $sheet->Cells($RowIndex,$i_CoulmnIndex)->{'Value'};
push@CoulmnArrayTemp,$Excelvalue;
}
push @AllCoulmnDate,[@CoulmnArrayTemp];
}
#注意这里二维数据的赋值方式!!!!!!!!!
push @AllSheetContent,[@AllRowDate];
push @AllSheetContent,[@AllCoulmnDate];
#获取该sheet下的所有行和列数据
#注意这里少了\\\\就成了数组元素的个数了!!!!!
$SheetContent{$SheetName} = \\\\@AllSheetContent;
}
my $PointEndIndex = rindex($ExcelPaht,"/");
my $ExcelName = substr($ExcelPaht,$PointEndIndex+1,length($ExcelPaht)-$PointEndIndex-1);
$self->{$ExcelName} = {%SheetContent};
#退出EXCEL
$excel-> Quit;
}
}
#获取导入的所有EXCEL的名字
sub GetExcelName
{
my $self = shift;
#返回所有的EXCEL键值
return keys %{$self};
}
#获得EXCEL的所有sheet的名字
sub GetExcelSheetName
{
my $self = shift;
my $s_ExcelName = shift;
#判断要查找的EXCEL是否导入
unless(exists $self->{$s_ExcelName})
{
die "\\\\nThe Excel $s_ExcelName does not exit\\\\n";
}
#得到EXcel对应的sheet哈希
my $hashSheet = $self->{$s_ExcelName};
return keys %{$hashSheet};
}
#获取某个Excel某个Sheet一行的数据
sub GetExcelSheetRowDate
{
#获取对象引用
my($self,$s_ExcelName,$s_SheetName,$i_RowNum) = @_;
$i_RowNum--;
#得到获取的行数据
my @RowContent;
#判断要查找的EXCEL是否导入
unless(exists $self->{$s_ExcelName})
{
die "\\\\nThe Excel $s_ExcelName does not exit\\\\n";
}
#得到EXcel对应的sheet哈希
my $hashSheet = $self->{$s_ExcelName};
#判断要获取的sheet是否存在
unless(exists $hashSheet->{$s_SheetName})
{
die "\\\\nThe Excel Sheet $s_SheetName does not exit\\\\n";
}
#获取所有行和列数据的数组
my @ArrayTest = @{$self->{$s_ExcelName}->{$s_SheetName}};
#获取这个sheet有多少行,行数据存在第一位
my $i_size = @{$ArrayTest};
#判断获取的行号是否在行范围内
unless($i_RowNum {$s_ExcelName}->{$s_SheetName}};
#获取这个sheet有多少列,列数据存在第二位
my $i_size = @{$ArrayTest};
#判断获取的行号是否在行范围内
unless($i_ColNum {$s_ExcelName}->{$s_SheetName}};
#获取这个sheet有多少行,行数据存在第一位
my $i_Rowsize = @{$ArrayTest};
$i_Rowsize;
}
#获取Excel某个sheet的列的数目
sub GetExcelSheetColNum
{
#获取对象引用
my($self,$s_ExcelName,$s_SheetName) = @_;
#判断要查找的EXCEL是否导入
unless(exists $self->{$s_ExcelName})
{
die "\\\\nThe Excel $s_ExcelName does not exit\\\\n";
}
#得到EXcel对应的sheet哈希
my $hashSheet = $self->{$s_ExcelName};
#判断要获取的sheet是否存在
unless(exists $hashSheet->{$s_SheetName})
{
die "\\\\nThe Excel Sheet $s_SheetName does not exit\\\\n";
}
#获取所有行和列数据的数组
my @ArrayTest = @{$self->{$s_ExcelName}->{$s_SheetName}};
#获取这个sheet有多少行,行数据存在第一位
my $i_Colsize = @{$ArrayTest};
$i_Colsize;
}
#获取本地路径下的所有文件,(注意这个是使用指针递归得到路径)
sub GetLocalFile
{
my $dir = shift;
my $FilePath = shift;
#递归得到文件路径
opendir DH, $dir;
foreach my $file (readdir DH)
{
next if $file eq "." or $file eq "..";
$file = "$dir/$file";
if(-d $file)
{
&GetLocalFile($file,\\\\@$FilePath);
}
else
{
push @$FilePath,$file;
}
}
return 1;
}
#获得目录下的所有EXCEL文件
sub GetFileExcelFile
{
my @FilePathArray = @_;
my @ExcelFilePath;
foreach my $FilePath(@FilePathArray)
{
#文件不可读写也不存在的话过滤掉
unless(-r -w -e $FilePath)
{
next;
}
$FilePath =~ s/\\\\\\\\/\\\\//g;
#获得文件结束符
my $PointEndIndex = rindex($FilePath,".");
my $EndName = substr($FilePath,$PointEndIndex+1,length($FilePath)-$PointEndIndex-1);
#是Excel的结束符号
if($EndName =~ /xls|xlsx/i)
{
push @ExcelFilePath,$FilePath;
}
}
@ExcelFilePath;
}
#模块结束必须返回1
1;
package WriteExcelData;
use Win32::OLE; #导入win32 OLE包
use Win32::OLE::Const "Microsoft Excel";
#向Excel写入数据
#new一个对象出来
sub new
{
my $class = shift;
my $FilePath = shift @_;
#Excel文件不存在给出提示
die "the $ExcelPaht does notexit\\\\n" unless -e $FilePath;
#一个空的引用
#my $ref = {};
$excel =Win32::OLE->GetActiveObject('Excel.Application') || Win32::OLE->new('Excel.Application');
#使这个对象可见
$excel -> {Visible} = 0;
#打开一个Excel工作簿
$work = $excel-> Workbooks -> Open("$FilePath");
my $ref ={};
# 关掉Excel的提示,比如是否保存之类的。
$excel->{DisplayAlerts} = 'False';
bless($ref,$class);
#返回引用
return $ref;
}
#向Excel某个sheet写入一行数据
sub WriteRowDate
{
#对象自引用,行列起始位
my $ref = shift;
my $SheetName = shift;
my $RowBegin = shift;
my $CoulmnBegin = shift;
my @RowConten = @_;
#激活要导入数据的sheet
my $sheet = $work -> Worksheets($SheetName);
$sheet-> Activate;
foreach $CellContent(@RowConten)
{
$sheet->Cells($RowBegin, $CoulmnBegin)->{'Value'} = $CellContent;
$CoulmnBegin++;
}
$excel->Save;
1;
}
#向Excel某个sheet写入一列数据
sub WriteColDate
{
my $ref = shift;
my $SheetName = shift;
my $RowBegin = shift;
my $CoulmnBegin = shift;
my @ColConten = @_;
#激活要导入数据的sheet
my $sheet = $work -> Worksheets($SheetName);
$sheet-> Activate;
foreach $CellContent(@ColConten)
{
$sheet->Cells($RowBegin, $CoulmnBegin)->{'Value'} = $CellContent;
$RowBegin++;
}
$excel->Save;
1;
}
#退出Excel
sub ColseExcel
{
#退出EXCEL
$excel-> Quit;
1;
}
1;
useGetExcelData;
use WriteExcelData;
#获得二维数组的一维全部元素,第三个变量是得到元素的数组引用。
sub GetArrayValue
{
my($InputPoint,$iGetindex,$GetPoint) = @_;
my $count = 0;
#print "the array is @$InputPoint\\\\n";
foreach my $index (@$InputPoint)
{
# print "\\\\nEach Array value is @$index\\\\n";
if($iGetindex == $count)
{
push @$GetPoint,@$index;
return 1;
}
$count++;
}
0;
}
#new一个对象的引用
my $ExcelPoint = GetExcelData->new();
#获取本地路径下所有EXCEL数据
$ExcelPoint->GetAllExcelDate();
#获得导入的所有的Excel的名字
my @ExcelName;
@ExcelName = $ExcelPoint->GetExcelName();
#print "\\\\nExcel Name is @ExcelName\\\\n";
foreach my $ExcelIndex (@ExcelName)
{
my @SheetName = $ExcelPoint->GetExcelSheetName($ExcelIndex);
print "\\\\nsheet name is @SheetName\\\\n";
my @SheetRowDate = $ExcelPoint->GetExcelSheetRowDate($ExcelIndex,$SheetName,1);
my @SheetCoulmnDate = $ExcelPoint->GetExcelSheetCoulmnDate($ExcelIndex,$SheetName,1);
my $iRowNum = $ExcelPoint->GetExcelSheetRowNum($ExcelIndex,$SheetName);
my $iColNum = $ExcelPoint->GetExcelSheetColNum($ExcelIndex,$SheetName);
print "\\\\nsheet Row Date is @SheetRowDate\\\\n";
print "\\\\nsheet Coulmn Date is @SheetCoulmnDate\\\\n";
print "\\\\n行$iRowNum\\\\n";
print "\\\\n列$iColNum\\\\n";
}
页:
[1]