2012年10月5日金曜日

◆Excel無しにExcelファイルを作る4(EPPlusバージョン)

前回EPPlusというパッケージの情報があったのでこれを使ってみる。

EPPlus-Create advanced Excel 2007 spreadsheets on the server

名前からしてもExcelPackeageのPlusなので、こちらの方が偉そうだ。

最終更新日が2007年のExcelPackeageに比べ、こちらは2012年9月と今でも開発が継続されていそうなので機能・品質ともに期待できる。

ちょこちょこ調べながら使ってみたが、あまり悩むことも無く簡単に使えた。
書式も結構自由に設定できるのでサーバーでちょっとしたレポートを作るには十分といった感じ。

品質的にも日本仕様でちょっとうまくいかない(金額の$編集は出来るが\編集ができない)ことが有ったが、ExcelPackeageよりはかなり良さげ。

難しくないのでサンプルソースだけUPしておく。

001
002
003
004
005
006
007
008
009
010
011
012
013
014
015
016
017
018
019
020
021
022
023
024
025
026
027
028
029
030
031
032
033
034
035
036
037
038
039
040
041
042
043
044
045
046
047
048
049
050
051
052
053
054
055
056

#Excelモジュールロード
$scriptPath = Split-Path $myInvocation.MyCommand.path 
$dllPath = Join-Path $scriptPath "dll\EPPlus" |
 
 
Join-Path -ChildPath EPPlus.dll 
[Reflection.Assembly]::LoadFrom($dllPath) | Out-Null

#Excelシート作成
$filePath = join-path ([Environment]::GetFolderPath("desktop")) "test.xlsx"
if(test-path $filepath){del $filePath}
$excel = New-Object OfficeOpenXml.ExcelPackage -ArgumentList 
$filePath
$sheet
 = $excel.Workbook.Worksheets.Add("テストシート1")

$sheet.Cells["A1"].Value = "NO"
$sheet.Cells["A1"].Style.Font.Bold = 
$true

$cell
 = $sheet.Cells.Item(1,2) 
$sheet.Cells.Item(1,2).Value = "名前"
$sheet.Cells.Item(1,2).Style.Font.Size = 18
$cell.Style.Font.Name = "メイリオ"
$cell.Style.Font.Color.SetColor("red")
$cell.Style.Fill.PatternType = [OfficeOpenXml.Style.ExcelFillStyle]::Solid
$cell.Style.Fill.BackgroundColor.SetColor([Drawing.Color]::Green)
$cell.Style.Border.BorderAround([OfficeOpenXml.Style.ExcelBorderStyle]::Thick)

$sheet.Cells["C1"].Value = "住所"
$sheet.Cells.Item(2,1).Value = 1
$sheet.Cells.Item(2,2).Value = "原辰則"
$sheet.Cells.Item(2,3).Value = "田園調布"
$sheet.Cells.Item(3,1).Value = 2
$sheet.Cells.Item(3,2).Value = "中畑清"
$sheet.Cells.Item(3,3).Value = "所沢"

$sheet.Cells["D1"].Value = "年棒"
$sheet.Cells["D2"].Value = 1200000
$sheet.Cells["D2"].Style.Numberformat.Format = "#,##0"
$sheet.Cells["D2"].Style.Font.Name = "メイリオ"
$sheet.Cells["D3"].Value = 4200000
$sheet.Cells["D3"].Style.Numberformat.Format = "#,##0"

$sheet.Cells["A4"].Formula = "SUM(A2:A3)"
$sheet.Cells["B4"].Formula = "A2+A3"

$sheet.Cells["A1:D1"].Style.HorizontalAlignment =
 
 
[OfficeOpenXml.Style.ExcelHorizontalAlignment]::Center

$sheet.Cells["A2:C3"].Style.Border.Left.Style =
 
 
[OfficeOpenXml.Style.ExcelBorderStyle]::Dotted
$sheet.Cells["A2:C3"].Style.Border.Top.Style =
 
 
[OfficeOpenXml.Style.ExcelBorderStyle]::Dotted
$sheet.Cells["A2:C3"].Style.Border.Right.Style =
 
 
[OfficeOpenXml.Style.ExcelBorderStyle]::Dotted
$sheet.Cells["A2:C3"].Style.Border.Bottom.Style =
 
 
[OfficeOpenXml.Style.ExcelBorderStyle]::
Dotted
 

$excel.Save()
$excel.Dispose()

結果は、こんな感じのExcelが出来上がる。

image

いい感じ。

なぜか、Windows8では依存関係ファイルが見つからないといってDLLがロードできなかったが(C#ではOK)、サーバー側は当面2012にはならないので良しとした。

また、ExcelPackeageではテンプレートファイルを使ってExcelを作るケースが多かったのでEPPlusでも試してみたのだが、ExcelPackeageと同様の指定ではうまくいかなかった。

コンストラクタの定義を見ると、出力ファイル・テンプレートファイルともに「FileInfo」型をサポートしていたので、ファイルパスの文字列では無く、ちゃんと「FileInfo」オブジェクトを作ってアサインするとうまくいった。

#FileInfo作成(出力ファイル、テンプレートファイル)
$templateInfo = New-Object System.IO.FileInfo($templatePath)
$fileInfo = New-Object System.IO.FileInfo($filePath)

$excel = New-Object OfficeOpenXml.ExcelPackage -ArgumentList $fileInfo,$templateInfo
#$sheet = $excel.Workbook.Worksheets.Add("テストシート1")
$sheet = $excel.Workbook.Worksheets["sheet1"]

0 件のコメント:

コメントを投稿