This article also published in Eng @ http://www.cnblogs.com/LarryAtCNBlog/p/4441201.html
今天在兩個地方看到了這樣一個問題:把一個excel中的表複製出來另存爲一個獨立的excel文件。其中一個是cnblog,另一個想不起來了。想到自己將來也可能遇到這樣的問題,於是用powershell做了一個腳本以備不時之需。
Powershell
當然,首先要有一個excel文件包括了一堆表。
用腳本自動化excel最常用的是COM object,下面的語句就是新建一個excel.application實例並把DisplayAlerts置爲false,這樣可以避開excel的告警。
$Excel = New-Object -ComObject Excel.Application
$Excel.DisplayAlerts = $false
這其實就相當於我們雙擊了一下excel.exe,如果想把它顯示出來只需要把$Excel.Visible屬性置爲true即可。
下面的語句就是打開目標excel文件,該open方法僅接受絕對路徑。
$WorkBook = $Excel.Workbooks.Open("$PWD\all.xlsx")
現在我們已經有了workbook的對象,我們只需要對其中的Sheets做循環複製到一個新的Workbook即可。
$WorkBook.Sheets | %{
# 設置新的workbook的路徑
$NewWorkBookPath = "$PWD\$($WorkBook.Name)_$($_.Name).xlsx"
# 新建一個workbook
$NewWorkBook = $Excel.Workbooks.Add()
# 把當前的sheet複製到這個新的workbook裏面
$_.Copy($NewWorkBook.Sheets.Item(1))
# 默認新建一個workbook是有3個空的sheet,下面的語句是刪掉這幾個空的表
2..$NewWorkBook.Sheets.Count | %{
$NewWorkBook.Sheets.Item(2).Delete()
}
# 把該新的workbook另存爲
$NewWorkBook.SaveAs($NewWorkBookPath)
# close new workbook
$NewWorkBook.Close()
}
At last, close old workbook and excel.
最後,調用close方法關閉原來的workbook和excel
$WorkBook.Close()
$Excel.Quit()
到這裏可能有人注意到任務管理器裏依然有一個excel.exe存在,實際上在其它的程序語言中也會遇到同樣的問題,對於該問題的答案MS已經給出瞭解決辦法。
https://technet.microsoft.com/en-us/library/ff730962.aspx
[System.Runtime.Interopservices.Marshal]::ReleaseComObject($Excel) | Out-Null
到這裏工作就完成了,改良腳本就是之後的事了。
VBA
另一個方法是用office自帶的宏來做這件事,打開excel按Alt + F11之後就能調用VBA editor,如果你不能的話可能是最開始安裝office的時候沒有選擇宏組件。
VBA中的方法非常類似,只不過操作的對象不同罷了。
Sub SplitSheets()
Application.DisplayAlerts = False
For Each Sheet In Sheets
NewWorkBookPath = ActiveWorkbook.FullName & "_" & Sheet.Name & ".xlsx"
Set w = Workbooks.Add
Sheet.Copy w.Sheets.Item(1)
For i = 2 To w.Sheets.Count
w.Sheets.Item(2).Delete
Next
w.SaveAs NewWorkBookPath
w.Close
Set w = Nothing
Next
End Sub
這其實就是建了一個宏而已,在workbook界面用Alt + F8可以調用出宏界面執行它,或者在VBA editor界面按F5執行宏即可。
- Larry