如何在Windows下用PowerShell提取xlsx指定工作表为文本文件
PowerShell批量提取Excel工作表转文本实现方案
下面提供两种适配不同环境的可直接使用的脚本方案:
方案1:依赖本地已安装的Microsoft Excel
该方案无需下载额外第三方模块,适合已经安装Office Excel的普通Windows设备。
# 自定义配置参数 $inputDir = "C:\替换为你的xlsx文件存放目录" $outputDir = "C:\替换为生成文本文件的保存目录" $targetSheet = "Approval_Logs" # 自动创建输出目录(不存在时) if (-not (Test-Path $outputDir)) { New-Item -ItemType Directory -Path $outputDir | Out-Null } # 初始化Excel后台进程 $excel = New-Object -ComObject Excel.Application $excel.Visible = $false $excel.DisplayAlerts = $false # 定义文本保存格式:42对应制表符分隔的Unicode文本,和ssconvert默认输出格式一致 $xlTextFormat = 42 # 遍历目录下所有xlsx文件 Get-ChildItem -Path $inputDir -Filter "*.xlsx" -Recurse | ForEach-Object { $xlsxFullPath = $_.FullName $outputTxtPath = Join-Path $outputDir ($_.BaseName + "_Approval_Logs.txt") try { $workbook = $excel.Workbooks.Open($xlsxFullPath) $matchSheet = $workbook.Worksheets | Where-Object { $_.Name -eq $targetSheet } if ($matchSheet) { $matchSheet.SaveAs($outputTxtPath, $xlTextFormat) Write-Host "导出成功:$outputTxtPath" } else { Write-Host "跳过文件:$xlsxFullPath,未找到目标工作表" } $workbook.Close() } catch { Write-Host "处理文件$xlsxFullPath出错:$_" if ($workbook) { $workbook.Close() } } } # 释放Excel进程资源 $excel.Quit() [System.Runtime.Interopservices.Marshal]::ReleaseComObject($excel) | Out-Null Remove-Variable excel
方案2:无需安装Excel,依赖ImportExcel第三方模块
该方案适合没有安装Office的Windows服务器、轻量设备,不需要启动Excel进程,运行效率更高。
首次运行前需要先执行以下命令安装依赖模块:Install-Module -Name ImportExcel -Scope CurrentUser -Force
对应处理脚本:
# 自定义配置参数 $inputDir = "C:\替换为你的xlsx文件存放目录" $outputDir = "C:\替换为生成文本文件的保存目录" $targetSheet = "Approval_Logs" # 自动创建输出目录(不存在时) if (-not (Test-Path $outputDir)) { New-Item -ItemType Directory -Path $outputDir | Out-Null } # 遍历目录下所有xlsx文件 Get-ChildItem -Path $inputDir -Filter "*.xlsx" -Recurse | ForEach-Object { $xlsxFullPath = $_.FullName $outputTxtPath = Join-Path $outputDir ($_.BaseName + "_Approval_Logs.txt") try { # 直接读取目标工作表数据 $sheetContent = Import-Excel -Path $xlsxFullPath -WorksheetName $targetSheet -ErrorAction Stop # 导出为UTF8编码的制表符分隔文本 $sheetContent | Export-Csv -Path $outputTxtPath -Delimiter "`t" -Encoding UTF8 -NoTypeInformation Write-Host "导出成功:$outputTxtPath" } catch { Write-Host "跳过文件:$xlsxFullPath,未找到目标工作表或读取失败:$_" } }
使用注意事项
- 两种方案都支持递归扫描
$inputDir下所有层级的xlsx文件,不需要的话可以去掉Get-ChildItem命令里的-Recurse参数 - 方案1运行前建议关闭所有手动打开的Excel窗口,避免资源占用冲突导致处理失败
- 方案2导出的文本编码默认为UTF8,可根据需求修改
Export-Csv的-Encoding参数调整
内容的提问来源于stack exchange,提问作者Sam Alleman
相关产品推荐
相关产品推荐

