2011-05-19 142 views
6

我嘗試使用下面的PowerShell腳本到多個Excel文件(XLS)轉換成CSV:如何使用PowerShell將多個xls文件轉換爲csv?

$excel = new-object -ComObject "Excel.Application" 
$excel.DisplayAlerts=$True 
$excel.Visible =$false 
foreach ($file in get-childitem $src_dir) { 
    $wb = $excel.Workbooks.Open($file.FullName) 
    $wb.SaveAs($dst_dir + $file.Name + ".csv", 6)# 6 -> csv 
    $wb.Close($True) 
} 
$excel.Quit() 
[void][System.Runtime.Interopservices.Marshal]::ReleaseComObject($excel) 

原則上這個作品如我得到了csv文件。然而,對於一些文件(每次運行而有所不同)我得到一個異常:

Exception calling "SaveAs" with "2" argument(s): "Microsoft Office Excel cannot access the file 'C:\Users\...\AppData\Local\Temp'. ... 

此外,我得到一個消息框,詢問我是否將更改保存到源XLS。

一旦我調用SaveAs,$ wb引用新文件。那麼如何保存或放棄對源文件的更改?爲什麼只有幾個文件纔會發生這種情況?這個腳本還有其他問題嗎?

更新

我分輸入文件(約200)任意地(即不知道組的大小)在其自身的運行成10組和處理每個組。這有效,所以有點不方便。

在此先感謝

+0

你看看在錯誤顯示的tempory文件,只是爲了看看是否有沒有剩餘的文件。我在PDF轉換腳本中遇到了類似的問題,而其餘的舊臨時文件仍然是問題的根源。 – JPBlanc 2011-05-19 19:42:46

+0

不幸的是,錯誤信息只能命名Temp目錄。我在運行過程中監視目錄,並且顯示並消失了隨機名稱的兩個文件(假定爲每個轉換後的xls)。 – wierob 2011-05-20 08:33:33

回答

0

也許你可以實現一個計時器等待一段時間?或者在腳本運行時查看direcotry,然後在每個循環後刪除臨時文件(一次xls文件轉換)。

4

嘗試移動代碼以啓動並退出Excel內部循環。

是的,這樣做速度較慢,但​​它會鼓勵Excel在每次操作之間清理臨時文件。

它不會像您想象的那麼慢,因爲Windows和COM足夠聰明,即使在您退出幾秒鐘後仍將Excel大部分保留在內存中,以便下次創建Excel對象時它將會快速發生,正是爲了這樣的情況。

0

我相信你可以通過使用$wb.Close($False)而不是$wb.Close($True)來避免消息框詢問你是否想要保存。這就是我通常使用的,我沒有收到任何消息框。

0

我與定時器更新腳本 - 可能不是確切的答案,但會幫助別人尋找一個腳本:

$excel = new-object -ComObject "Excel.Application" 
$excel.DisplayAlerts=$True 
$excel.Visible =$false 
$src_dir='D:\folderwithxlsx\' 
$dst_dir='D:\folderwithcsv\' 
Get-ChildItem $src_dir -Filter *.xlsx | 
Foreach-Object{ 
    'processing '+$_.FullName 
    $wb = $excel.Workbooks.Open($_.FullName) 
    $dst_file=$dst_dir + $_.BaseName + ".csv" 
    $wb.SaveAs($dst_file, 6)# 6 -> csv 
    'saved '+$dst_file 
    $wb.Close($True) 
    Start-Sleep -Seconds 2 
} 
$excel.Quit() 
[void][System.Runtime.Interopservices.Marshal]::ReleaseComObject($excel)