我正在尝试使用以下 powershell 脚本将多个 Excel 文件 (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 组,并在自己的运行中处理每个组。这有效,所以有点不方便。
提前致谢
最佳答案
尝试将代码移至循环内以启动和退出 Excel。
是的,这样会比较慢,但它会鼓励 Excel 在每次操作之间清理其临时文件。
它不会像你想象的那么慢,因为 Windows 和 COM 足够聪明,即使在你退出几秒钟后,它也能将 Excel 大部分内容保留在内存中,这样下次你创建 Excel 对象时它就会发生得很快,正是针对这样的情况。
关于excel - 如何使用powershell将多个xls文件转换为csv?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6059940/