2012-02-22 12 views
1

.iqyファイルの「データソース」にExcelファイル(.xlsx)が接続されています。私はPerlを使ってExcelファイルを開き、データを更新しました。最初は、私のコードが働いていました。しかし、私のスプレッドシートがリンクされていた.iqyファイルを変更する必要があり、これを実行するとPerlスクリプトが壊れているように見えます。私はPerlでWin32 :: OLEを使用してExcel 2010の.xlsxファイルを解析する際の問題

my $LastRow = $Sheet->UsedRange->Find({What=>"*", 
    SearchDirection=>xlPrevious, 
    SearchOrder=>xlByRows})->{Row}; 

を呼び出し、cmdの出力を読み取ると今では失敗します。「sharing.pl線20でHASHリファレンスとして未定義の値を使用することはできません」私はこれをデバッグしようとしましたが、デバッガでどこで問題が発生するのかを把握する方法を知るために、Win32 :: OLEモジュールの欠点については十分に分かりません。スクリプトのソースコードは、

#!/usr/bin/perl 
use Win32::OLE; 
use Win32::OLE qw(in with); 
use Win32::OLE::Variant; 
use Win32::OLE::Const 'Microsoft Excel'; 

$Excel = Win32::OLE->GetActiveObject('Excel.Application') || 
     Win32::OLE->new('Excel.Application'); 
$Excel->{'Visible'} = 0;  #0 is hidden, 1 is visible 
$Excel->{DisplayAlerts}=0; #0 is hide alerts 

# Open File and Worksheet 
my $Book = $Excel->Workbooks->Open ('C:\shareP\sp.xlsx'); # open Excel file 
$Sheet = $Book->Worksheets(1); 

# Refresh Data (ActiveWorkbook.RefreshAll) 
$Book->RefreshAll(); 

# Find Last Column and Row 
my $LastRow = $Sheet->UsedRange->Find({What=>"*", 
    SearchDirection=>xlPrevious, 
    SearchOrder=>xlByRows})->{Row}; 

my $LastCol = $Sheet->UsedRange->Find({What=>"*", 
       SearchDirection=>xlPrevious, 
       SearchOrder=>xlByColumns})->{Column}; 
####### EDIT: I initially didn't post this portion because it stops 
#  before reaching it unless I make $LastCol and $LastRow constants 
my @hasher; 
my $c = "a"; 
for (my $cn=1; $cn <= $LastCol; $cn++){ 
    for (my $r=2; $r <= $LastRow; $r++){ 
# stops here with same error if I make $LastCol and $LastRow constants 
     $hasher[$r-2]{ $Sheet->Range($c.'1')->{Value} } = $Sheet->Range($c.$r)->{Value}; 
    } 
$c++; 
} 
####### end of EDIT 
# Save as Excel 
$Book->Save(); 
$Book->Close(); 
$Excel->Quit(); 

ありがとうございます。私は本当にこれに固執しています。

答えて

1

あなたのfind関数が値を返さないと思います。私は2つの可能な説明があります。

1)おそらく、あなたの新しいソースデータは、もはや「*」の文字

2を含まない)検索機能は、間にいくつかの属性、すなわちLookInLookAtSearchOrderを使用しています覚えています。最良の結果を得るには、必要な機能を確実に得るために、これらの3つの属性を常に設定する必要があります。

私のアドバイスは、スプレッドシート上で手動で検索を実行し、それが機能するかどうかを確認することです。あなたのエラーはスクリプトのOLE部分にあるとは思わない。

+0

「*」がスクロールシート上で手動で実行されていることを確認します。とにかくそれに到達する前に停止して以来、私はsave()とclose()の前にこれよりも多くのコードを削除しました。私は "$ LastRow"と "$ LastCol"変数を定数にしようとしましたが、その後同じコードでコードが停止しました。 (私が投稿に追加したものを参照してください、私は最初にそれを残して申し訳ありません)。しかし、$ LastRowと$ LastColを定数として2回実行すると、2回目の実行時に動作します... 2回目の実行では、excelは最初の実行からまだ開いています。リーチに近づく()。 – user1226409

+0

あなたの追加情報が与えられました...私は、問題が何とか '$ Sheet'が空であることに関係していると推測します。番号ではなくテキスト名でワークシートを参照し、それが役立つかどうかを確認してください – Pynner

1

コードに短い休止を追加して問題を解決しました。 Excelシートが爽やかになる前に、perlスクリプトが進んでいました。ご協力ありがとうございました。

0

これはあなたのスプレッドシートの1つが空であるためだと思います。 列と行の合計数を取得するより良い方法は、

my $Tot_Rows= $Sheet->UsedRange->Rows->{'Count'}; 

my $Tot_Cols= $Sheet->UsedRange->Columns->{'Count'}; 
関連する問題