powershell操作excel文档出现的错误,算是基础问题

打开一个excel文档,然后经过某些操作输出四个文件(分别是xlsx和PDF格式)到一个目录(这个目录可能存在也可能不存在),然后报错了,并且弹出两次如下对话框

img

img


$xlFixedFormat = "Microsoft.Office.Interop.Excel.xlFixedFormatType" -as [type] #设置excel文件类型
$objExcel = New-Object -ComObject excel.application #创建excel对象
$objExcel.visible = $true 
$path="C:\test.xlsx"
#$path = $args[2] #待打开文件
$workbook = $objExcel.workbooks.open($path) #获取工作簿对象
$ws=$workbook.WorkSheets.item(1)#获取工作表对象,也可以通过item("Sheet1")
$workbook.activate()#激活工作簿
$ws.activate()#激活工作表
$ws.SaveAs("C:\toZip\教师版.xlsx")
$workbook.ExportAsFixedFormat($xlFixedFormat::xlTypePDF, "C:\toZip\教师版.PDF")  #一键导出PDF教师版
$ws.columns.range("A5:A"+$numX).ClearContents()  #删除答案,得到学生版
$ws.SaveAs("C:\toZip\学生版.xlsx")
$workbook.ExportAsFixedFormat($xlFixedFormat::xlTypePDF, "C:\toZip\学生版.PDF")  #一键导出PDF学生版
# 压缩源文件夹内的docx文件到myDoc.zip
$sourceFolder=$args[3]+"\toZip"
$zipFile = $args[3]+"\四文件包.zip"
Add-Type -AssemblyName System.IO.Compression.FileSystem
[System.IO.Compression.ZipFile]::CreateFromDirectory($sourceFolder, $zipFile)
$workbook.save()#保存工作簿
$workbook.saveas("C:\toZip\压缩包.zip")#另存工作簿
$workbook.close()#关闭工作簿
$objExcel.Quit()#退出Excel程序

报错内容如下:

img

img

请务必先测试再发上来,谢绝搬运,以免浪费时间!

先确认下你是不是开着excel的,如果你已经打开了其中一个文件,是会报错的,因为文件被占用了,另外你输出的三个文件路径中的冒号都写成中文的了。

img

提示很明显,重点关注第二三点,关掉正在打开的文件然后再跑程序

img

你文中的5处 “C:\toZip”有错误,文件路径中的":"输入的是全角,正确的应该是“C:\toZip”.
试试:

$xlFixedFormat = "Microsoft.Office.Interop.Excel.xlFixedFormatType" -as [type] #设置excel文件类型
$objExcel = New-Object -ComObject excel.application #创建excel对象
$objExcel.visible = $true 
$path="C:\test.xlsx"
#$path = $args[2] #待打开文件
$workbook = $objExcel.workbooks.open($path) #获取工作簿对象
$ws=$workbook.WorkSheets.item(1)#获取工作表对象,也可以通过item("Sheet1")
$workbook.activate()#激活工作簿
$ws.activate()#激活工作表
$ws.SaveAs("C:\toZip\教师版.xlsx")
$workbook.ExportAsFixedFormat($xlFixedFormat::xlTypePDF, "C:\toZip\教师版.PDF")  #一键导出PDF教师版
$ws.columns.range("A5:A"+$numX).ClearContents()  #删除答案,得到学生版
$ws.SaveAs("C:\toZip\学生版.xlsx")
$workbook.ExportAsFixedFormat($xlFixedFormat::xlTypePDF, "C:\toZip\学生版.PDF")  #一键导出PDF学生版
# 压缩源文件夹内的docx文件到myDoc.zip
$sourceFolder=$args[3]+"\toZip"
$zipFile = $args[3]+"\四文件包.zip"
Add-Type -AssemblyName System.IO.Compression.FileSystem
[System.IO.Compression.ZipFile]::CreateFromDirectory($sourceFolder, $zipFile)
$workbook.save()#保存工作簿
$workbook.saveas("C:\toZip\压缩包.zip")#另存工作簿
$workbook.close()#关闭工作簿
$objExcel.Quit()#退出Excel程序

以下答案由GPT-3.5大模型与博主波罗歌共同编写:
这个错误可能是因为Excel对象未能正确关闭所导致的。建议加上对Excel对象的清理和释放,可以使用以下代码:

[System.Runtime.Interopservices.Marshal]::ReleaseComObject($ws)
[System.Runtime.Interopservices.Marshal]::ReleaseComObject($workbook)
[System.Runtime.Interopservices.Marshal]::ReleaseComObject($objExcel)
[System.GC]::Collect()
[System.GC]::WaitForPendingFinalizers()

完整的代码如下:

```
$xlFixedFormat = "Microsoft.Office.Interop.Excel.xlFixedFormatType" -as [type] #设置excel文件类型
$objExcel = New-Object -ComObject excel.application #创建excel对象
$objExcel.visible = $true
$path="C:\test.xlsx"
#$path = $args[2] #待打开文件
$workbook = $objExcel.workbooks.open($path) #获取工作簿对象
$ws=$workbook.WorkSheets.item(1)#获取工作表对象,也可以通过item("Sheet1")
$workbook.activate()#激活工作簿
$ws.activate()#激活工作表
$ws.SaveAs("C:\toZip\教师版.xlsx")
$workbook.ExportAsFixedFormat($xlFixedFormat::xlTypePDF, "C:\toZip\教师版.PDF") #一键导出PDF教师版
$ws.columns.range("A5:A"+$numX).ClearContents() #删除答案,得到学生版
$ws.SaveAs("C:\toZip\学生版.xlsx")
$workbook.ExportAsFixedFormat($xlFixedFormat::xlTypePDF, "C:\toZip\学生版.PDF") #一键导出PDF学生版

压缩源文件夹内的docx文件到myDoc.zip

$sourceFolder=$args[3]+"\toZip"
$zipFile = $args[3]+"\四文件包.zip"
Add-Type -AssemblyName System.IO.Compression.FileSystem
[System.IO.Compression.ZipFile]::CreateFromDirectory($sourceFolder, $zipFile)
$workbook.save()#保存工作簿
$workbook.saveas("C:\toZip\压缩包.zip")#另存工作簿
$workbook.close()#关闭工作簿
$objExcel.Quit()#退出Excel程序

System.Runtime.Interopservices.Marshal