首页 > 解决方案 > Powershell Worksheet.saveAs 保存错误的工作表

问题描述

我正在尝试通过 Powershell 将启用宏的 Excel 工作簿 (xlsm) 中的特定 Excel 工作表保存到 csv 以将其上传到数据库中。这是通过 Powershell 完成的,因为它需要自动化以及更多的数据处理等。

情况:

  1. 我在一个目录中有一个excel文件列表,每个文件都有相同的结构/表格。
  2. 我将每个文件解析为一个 Powershell 函数,该函数创建一个新的 Excel 对象并打开工作簿。
  3. 在下一步中,我将尝试保存特定的工作表(此处为带索引 2 的工作表)

问题:

  1. 遍历每个工作表并保存它们会为我提供所有工作表,包括我正在寻找的工作表(表 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。

非常感谢您的想法!

标签: excelpowershellsave-ascomobject

解决方案


经过一个令人沮丧的下午后,我最终解决了这个问题-您需要针对要保存的工作表调用激活,例如

$sheet = $book.sheets.item('User_Specified_Report')
$Sheet.Activate()
$sheet.SaveAs($newName,6)

推荐阅读