PowerShell を使って、ExcelDataReader で Excel ファイルを読み込む
経緯
お客さまからいただく Excel ファイルを、あるフォーマットにするということを、手作業でちまちまやるのをやめたいので、ちょっとスクリプト書いてます
ググったら、「読み込むだけなら ExcelDataReader が速くていいぞー」「ExcelDataReader は xlsx だけではなくて、xls も読めるぞー」的なことを書いていて、ちょっと触ってみたくなったのです
環境
- Windows 10 Pro
 - PowerShell 5.1
 - ExcelDataReader 3.6.0
 - ExcelDataReader.DataSet 3.6.0
 
ライブラリのダウンロード
- 
ExcelDataReader
https://www.nuget.org/packages/ExcelDataReader/ - 
ExcelDataReader.Dataset
https://www.nuget.org/packages/ExcelDataReader.DataSet/ 
それぞれ、右メニューにある Download package から nuget パッケージをダウンロードして、拡張子を zip に変えて解凍後、DLL を取り出した
Excel ファイルの準備
サンプルで Excel ファイル (test.xlsx) を作りました
「商品」と「従業員」というシートを作って、それぞれ適当なデータを入れています
Excel データの読み込み
DLL 2 つ、Excel ファイル 1 つ、 PowerShell ファイルをすべて同じディレクトリに置きました
データを読み込むところまでコードを書いてみます
$ErrorActionPreference = 'Stop'
# カレントのパス
$currentPath = Split-Path -Parent $MyInvocation.MyCommand.Path
# DDL の読み込み
[void][Reflection.Assembly]::LoadFile((Join-Path $currentPath '.\ExcelDataReader.dll'))
[void][Reflection.Assembly]::LoadFile((Join-Path $currentPath '.\ExcelDataReader.DataSet.dll'))
try {
    # FileStream を開く
    $stream = [System.IO.File]::Open('.\test.xlsx', [System.IO.FileMode]::Open, [System.IO.FileAccess]::Read)
    # ExcelReader の生成 
    $reader = [ExcelDataReader.ExcelReaderFactory]::CreateReader($stream)
    # ExcelDataSetConfiguration 生成
    $config = [ExcelDataReader.ExcelDataSetConfiguration]::new()
    $config.UseColumnDataType = $true
    $config.ConfigureDataTable = {
        $conf = [ExcelDataReader.ExcelDataTableConfiguration]::new()
        $conf.UseHeaderRow = $true
        return $conf
    }
    # データの読み込み
    $data = [ExcelDataReader.ExcelDataReaderExtensions]::AsDataSet($reader, $config)
} catch {
    throw
} finally {
    # オブジェクトの解放
    if ($reader -is [ExcelDataReader.IExcelDataReader]) {
        $reader.Close()
        $reader.Dispose()
        $reader = $null
    }
    if ($stream -is [System.IO.FileStream]) {
        $stream.Close()
        $stream.Dispose()
        $stream = $null
    }
}
AsDataSet メソッドを使うところがちょっと大変でした… (C# の例は腐るほどあったんですがw)
ここまでで、 $data にデータを取得できていますので、データタイプを見てみます

DataSet で返ってきているのがわかります
中を雑にかくにんしてみます
# 雑に中を確認
$data.Tables | %{
    Write-Output ('SheetName: {0}' -f $_.TableName)
    Format-Table -InputObject $_.Rows
}
最後にオブジェクトを解放して終わります
# ExcelDataReader.DataSet は .NET 3.5 でコンパイルされているようで、System.Type に比較演算子が実装されていないので FullName で判断
if ($data.GetType().FullName -eq "System.Data.DataSet") {
    $data.Clear()
    $data.Dispose()
    $data = $null
}




ディスカッション
コメント一覧
まだ、コメントがありません