構文 |
$PATH = "."; #Excelファイルのあるフォルダーのパス名(この例ではカレントフォルダー) $file = "test.xlsx"; #読み書き対象のエクセルファイル名 # ****** モジュールのインポート ****** use Win32::OLE qw(in with); use Win32::OLE::Const 'Microsoft Excel'; use Win32::OLE::Variant; #日付を扱うのに必要 # ****** アプリケーションオブジェクトの取得 ****** #開いているExcelオブジェクトを取得 #Excelが起動していない場合は"Excelが起動していません"とメッセージを表示して終了する。 $Excel = Win32::OLE->GetActiveObject('Excel.Application') or die "Excelが起動していません\n"; $Excel->{DisplayAlerts} = 'False'; #警告を表示しない # ****** ブックを開く ****** $Book = $Excel->ActiveWorkBook; #現在開いてアクティブになっているワークブック(ファイル)を選択 $Sheet = $Book->ActiveSheet; #アクティブになっていたワークシートを選択 # ここに処理を書く exit; |
構文 |
$PATH = "."; #Excelファイルのあるフォルダーのパス名(この例ではカレントフォルダー) $file = "test.xlsx"; #読み書き対象のエクセルファイル名 # ****** モジュールのインポート ****** use Win32::OLE qw(in with); use Win32::OLE::Const 'Microsoft Excel'; use Win32::OLE::Variant; #日付を扱うのに必要 use Cwd 'abs_path'; #相対パスを絶対パスに変換するのに必要 # ****** アプリケーションオブジェクトの取得 ****** $Excel = Win32::OLE->new('Excel.Application', 'Quit'); #バックグラウンドでExcelを起動 $Excel->{DisplayAlerts} = 'False'; #警告を表示しない # ****** ブックを開く ****** # MS-Excelでファイルを開くときに相対パスでファイル名を指定すると、 # Perlプログラムを起動したフォルダーからの相対パスではなく、 # Excelで既定のファイル場所に指定したフォルダー(通常 Documents) # からの相対パスになるので、ファイル名は絶対パスで指定する。 $pathname = abs_path(join("/",$PATH, $file)); #ファイルの絶対パスを求める $Book = $Excel->Workbooks->Open($pathname); #Excelファイルを開く # ここに処理を書く $Book->Save(); #開いたExcelファイルを上書き保存する $Book->Close(); #開いたExcelファイルを閉じる $Excel->Quit(); #Excelを終了する exit; |
構文 | $Sheet = $Book->Worksheets("Sheet1"); |
例1 | 一つのワークシートを処理するとき $Book = $Excel->ActiveWorkBook; #ブックを指定する $Sheet = $Book->Worksheets("Sheet1"); # ここに処理を書く |
例2 | 複数のワークシートを処理するとき $Book = $Excel->ActiveWorkBook; #ブックを指定する $Sheet_a = $Book->Worksheets("Sheet1"); $Sheet_b = $Book->Worksheets("Sheet2"); $Sheet_c = $Book->Worksheets("Sheet3"); # ここに処理を書く |
構文 | $Sheet = $Book->Worksheets(1); ワークシートは左から順番に1, 2,3, ...の番号で指定出来る |
例1 | 全てのワークシートを順番に処理するときは次のようにする $Book = $Excel->ActiveWorkBook; #ブックを指定する $SheetCount = $Book->Worksheets->Count(); #ワークシートの個数を求める for($i=1; $i <= $SheetCount; $i++) { $Sheet = $Book->Worksheets($i); $SheetName = $Sheet->Name; # 現在のシートの名前を取得 # ここに処理を書く } |
構文 | $Book->Worksheets(n)->Select(); 左からn番目のワークシートを選択状態にする |
例1 | 左から2番目のワークシートを選択状態にし 値を取り出して画面に表示する $Book = $Excel->ActiveWorkBook; #ブックを指定する $Book->Worksheets(2)->Select(); #ワークシートを選択状態にする $x = $Book->ActiveSheet->Range("A2")->{Value}; #セルA2の値を取り出す print $x, "\n"; #取り出した値を画面に表示する ワークシートを選択状態にすると、Excl画面上にそのワークシートが表示されるので、 実行状態の確認がしやすいという利点がある。 Excl画面で確認する必要がない場合は単に $x = $Book->Worksheets(2)->Range("A2")->{Value}; print $x, "\n"; とするほうがプログラムが簡単で、画面表示がない分処理も多少早くなる。 |
例1 | 指定したワークシートの前(左側)に追加する $Book = $Excel->ActiveWorkBook; #ブックを指定する $Sheet = $Book->Worksheets("Sheet1"); #ワークシートを指定 $Sheet_a = $Book->WorkSheets->Add({ Before => $Sheet }); #ワークシートを追加 |
例2 | 指定したワークシートの後(右側)に追加する $Book = $Excel->ActiveWorkBook; #ブックを指定する $Sheet = $Book->Worksheets("Sheet1"); #ワークシートを指定 $Sheet_a = $Book->WorkSheets->Add({ After => $Sheet }); #ワークシートを追加 |
例3 | 一番前(左側)に追加する $Book = $Excel->ActiveWorkBook; #ブックを指定する $Sheet_a = $Book->WorkSheets->Add( { Before => $Book->Worksheets(1) }); #ワークシートを追加 |
例4 | 一番前(右側)に追加する $Book = $Excel->ActiveWorkBook; #ブックを指定する $Sheet_a = $Book->WorkSheets->Add( { After => $Book->Worksheets($Book->Worksheets->Count()) }); #ワークシートを追加 |
例1 | 指定したワークシートの前(左側)に移動する $Book = $Excel->ActiveWorkBook; #ブックを指定する $Sheet1 = $Book->Worksheets("Sheet1"); #ワークシートを指定 $Sheet3 = $Book->Worksheets("Sheet3"); #ワークシートを指定 $Sheet1->Move({ Before => $Sheet3 }); #ワークシートを移動 Sheet1がSheet3の前に移動される |
例2 | 指定したワークシートの後(右側)に移動する $Book = $Excel->ActiveWorkBook; #ブックを指定する $Sheet1 = $Book->Worksheets("Sheet1"); #ワークシートを指定 $Sheet3 = $Book->Worksheets("Sheet3"); #ワークシートを指定 $Sheet1->Move({ After => $Sheet3 }); #ワークシートを移動 Sheet1がSheet3の後に移動される |
例3 | ワークシートを左から昇順に並べ替えるプログラム MS-Excelで並べ替えるファイルを開いてからこのプログラムを起動する use Win32::OLE qw(in with); #OLEを使用する use Win32::OLE::Const 'Microsoft Excel'; #エクセルのデータを扱う #アプリケーションオブジェクトの取得 $Excel = Win32::OLE->GetActiveObject('Excel.Application') or die "Excelが起動していません\n"; $Excel->{DisplayAlerts} = 'False'; #警告を表示しない $Book = $Excel->ActiveWorkBook; #ブックを指定する $SheetCount = $Book->Worksheets->Count(); #ワークシート数を取得 print "sheetcount= $SheetCount\n"; #ワークシート名を取得 for($i = 1; $i <= $SheetCount; $i++ ) { push(@SheetNames, $Book->Worksheets($i)->Name); } @SheetNames = sort(@SheetNames); #昇順に並べ替えるときに使う # @SheetNames = reverse(sort(@SheetNames)); #降順に並べ替えるときはこちらを使う unshift(@SheetNames, " "); #先頭にダミーを入れる #並べ替え for($i = 1; $i < $SheetCount; $i++ ) { $Book->Worksheets($SheetNames[$i])->Move({ Before => $Book->Worksheets($i)}); print "$i ", $SheetNames[$i], "\n"; } exit; |
例1 | 指定したワークシートの前(左側)にコピーする $Book = $Excel->ActiveWorkBook; #ブックを指定する $Sheet1 = $Book->Worksheets("Sheet1"); #ワークシートを指定 $Sheet2 = $Book->Worksheets("Sheet2"); #ワークシートを指定 $Sheet1->Copy({ Before => $Sheet2 }); #ワークシートをコピー Sheet1がSheet2の前にコピーされる |
例2 | 指定したワークシートの後(右側)にコピーする $Book = $Excel->ActiveWorkBook; #ブックを指定する $Sheet1 = $Book->Worksheets("Sheet1"); #ワークシートを指定 $Sheet2 = $Book->Worksheets("Sheet2"); #ワークシートを指定 $Sheet1->Copy({ After => $Sheet2 }); #ワークシートをコピー Sheet1がSheet2の後にコピーされる |
例1 | 左から2番目のワークシートを削除する $Excel->{DisplayAlerts} = 'False'; #警告を表示しない $Book = $Excel->ActiveWorkBook; #ブックを指定する $Book->Worksheets(2)->Delete; #ワークシートを削除 「警告を表示しない」にしておかないと、削除する都度確認のダイアログが表示される。 |
例2 | シート名"sheet1"のワークシートを削除する $Excel->{DisplayAlerts} = 'False'; #警告を表示しない $Book = $Excel->ActiveWorkBook; #ブックを指定する $Book->Worksheets("sheet1")->Delete; #ワークシートを削除 「警告を表示しない」にしておかないと、削除する都度確認のダイアログが表示される。 |
構文1 | $x = $Sheet->Range("A2")->{Value}; |
構文2 | $x = $Sheet->Cells(2,1)->{Value}; |
例 | 例1と例2は同じ意味になります 例1 Range()によるセルの指定 $x2 = $Sheet->Range("A2")->{Value}; $x3 = $Sheet->Range("A3")->{Value}; 例2 Cells()によるセルの指定 $x2 = $Sheet->Cells(2,1)->{Value}; $x3 = $Sheet->Cells(3,1)->{Value}; Range()では、Excelの画面表示と同じなので、対応がわかりやすい利点があります。 Cells()では、最初の引数が行番号、2番目の引数が列番号を表します 行、列ともに数値で指定するので、繰り返し構文を使ってセルを順次処理するのに便利です。 |
構文1 | $a = $Sheet->Range("A2:D4")->{Value}; 注) $a には2次元配列へのリファレンスが代入される |
構文2 | $a = $Sheet->Range($Sheet->Cells(2,1),$Sheet->Cells(4,4))->{Value}; 注)構文1を Cells を使ってあらわしたもの |
例1 | 次のようにすると読み込んだ値を画面に表示することが出来る $a = $Sheet->Range("A2:D4")->{Value}; #$a には2次元配列へのリファレンスが代入される print "配列の大きさ= ",$#{$a}+1, "行", $#{${$a}[0]}+1, "列\n"; for($i=0; $i<=$#{$a}; $i++) { for($j=0; $j<=$#{${$a}[0]}; $j++) { print ${$a}[$i][$j], " "; } print "\n"; } |
例2 | リファレンスのままで扱うより別の配列に代入したほうがわかりやすいかもしれません。 $a = $Sheet->Range("A2:D4")->{Value}; #$a には2次元配列へのリファレンスが代入される @b = @{$a}; #@b には$aが参照していた2次元配列の値が代入される print "配列の大きさ= ",$#b+1, "行", $#{$b[0]}+1, "列\n"; for($i=0; $i<=$#b; $i++) { for($j=0; $j<=$#{$b[0]}; $j++) { print $b[$i][$j], " "; } print "\n"; } |
構文 | $a = $Sheet->Range("A2")->{Value}->Date("yyyy/MM/dd"); $a = $Sheet->Range("A2")->{Value}->Time("HH:mm:ss"); 読み込んだセルに日付や時刻が書き込まれていた場合は、Date()やTime()で書式を整えた文字列にすることが出来ます。 |
日付 | 日付の書式指定には次のものが使えます d 日 1桁または2桁表示 dd 日 2ケタ表示(1日から9日は 01,02, のように0が付く) ddd 曜日 日本語環境では月,火のように1文字で表す(英語環境ではアルファベット3文字の省略形) dddd 曜日 日本語環境では月曜日,火曜日のように表す(英語環境では省略なしのアルファベット) M 月 1桁または2桁表示 MM 月 2桁表示(1日から9日は 01,02, のように0が付く) MMM 月 日本語環境では M と同じになる(英語環境ではアルファベット3文字の省略形) MMMM 月 日本語環境では 1月 2月のように数字の後ろに月が付く(英語環境では省略なしのアルファベット) y 年 西暦の下2桁表示 yy 年 西暦の下2桁表示(0年から9年は 00, 01 のように0月が付く) yyyy 年 西暦4桁表示 gg period/era string 注意 大文字と小文字は意味が違うので MM を mm と書いてはいけません。 MS-Excel では日付の起点を1900年1月1日としているので、1899年以前の日付は表示されません。 |
時刻 | 時刻の書式指定には次のものが使えます h 12時間制の時 1桁または2桁表示 hh 12時間制の時 2ケタ表示(1時から9時は 01,02, のように0が付く) H 24時間制の時 1桁または2桁表示 HH 24時間制の時 2ケタ表示(0時から9時は 00,01, のように0が付く) m 分 1桁または2桁表示 mm 分 2ケタ表示(0分から9分は 00,01, のように0が付く) s 秒 1桁または2桁表示 ss 秒 2ケタ表示(0秒から9秒は 00,01, のように0が付く) t 午前または午後の1桁表示 日本語環境では使えない(英語環境ではAまたはP) tt 午前または午後(英語環境ではAM または PM) 注意 大文字と小文字は意味が違うので HH を hh と書いてはいけません 12時間制では0時の表示はない。必ず1時から12時になる |
構文1 | $Sheet->Range("A2")->{Value} = "abc"; |
構文2 | $Sheet->Cells(2,1)->{Value} = "abc"; |
例 | 例1と例2は同じ意味になります 例1 Range()によるセルの指定 $Sheet->Range("A2")->{Value} = "ABC"; $Sheet->Range("A3")->{Value} = "DEF"; 例2 Cells()によるセルの指定 $Sheet->Cells(2,1)->{Value} = "ABC"; $Sheet->Cells(3,1)->{Value} = "DEF"; Range()では、Excelの画面表示と同じなので、対応がわかりやすい利点があります。 Cells()では、最初の引数が行番号、2番目の引数が列番号を表します 行、列ともに数値で指定するので、繰り返し構文を使ってセルを順次処理するのに便利です。 |
構文1 | $Sheet->Range("A2:C3")->{Value} = [["abc","def","ghi"], ["ABC","DEF","GHI"]]; 注)複数のセルにまとめて値を代入するときは右辺に2次元配列へのリファレンスをおく。 [ ] で囲ったものは、名前のない配列へのリファレンスとなる。 |
構文2 | $Sheet->Range($Sheet->Cells(2,1),$Sheet->Cells(3,3))->{Value} = [["abc","def","ghi"], ["ABC","DEF","GHI"]]; 注)構文1を Cells を使ってあらわしたもの |
構文3 | $a[0][0] = "abc"; $a[0][1] = "def"; $a[0][2] = "ghi"; $a[1][0] = "ABC"; $a[1][1] = "DEF"; $a[1][2] = "GHI"; $Sheet->Range("A2:C3")->{Value} = \@a; 注)複数のセルにまとめて値を代入するときは右辺に2次元配列へのリファレンスをおく。 配列名の前に \ を付けると、配列へのリファレンスとなる。 |
構文4 | $a[0][0] = "abc"; $a[0][1] = "def"; $a[0][2] = "ghi"; $a[1][0] = "ABC"; $a[1][1] = "DEF"; $a[1][2] = "GHI"; $Sheet->Range($Sheet->Cells(2,1),$Sheet->Cells(3,3))->{Value} = \@a; 注)構文3を Cells を使ってあらわしたもの |
構文 | $Sheet->Range("A2")->{Value} = Variant(VT_DATE, "2012/02/25"); |
例1 | 日付を代入する $Sheet->Range("A2")->{Value} = Variant(VT_DATE, "2012/02/25"); 日付の並べ方は、日本、米国、欧州でそれぞれ異なる。 日本語環境で試したところ、日本、米国、欧州の優先順位で解釈されていた。 第1優先:日本式に年/月/日の順番で解釈できるものは日本式に解釈される 例 2012/02/25 は 2012年2月25日になる 12/02/25 は 2012年2月25日 第2優先:日本式に解釈できず、米国式の月/日/年で解釈できるものは、米国式に解釈される 例 02/04/2012 は 2012年2月4日になる 02/04/99 は 1999年2月4日になる 第3優先:日本式、米国式ともに解釈できず欧州式の日/月/年で解釈できるものは、欧州式で解釈される 例 15/2/2001 は 2001年2月15日になる |
例2 | 時刻を代入する $Sheet->Range("A2")->{Value} = Variant(VT_BSTR, "3:24:15 PM"); 時間の表し方は12時間制と24時間制がある 第1優先:AMやPMを指定した時は12時間制で解釈される 例 3:24:15 PM は 午後3時24分15秒になる 第2優先:AMやPMを指定しなかった場合は24時間制で解釈される 例 3:24:15 は 午前3時24分15秒になる 15:24:15 は 午後3時24分15秒になる |
例3 | 日付と時刻を代入する $Sheet->Range("A2")->{Value} = Variant(VT_DATE, "2014/3/1 3:24:15 PM"); |
例 | TRUE が書き込まれたセルの値を読み込むと値は数値の 1 となります FALSE が書き込まれたセルの値を読み込むと値は数値の 0 となります perlでは、0または長さゼロの文字列をFALSEと扱い、それ以外をTRUEと扱うので そのまま論理式の中に書くことが出来ます。 if( $Sheet->Range("A2")->{Value} ) { # TRUEの場合の処理を書く }else{ # FALSEの場合の処理を書く } |
例1 | セルに TRUE を代入(書き込む) $Sheet->Range("A2")->{Value} = Variant(VT_BOOL, 1); # ゼロ以外を変換すると TRUE になる |
例2 | セルに FALSE を代入(書き込む) $Sheet->Range("A2")->{Value} = Variant(VT_BOOL, 0); # ゼロを変換すると FALSE になる |
例1 | #Range により対象セルを指定する方法 #次のようにするとセル A2 に設定されているハイパーリンクを画面に表示することが出来る $a = $Sheet->Range("A2")->Hyperlinks(1)->{Address}; #リンク先アドレスを参照 print $a, "\n"; #リンク先アドレスを画面に表示する |
例2 | #Cells により対象セルを指定する方法 #次のようにしてもセル A2 に設定されているハイパーリンクを画面に表示することが出来る $a = $Sheet->Cells(2,1)->Hyperlinks(1)->{Address}; #リンク先アドレスを参照 print $a, "\n"; #リンク先アドレスを画面に表示する |
例1 | #Range により対象セルを指定する方法 #次のようにするとセル A2 にハイパーリンクを設定することが出来る #但し、セルに値が入っていると、「セルに表示する文字列」は無視され、 #入っていた値が維持されるので、あらかじめセルの値を空文字列に設定しておくと良い。 $Sheet->Range("A2")->{Value} = ""; #ハイパーリンクを設定するセルの値を空文字列に設定 $Sheet->Hyperlinks->Add({Anchor => $Sheet->Range("A2"), #ハイパーリンクを設定するセルを指定 Address => "http://www.nasupii.net/", #リンク先 TextToDisplay => "nasupii.net", #セルに表示する文字列 ScreenTip => 'NasupiiのPerl書抜帳'}); #セルにマウスを重ねたとき表示する文字列 |
例2 | #Cells により対象セルを指定する方法 #次のようにしてもセル A2 にハイパーリンクを設定することが出来る #但し、セルに値が入っていると、「セルに表示する文字列」は無視され、 #入っていた値が維持されるので、あらかじめセルの値を空文字列に設定しておくと良い。 $Sheet->Cells(2,1)->{Value} = ""; #ハイパーリンクを設定するセルの値を空文字列に設定 $Sheet->Hyperlinks->Add({Anchor => $Sheet->Cells(2,1), #ハイパーリンクを設定するセルを指定 Address => "http://www.nasupii.net/", #リンク先 TextToDisplay => "nasupii.net", #セルに表示する文字列 ScreenTip => 'NasupiiのPerl書抜帳'}); #セルにマウスを重ねたとき表示する文字列 |
例1 | #Range により対象セルを指定する方法 #次のようにするとセル A2 に設定されているハイパーリンクを削除することが出来る #なお、ハイパーリンクを削除してもセルの値は削除されずに残るが、 #セルの書式設定は削除される $Sheet->Range("A2")->Hyperlinks->Delete; #ハイパーリンクを削除 |
例2 | #Cells により対象セルを指定する方法 #次のようにしてもセル A2 に設定されているハイパーリンクを削除することが出来る $Sheet->Cells(2,1)->Hyperlinks->Delete; #ハイパーリンクを削除 |