use strict; use utf8; use encoding "shiftjis"; use Encode; use Win32::OLE; use Win32::OLE qw(in valof with); use Win32::OLE::Const 'Microsoft Excel'; use Win32::OLE::NLS qw(:DEFAULT :LANG :SUBLANG); use Jcode; # 変数設定 my $BookFilePath = 'C:\\temp\\Book.xls'; # 一時的にブックを保存する箇所 my $ChartFilePath = 'C:\\temp\\Chart.gif'; # チャートの出力先 my $ChartTitle = $ARGV[1]; my $ChartName = 'グラフ 1'; my $SheetName = 'Sheet1'; my $ChartWidth = 400; my $ChartHeight = 300; my $ChartareaBackground = 0xFFFFFF; my $PlotareaBackground = $ChartareaBackground; # データ作成 my $TextData = $ARGV[0]; my $Xsize; # データのX方向要素数 my $Ysize; # データのY方向要素数 my @ColumnTextData = split(/\;/, $TextData); my @DataArray; $Ysize = @ColumnTextData; foreach (@ColumnTextData) { my @EachTextData = split(/,/); $Xsize = @EachTextData; push @DataArray, \@EachTextData; } my $data = \@DataArray; # OLEオブジェクト取得 my $Excel = Win32::OLE->GetActiveObject('Excel.Application') || Win32::OLE->new('Excel.Application'); $Excel->{Visible} = 1; # ワークシート作成 my $Book = $Excel->Workbooks->Add; my $Sheet = $Book->Worksheets(1); # 値をセルに代入 my $Range = $Sheet->Range("A1:B$Ysize"); $Range->{Value} = $data; # チャート追加 my $Chart = $Excel->Charts->Add; $Chart->{ChartType} = xl3DPieExploded; # 円グラフ $Chart->SetSourceData({Source => $Range, PlotBy => xlColumns}); # チャートをシートとして作成する場合 #$Chart->Location(xlLocationAsNewSheet, $ChartName); # オブジェクトとして作成した場合はExcelのバグに注意 $Chart->Location(xlLocationAsObject, $SheetName); $Chart = $Excel->ActiveChart; # タイトル $Chart->{HasTitle} = 1; $Chart->ChartTitle->{Text} = $ChartTitle; # グラフの位置とサイズ # シートとしてグラフを作成した場合にはExcelのデフォルト文書設定に依存 $Sheet->Shapes($ChartName)->IncrementLeft( -131.25); $Sheet->Shapes($ChartName)->IncrementTop( -98.25); my $WidthRatio = $ChartWidth / $Sheet->ChartObjects($ChartName)->Chart->ChartArea->Width; my $HeightRatio = $ChartHeight / $Sheet->ChartObjects($ChartName)->Chart->ChartArea->Height; $Sheet->ChartObjects($ChartName)->Activate; $Chart->Select; $Sheet->Shapes($ChartName)->ScaleHeight( $WidthRatio, 0, 0); $Sheet->Shapes($ChartName)->ScaleWidth( $HeightRatio, 0, 0); # フォント $Chart->ChartArea->Font->{Name}='MS Pゴシック'; $Chart->ChartArea->Font->{Size}=24; $Chart->ChartArea->Font->{Bold}=0; # 領域の色と周囲の色 $Chart->PlotArea->Interior->{Color} = $PlotareaBackground; # RGB(255,255,255)指定でも可 $Chart->PlotArea->Border->{ColorIndex} = xlNone; $Chart->ChartArea->Interior->{Color} = $ChartareaBackground; $Chart->ChartArea->Border->{ColorIndex} = xlNone; # チャートをGIF保存 $Chart->Export( $ChartFilePath, 'GIF'); # 一時的に保存し、さらに保存し直すことで、終了時にダイアログを出さない $Book->SaveAs($BookFilePath); $Book->Save; $Book->Close; # 不要ファイル削除 unlink($BookFilePath); ########################################################################## # RGB指定用サブルーチン sub RGB { my ($red, $green, $blue) = @_; return $red | ($green<<8) | ($blue<<16); }