免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 5776 | 回复: 4
打印 上一主题 下一主题

求助:Win32::OLE(0.1709) error 0x80010108 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-01-24 11:06 |只看该作者 |倒序浏览
本帖最后由 leo870625 于 2011-01-24 11:10 编辑
  1. #!/usr/bin/perl

  2. use strict;            # Declare using Perl strict syntax
  3. use DBI;               # If you are using other Perl's package, declare here
  4. use DBD::Teradata;
  5. use Data::Dumper;
  6. use Win32::OLE;# qw(in with);
  7. #use Win32::OLE::Const 'Microsoft Excel';
  8. #use Win32::OLE::Variant;
  9. $Win32::OLE::Warn = 3;

  10. my $AUTO_HOME  = $ENV{"AUTO_HOME"};
  11. my $AUTO_ETC   = "$AUTO_HOME/etc";
  12. my $AUTO_EXCEL = "D:\\perl_script";
  13. my $ETLDB      = "PTEMP";#$ENV{"AUTO_DB"};                                #The repository database of ETL.
  14. my $DSOURCE    = $ENV{"AUTO_DSN"};

  15. my $DIRDELI;
  16. my $LOGON_FILE;
  17. my $LOGON_STR;
  18. my $INS_SQL = "";
  19. my $DEL_SQL = "";
  20. my $os = $^O;
  21. $os =~ tr [A-Z][a-z];

  22. if ( $os eq "mswin32" ) {
  23.                 $DIRDELI = "\\";
  24.                 unshift(@INC, "$AUTO_HOME\\bin");
  25.                 require etl_nt;
  26.         } else {
  27.                 $DIRDELI = "/";
  28.                 unshift(@INC, "$AUTO_HOME/bin");
  29.                 require etl_unix;
  30.         }

  31. sub trimstr {
  32.                 my @out = @_;
  33.                 for (@out) {
  34.                     s/^\s+//;          # trim left
  35.                     s/\s+$//;          # trim right
  36.                 }
  37.                 return @out == 1
  38.                           ? $out[0]   # only one to return
  39.                           : @out;     # or many
  40.         }
  41.        
  42. #处理从Excel中读取的单元格的信息,截取单元格开始和结束的空格
  43. sub transStr{
  44.                 my ($str)=@_;
  45.                 chomp $str;
  46.                 $str = trimstr($str);
  47.                 return $str;
  48.         }

  49. if ($ETLDB eq '') {
  50.                 $ETLDB = 'PETL';
  51.         }

  52. sub DBconnect() {
  53.                 my ($logoncmd, $userpw) = split(' ',$LOGON_STR);
  54.                 chop($userpw);
  55.                
  56.                 my $tdpid;
  57.                 ($tdpid, $userpw) = split('/',$userpw);
  58.                 if ($userpw eq "") {
  59.                   $userpw=$tdpid;
  60.                 }
  61.                 my ($USER, $PASSWD) = split(',' , $userpw);
  62.                 my $dbh = DBI->connect("dbi:ODBC:${DSOURCE}", $USER, $PASSWD);
  63.                 unless ( defined($dbh) ) {
  64.                    #  sleep(60);
  65.                      $dbh = DBI->connect("dbi:ODBC:${DSOURCE}", $USER, $PASSWD);
  66.                      die "cann't connect database $!" unless(defined($dbh));
  67.                 }
  68.                 return $dbh;
  69.         }

  70. sub del_ins_Data {
  71.                 my ($sqlText) = @_;
  72.                 my $dbh = DBconnect();

  73.                 my $sth = $dbh->prepare($sqlText);
  74.                 my $ret = $sth->execute();
  75.                 $sth->finish();
  76.                 $dbh->disconnect();
  77.         }

  78. #遍历目录,找到该目录下的所有符合要求的excel文件,对每一个文件调用ReadExcel函数,
  79. #符合要求的Excel文件是指:文件名包含"供数接口FTP配置信息"的文件
  80. sub readExcel {
  81.                 my $CurrentDir = ${AUTO_EXCEL};
  82.                 $CurrentDir =~ s/\//\\/g;
  83.                 my ($Excel,$Book,$Sheet);
  84.                 $Excel = (Win32::OLE -> GetActiveObject('Excel.Application')
  85.                     || Win32::OLE -> new('Excel.Application', 'Quit')) or die "errors\n";

  86.                 my @dirs = ($CurrentDir);
  87.                 my($DIR, $FILE);
  88.                 while($DIR = pop(@dirs)){
  89.                         local *DH;
  90.                         opendir(DH,$DIR)||die "Can not open the $DIR dir.";
  91.                         foreach(readdir DH){
  92.                                 if($_ eq '.' || $_ eq '..'){
  93.                                                 next;
  94.                                         }
  95.                                         $FILE = $_;
  96.                                         if(($FILE =~ /.xls$/) and ($FILE =~ /供数接口FTP配置信息/)){
  97.                                                 $Book = $Excel->Workbooks->Open("${CurrentDir}${DIRDELI}${FILE}") or die $!;
  98.                                                 my $sheetCnt = $Book->Worksheets->Count();
  99.                                                 my $pos = 1;
  100.                                                 my $sheetName;
  101.                                
  102.                                                 #Find all sheets in the current excel.
  103.                                                 while( $pos <= $sheetCnt ){
  104.                                                         $Sheet = $Book->Worksheets($pos);
  105.                                                         $Sheet -> Activate();
  106.                                                         $sheetName = trimstr($Sheet -> {name});
  107.                                                         chomp $sheetName;
  108.                                                         if( $sheetName eq '供数接口FTP配置信息' ) {
  109.                                                                         my $i = 2;
  110.                                                                         my $j = 1;
  111.                                                                         my ($ETL_SYSTEM,$ETL_JOB,$REMOTE_HOST,$LOGON_FILE,$REMOTE_PATH,$DESCRIPTION_T,$ENABLE);
  112.                                                                        
  113.                                                                         $DEL_SQL = "DELETE FROM ${ETLDB}.FTP_TABLE_INFO;";
  114.                                                                         del_ins_Data(${DEL_SQL});
  115.                                                                         while (1) {
  116.                                                                                         if( trimstr($Sheet->Cells($i,1)->{'Value'}) eq '' ){
  117.                                                                                                 last;
  118.                                                                                         }
  119.                                                                                         $ETL_SYSTEM     = $Sheet->Cells($i,$j)->{'Value'};
  120.                                                                                         $ETL_JOB        = $Sheet->Cells($i,$j+1)->{'Value'};
  121.                                                                                   $REMOTE_HOST    = $Sheet->Cells($i,$j+2)->{'Value'};
  122.                                                                                   $LOGON_FILE     = $Sheet->Cells($i,$j+3)->{'Value'};
  123.                                                                                   $REMOTE_PATH    = $Sheet->Cells($i,$j+4)->{'Value'};
  124.                                                                                   $DESCRIPTION_T  = $Sheet->Cells($i,$j+5)->{'Value'};
  125.                                                                                   $ENABLE         = $Sheet->Cells($i,$j+6)->{'Value'};
  126.                                                                                   
  127.                                                                                   $ETL_SYSTEM     = transStr($ETL_SYSTEM);
  128.                                                                                         $ETL_JOB        = transStr($ETL_JOB);
  129.                                                                                         $REMOTE_HOST    = transStr($REMOTE_HOST);
  130.                                                                                         $LOGON_FILE     = transStr($LOGON_FILE);
  131.                                                                                         $REMOTE_PATH    = transStr($REMOTE_PATH);
  132.                                                                                         $DESCRIPTION_T  = transStr($DESCRIPTION_T);
  133.                                                                                         $ENABLE         = transStr($ENABLE);
  134.                                                                                        
  135.                                                                                         $INS_SQL = "INSERT INTO ${ETLDB}.FTP_TABLE_INFO(ETL_SYSTEM,ETL_JOB,REMOTE_HOST,LOGON_FILE,REMOTE_PATH,DESCRIPTION_T,ENABLE) VALUES('$ETL_SYSTEM','$ETL_JOB','$REMOTE_HOST','$LOGON_FILE','$REMOTE_PATH','$DESCRIPTION_T','$ENABLE');";
  136.                                                                                         del_ins_Data(${INS_SQL});
  137.                                                                                         $i ++;
  138.                                                                                 }
  139.                                                                                 print "Inserted successfully!"
  140.                                                                 }
  141.                                                         $Book->Close();
  142.                                                         $Excel->Quit();
  143.                                                 }                        
  144.                                         }
  145.                                 }
  146.                                 closedir(DH);
  147.                         }
  148.         }

  149. sub main {
  150.                 readExcel();
  151.         }

  152. #####################################################################################################
  153. # ------------ program section ------------

  154. $LOGON_FILE = "${AUTO_HOME}/etc/LOGON_ETL";

  155. open(LOGONFILE_H, "${LOGON_FILE}");
  156. $LOGON_STR = <LOGONFILE_H>;
  157. close(LOGONFILE_H);

  158. # Get the decoded logon string
  159. $LOGON_STR = `${AUTO_HOME}/bin/IceCode.exe "$LOGON_STR"`;

  160. open(STDERR, ">&STDOUT");


  161. main();
复制代码
代码在上面。
运行脚本的时候一直报: Win32::OLE(0.1709) error 0x80010108: "" in METHOD/PROPERTYGET "Worksheets" at ins_excel_dat.pl line 122
请高手指点。

论坛徽章:
0
2 [报告]
发表于 2011-01-24 11:08 |只看该作者
这是运行的结果。

未命名.jpg (15.57 KB, 下载次数: 14)

未命名.jpg

论坛徽章:
0
3 [报告]
发表于 2011-01-24 11:11 |只看该作者
可是运行的结果又没有问题。

论坛徽章:
0
4 [报告]
发表于 2011-01-24 11:41 |只看该作者
我刚遇到这个问题,是Win32::OLE这个模块中Worksheets这个方法有问题,你重新安装一下这个模块就OK了。。

论坛徽章:
0
5 [报告]
发表于 2011-01-24 14:11 |只看该作者
我刚遇到这个问题,是Win32::OLE这个模块中Worksheets这个方法有问题,你重新安装一下这个模块就OK了。。
maborliu 发表于 2011-01-24 11:41



    谢谢你的回复!


我刚刚找到原因了。不是模块的问题。
报那个错是因为我把     $Book->Close();
                  $Excel->Quit();
位置放错了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP