【发布时间】:2021-10-07 16:57:37
【问题描述】:
我正在尝试通过 Powershell 将启用宏的 Excel 工作簿 (xlsm) 中的特定 Excel 工作表保存到 csv 以将其上传到数据库中。这是通过 Powershell 完成的,因为它需要自动化以及更多的数据处理等。
情况:
- 我在一个目录中有一个 excel 文件列表,每个文件都有相同的结构/表格。
- 我将每个文件解析为一个 Powershell 函数,该函数创建一个新的 Excel 对象并打开工作簿。
- 在下一步中,我将尝试保存特定工作表(此处为带有索引 2 的工作表)
问题:
- 遍历每个工作表并保存它们会为我提供所有工作表,包括我正在寻找的工作表(工作表 2)
- 通过
$ws = $wb.Worksheets(2)访问 Sheets 2 也为我提供了正确的 Sheet(根据$ws.name),但通过$ws.SaveAs("$destinationDirectory" + $File.BaseName + ".csv", 6)保存$ws会生成一个包含 Sheet 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。
非常感谢您的想法!
【问题讨论】:
标签: excel powershell save-as comobject