excel - Powershell Worksheet.saveAs 保存错误的工作表
问题描述
我正在尝试通过 Powershell 将启用宏的 Excel 工作簿 (xlsm) 中的特定 Excel 工作表保存到 csv 以将其上传到数据库中。这是通过 Powershell 完成的,因为它需要自动化以及更多的数据处理等。
情况:
- 我在一个目录中有一个excel文件列表,每个文件都有相同的结构/表格。
- 我将每个文件解析为一个 Powershell 函数,该函数创建一个新的 Excel 对象并打开工作簿。
- 在下一步中,我将尝试保存特定的工作表(此处为带索引 2 的工作表)
问题:
- 遍历每个工作表并保存它们会为我提供所有工作表,包括我正在寻找的工作表(表 2)
- 通过访问表格 2
$ws = $wb.Worksheets(2)
也给了我正确的表格(根据$ws.name
),但$ws
通过$ws.SaveAs("$destinationDirectory" + $File.BaseName + ".csv", 6)
结果保存在包含表格 1 的 csv 文件中。
我之前已经成功地保存了具有基本完全相同代码的工作表(除了我正在处理 xlsx 而不是 xlsm)。
代码
Function ExcelToCsv ($File) {
echo "Converting $($File.Name) to csv..."
$Excel = New-Object -ComObject Excel.Application;
$Excel.DisplayAlerts = $False;
$wb = $Excel.Workbooks.Open($File)
$ws = $wb.Worksheets(2)
echo "ws is:" + $ws.name # Correctly printing Worksheet name of Sheet 1
$ws.SaveAs("$destinationDirectory" + $File.BaseName + ".csv", 6) # Saving Sheet 1 instead of Sheet 2
$wb.Close($True);
}
}
foreach ($file in $files){
ExcelToCsv -File $file;
}
解决方法
我目前的解决方法是通过 foreach 遍历工作表
$n = 1
foreach($ws in $wb.Worksheets){
$ws.SaveAs("$destinationDirectory" + $File.BaseName + "-$($n).csv", 6)
$n = $n+1
}
并通过删除任何不需要的工作表(由 $n != 2 识别)
Remove-Item "$($destinationDirectory)*-[13456789].csv";
哪个有效,但并不是真正的最佳选择。另外:在 foreach 中检查$n -eq 2
并仅保存该工作表也不起作用,因为它只会再次保存工作表 1。
非常感谢您的想法!
解决方案
经过一个令人沮丧的下午后,我最终解决了这个问题-您需要针对要保存的工作表调用激活,例如
$sheet = $book.sheets.item('User_Specified_Report')
$Sheet.Activate()
$sheet.SaveAs($newName,6)
推荐阅读
- python - 从位于一个文件中的 python 列表中读取,并在另一个 .bat 脚本中使用它?
- java - 使用刷新令牌对 JWT 的端点 /logout 执行的操作
- python - 如何更新嵌套在另一个中的字典?
- java - java父构造函数依赖于其不同的子字段值?
- java - 在Activity中继承抽象类时出现NoSuchMethodException
- plsql - 如何在 API 函数中进行更新
- javascript - /resources/js/common.js 文件如何从 .env 文件中读取值?
- amazon-web-services - AWS CloudFront 只会使整个缓存失效
- javascript - VueJs 2:如何在另一个组件中使用一个组件功能?
- repast-simphony - 命令行批处理在 Linux 上运行