2011-05-19 150 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)