write ahead log

ロールフォワード用

PowershellでmdbファイルをExcelにするスクリプトを書いた

仕事で使いそうだったので.

出来ればこんなの使いたくない.

#######################################################################
# 概要
#   mdbファイルを開いてテーブルの内容をExcelへ出力する
# 書式
#   export-mdb.ps1 [mdbファイルへの相対パス] [mdbファイルパスワード]
#######################################################################

Param($filename, $password)

# 指定テーブルを指定シートへエクスポートする
function ExportTable {
    param (
        $con,
        $sheet,
        $tableName
    )
    $rs = New-Object -ComObject "ADODB.Recordset"

    $sql = "SELECT * FROM ${tableName}"
    $rs.Open($sql, $con, 3, 3)

    # テーブル名
    $col_idx = 1
    $row_idx = 1
    foreach ($f in $rs.Fields) {
        $sheet.Cells.Item($row_idx, $col_idx) = $f.name
        $col_idx += 1
    }
    $row_idx += 1

    # データ内容
    $rs.MoveFirst()
    while ($rs.EOF -eq $false) {
        $col_idx = 1
        foreach ($f in $rs.Fields) {
            $sheet.Cells.Item($row_idx, $col_idx) = $rs.Fields.Item($f.Name).Value
            $col_idx += 1
        }
        $rs.MoveNext()
        $row_idx += 1
    }

    $rs.Close()
}

# MDBファイルのファイルパスを組み立てる
$filepath = join-path $PSScriptRoot $filename
$excel_filepath = join-path $PSScriptRoot "exported.xlsx"

$connection_string = "Provider=Microsoft.ACE.OLEDB.12.0; Data Source = ${filepath};"

# パスワード指定の場合にはパスワードをConnectionStringへ加える
if($password -ne '') {
    $connection_string += "Jet OLEDB:Database Password = ${password};"
}

# Excelを開いてブックを作る
$excel = New-Object -ComObject Excel.Application
$excel.visible = $false
$excel.DisplayAlerts = $false
$book = $excel.Workbooks.Add()

# mdbを開く
$catalog = New-Object -ComObject "ADOX.Catalog"
$con = New-Object -ComObject "ADODB.Connection"
$con.Open($connection_string)
$catalog.ActiveConnection = $con

try {
    foreach($tbl in $catalog.Tables) {
        # テーブルのみ出力
        if($tbl.type -eq "table") {
            # シートを加える
            $sheet = $book.Worksheets.Add()
            $sheet.name = $tbl.name
            ExportTable $con $sheet $tbl.name
        }
    }
    $book.SaveAs($excel_filepath)
} finally {
    $con.Close()
    $excel.Quit()
    $excel = $null
}