【问题标题】:Powershell Worksheet.saveAs saving wrong SheetPowershell Worksheet.saveAs 保存错误的工作表
【发布时间】:2021-10-07 16:57:37
【问题描述】:

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

情况:

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

问题:

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

非常感谢您的想法!

【问题讨论】:

  • 我的猜测是首先将工作表复制到一个新的工作簿...类似于这种 VBA 方法herehere

标签: excel powershell save-as comobject


【解决方案1】:

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

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

【讨论】:

  • 谢谢!当我再次使用这个脚本时,我会试一试。我没有想过在这里使用激活。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-11-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多