Excel 2007 起開始推 XLSX 格式取代傳統 XLS,距今快 15 年了,XLS 大軍仍野火燒不盡,春風吹又生。一般使用者不太會知道二者差別,但也不至於刻意選 XLS 檔,現在仍在流傳的 XLS 檔很多是代代相傳,後人開啟更新後按儲存,沒人想過要換格式,就這麼一直活下去;又或者在建新文件時用舊 XLS 當範本,另存新檔時沿用 XLS 格式,老蚌生珠,香火不絕。

使用者通常不在意工作表存 XLS 或 XLSX,反正 Excel 都能開能存。但對系統來說,格式不統一必有額外成本,系統為求單純可限制只吃 XLSX (開檔再另存兩個動作幾秒鐘搞定的舉手之勞,使用者多半樂意配合),一方面也有助早日消滅舊格式,為推動世界前進盡一份心力。(你瞧,這世界不就因 IE 消失變得更美好?)

不過,懶人如我,手工轉存三份 XLS 便超過容忍上限,一個批次轉檔任務催生了「黑暗版 XLS 轉 XLSX 批次轉換工具」。

開發這個 PowerShell 小工具會用到以下知識:

憑著之前的知識與經驗,輕鬆秒殺:

Param(
    [parameter(Mandatory=$true, ValueFromRemainingArguments=$true)]
    [string]
    $excelPaths, 
    [parameter(ValueFromPipelineByPropertyName=$true)]
    [switch][bool]
    $replace
)
$ErrorActionPreference = "STOP"
try 
{
    $excel = New-Object -ComObject Excel.Application
    $excel.Visible = $true # 顯示 UI,方便使用者了解處理進度、輸入密碼等
    Get-Item $excelPaths | ForEach-Object {
        $path = $_.FullName
        Write-Host "開啟 $path..."
        try {
            $excel.WorkBooks.Open($path) | Out-Null
            $savePath = $path.Replace(".xls", ".xlsx")
            # xlsx => xlOpenXMLWorkbook = 51
            $excel.ActiveWorkbook.SaveAs($savePath, 51)
            $excel.ActiveWorkBook.Close()
            if ($replace) {
                Remove-Item $path                
            }
        }
        catch {
            Write-Host "發生錯誤 - $path" -ForegroundColor Red
        }
    }
}
finally 
{
    $excel.Quit()
}

使用範例:

Convert-Xls2Xlsx.ps1 D:\Foo\*.xls -Replace
Convert-Xls2Xlsx.ps1 D:\Foo\*.xls D:\Bar\*.xls ~\Documents\Work\*.xls

學習程式的過程,隨著知識與經驗積累,程式會愈寫愈輕鬆,這種倒吃甘蔗的爽快與成就感,是 Coding 讓人愈陷愈深無法自拔的原因之一吧!

Example of converting .xls to .xlsx with PowerShell.


Comments

# by A reader far away

In fact, still using old format of XLS may harm businesses. If you have interest, check these BBC news how COVID data got lost due to old XLS format used in British government agency. https://www.bbc.com/news/technology-54423988

# by Jeffrey

to A reader far away, 哈,去年也有讀到這則新聞,謝謝分享精彩實例。

Post a comment


66 - 30 =