【问题标题】:Extract worksheets from Excel into separate files with PowerShell使用 PowerShell 将 Excel 中的工作表提取到单独的文件中
【发布时间】:2015-11-08 08:01:32
【问题描述】:

我正在尝试将具有多张工作表的 excel 文件拆分为多个文件,并搜索了此博客:Extract worksheets from Excel into separate files with PowerShell。我尝试了 xls 文件,它工作正常。但是当我尝试使用 xlsx 文件时,它只输出整个源文件,当我使用 Excel 应用程序打开生成的文件时,每个工作表都作为默认工作表。我为解决方案而苦苦挣扎,但没有运气。我的测试代码就像一击:

$Excel = New-Object -ComObject "Excel.Application" 
$Excel.Visible = $false #Runs Excel in the background. 
$Excel.DisplayAlerts = $false #Supress alert messages. 

$filepath ="D:\powershell\test.xlsx"
$Workbook = $Excel.Workbooks.open($filepath)
$WorkbookName = "test.xlsx"
$output_type = "xlsx"

if ($Workbook.Worksheets.Count -gt 0) { 
    write-Output "Now processing: $WorkbookName" 
    $FileFormat = [Microsoft.Office.Interop.Excel.XlFileFormat]::xlOpenXMLWorkbook 

    $WorkbookName = $filepath -replace ".xlsx", "" 

    foreach($Worksheet in $Workbook.Worksheets) {
        $ExtractedFileName = $WorkbookName + "~~" + $Worksheet.Name + "." + $output_type 
        $Worksheet.SaveAs($ExtractedFileName, $FileFormat) 

        write-Output "Created file: $ExtractedFileName"
    }
} 

$Workbook.Close() 
$Excel.Quit() 

【问题讨论】:

  • 我不确定if ($Workbook.Worksheets.Count -gt 0) { 是否必要,因为工作簿不能包含零个工作表。
  • @Jeeped 我认为你是对的。正如本文(gallery.technet.microsoft.com/office/…),“一个最小的 Excel XLSX 包文件”应该包括 1 个强制性工作表。

标签: excel powershell


【解决方案1】:

按照标准 Excel 实践,将工作表复制到无目的地将创建一个新工作簿,该工作表作为单独的工作表,该工作簿将是 ActiveWorkbook

$Excel = New-Object -ComObject "Excel.Application" 
$Excel.Visible = $false #Runs Excel in the background. 
$Excel.DisplayAlerts = $false #Supress alert messages. 

$filepath ="D:\powershell\test.xlsx"
$Workbook = $Excel.Workbooks.open($filepath)
$WorkbookName = "test.xlsx"
$output_type = "xlsx"

if ($Workbook.Worksheets.Count -gt 0) { 
    write-Output "Now processing: $WorkbookName" 
    $FileFormat = [Microsoft.Office.Interop.Excel.XlFileFormat]::xlOpenXMLWorkbook 

    $WorkbookName = $filepath -replace ".xlsx", "" 

    foreach($Worksheet in $Workbook.Worksheets) {
        $Worksheet.Copy()
        $ExtractedFileName = $WorkbookName + "~~" + $Worksheet.Name + "." + $output_type 
        $Excel.ActiveWorkbook.SaveAs($ExtractedFileName, $FileFormat) 
        $Excel.ActiveWorkbook.Close

        write-Output "Created file: $ExtractedFileName"
    }
} 

$Workbook.Close() 
$Excel.Quit() 
[System.Runtime.Interopservices.Marshal]::ReleaseComObject($Excel)
Stop-Process -Name EXCEL
Remove-Variable Excel

现在确实将工作簿传播到多个工作簿中,每个工作簿都有一个原始工作表的副本。我在其末尾添加了几个“谋杀 Excel”命令,以便在任务管理器的“进程”选项卡中出现一个流氓(且不可见)的 excel.exe。

How to Open; SaveAs; then Close an Excel 2013 (macro-enabled) workbook from PowerShell4 中删除最后一个 excel.exe 实例有一个很好的线程。

【讨论】:

  • 那么openXML版本中的$Worksheet.SaveAs方法和xls版本有很大区别?我对 PowerShell 很陌生。感谢您的回答以及参考链接。
  • @WayneCui - 我坚持下去并设法将 excel.exe 的最后一个实例从进程选项卡中取出。见上面的编辑。请注意,这是一种笼统的命令,可能会干扰您想要保持打开状态的其他 Excel 实例。
  • 谢谢,你这样做真是太好了,它满足了我的需要。只是想知道为什么 openxml 版本不像 .xls 版本那样支持 $Worksheet.SaveAs() 方法?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-14
  • 1970-01-01
  • 2014-01-29
  • 2021-10-09
  • 2013-08-16
相关资源
最近更新 更多