设为首页 收藏本站
查看: 796|回复: 0

[经验分享] perl EXCEL处理

[复制链接]

尚未签到

发表于 2018-8-31 07:21:08 | 显示全部楼层 |阅读模式
  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 not  exit\\\\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[0]};
  #判断获取的行号是否在行范围内
  unless($i_RowNum {$s_ExcelName}->{$s_SheetName}};
  #获取这个sheet有多少列,列数据存在第二位
  my $i_size = @{$ArrayTest[1]};
  #判断获取的行号是否在行范围内
  unless($i_ColNum {$s_ExcelName}->{$s_SheetName}};
  #获取这个sheet有多少行,行数据存在第一位
  my $i_Rowsize = @{$ArrayTest[0]};
  $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[1]};
  $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 not  exit\\\\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;
  use  GetExcelData;
  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[2],1);
  my @SheetCoulmnDate = $ExcelPoint->GetExcelSheetCoulmnDate($ExcelIndex,$SheetName[0],1);
  my $iRowNum = $ExcelPoint->GetExcelSheetRowNum($ExcelIndex,$SheetName[0]);
  my $iColNum = $ExcelPoint->GetExcelSheetColNum($ExcelIndex,$SheetName[0]);
  print "\\\\nsheet Row Date is @SheetRowDate\\\\n";
  print "\\\\nsheet Coulmn Date is @SheetCoulmnDate\\\\n";
  print "\\\\n行$iRowNum\\\\n";
  print "\\\\n列$iColNum\\\\n";
  }


运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-559060-1-1.html 上篇帖子: C++调用perl 主线程等待子线程结束 下篇帖子: PERL 文本处理
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表