每次打开excel的某些表,一堆不需要的列,一个一个隐藏,太不方便,后来想着写个vbs处理,但vbs需要更改excel文件格式,不喜欢这种更改,后来想想自己也买过方方格子终身会员,索性下载一个安装了,发现里面居然没有这个小功能,自己写个插件吧,太过累赘了吧,索性用bat加Windows PowerShell 写个还来的方便
# 保存为HideColumnsByTab.ps1
# HideColumns.ps1
param(
[string]$keywordsFile = "keywords.txt"
)
# 强制UTF-8编码
$ErrorActionPreference = "Stop"
try {
# 读取关键词文件(强制UTF-8编码)
if (-not (Test-Path $keywordsFile)) {
throw "关键词文件 $keywordsFile 不存在"
}
# 读取文件内容(强制 ANSI 编码,匹配 Tab/空格分隔格式)
$keywords = Get-Content -Path $keywordsFile -Encoding Default -Raw # "Default" 即系统默认 ANSI 编码
# 关键处理:移除所有 # 字符和不可见特殊字符(解决 "参数格式不正确 - #" 错误)
$keywords = $keywords -replace '#', '' -replace '[^\p{L}\p{N}\t ]', '' # 仅保留中文、英文、数字、Tab、空格
# 按 Tab/空格分隔列名(支持多个连续空格/Tab)
$keepColumns = $keywords -split '\s+' | # \s+ 匹配任意空白字符(Tab/空格/换行)
Where-Object { $_ -and -not [string]::IsNullOrWhiteSpace($_) } | # 过滤空值
ForEach-Object { $_.Trim() } # 移除首尾空格
# 验证结果
if ($keepColumns.Count -eq 0) {
throw "未提取到有效列名,请检查 keywords.txt 格式!"
}
Write-Host "`n=== 列隐藏工具 ===" -ForegroundColor Cyan
Write-Host "将保留以下列:" -ForegroundColor Yellow
$keepColumns | ForEach-Object { Write-Host " - $_" }
# 连接到Excel/WPS
try {
$app = [Runtime.Interopservices.Marshal]::GetActiveObject('Excel.Application')
Write-Host "`n已连接到 Microsoft Excel" -ForegroundColor Green
}
catch {
try {
$app = [Runtime.Interopservices.Marshal]::GetActiveObject('KWps.Application') -or
[Runtime.Interopservices.Marshal]::GetActiveObject('Ket.Application')
Write-Host "`n已连接到 WPS 表格" -ForegroundColor Green
}
catch {
throw "未找到打开的Excel/WPS窗口,请先打开目标文件并激活工作表"
}
}
# 获取工作表数据
$worksheet = $app.ActiveWorkbook.ActiveSheet
$headerRow = $worksheet.Rows.Item(1)
$totalColumns = $worksheet.UsedRange.Columns.Count
# 构建列名映射表(添加大小写不敏感比较)
$columnMap = @{}
$culture = [System.Globalization.CultureInfo]::CurrentCulture
1..$totalColumns | ForEach-Object {
$columnMap[$_] = $headerRow.Cells(1, $_).Text.Trim()
}
# 查找匹配列(使用更宽松的匹配方式)
$columnsToKeep = $columnMap.GetEnumerator() |
Where-Object {
$colName = $_.Value
$keepColumns | Where-Object {
$culture.CompareInfo.IndexOf($colName, $_, [System.Globalization.CompareOptions]::IgnoreCase) -ge 0
}
} |
Select-Object -ExpandProperty Key
# 验证匹配结果
if (-not $columnsToKeep) {
Write-Host "`n错误:未找到匹配列!" -ForegroundColor Red
Write-Host "请检查列名是否完全匹配(包括空格和大小写)" -ForegroundColor Yellow
Write-Host "工作表实际列名:" -ForegroundColor Gray
$columnMap.GetEnumerator() | Sort-Object Key | ForEach-Object {
Write-Host (" 列{0}: {1}" -f $_.Key.ToString().PadLeft(2), $_.Value)
}
exit 1
}
# 执行列隐藏操作
Write-Host "`n正在处理 $totalColumns 列..." -ForegroundColor Gray
1..$totalColumns | ForEach-Object {
$worksheet.Columns($_).Hidden = ($columnsToKeep -notcontains $_)
# 每处理10列输出一个点,避免进度条乱码
if ($_ % 10 -eq 0) { Write-Host "." -NoNewline }
}
Write-Host "`n处理完成!" -ForegroundColor Gray
# 完成报告
Write-Host "`n操作成功完成!" -ForegroundColor Green
Write-Host "保留列: $($columnsToKeep.Count)" -ForegroundColor Cyan
Write-Host "隐藏列: $($totalColumns - $columnsToKeep.Count)" -ForegroundColor Cyan
Write-Host "`n保留的列详情:" -ForegroundColor DarkCyan
$columnsToKeep | Sort-Object | ForEach-Object {
Write-Host (" 列{0}: {1}" -f $_, $columnMap[$_])
}
}
catch {
Write-Host "`n错误: $_" -ForegroundColor Red
exit 1
}
finally {
# 安全释放资源
try {
if ($worksheet) { [System.Runtime.Interopservices.Marshal]::ReleaseComObject($worksheet) | Out-Null }
if ($app) { [System.Runtime.Interopservices.Marshal]::ReleaseComObject($app) | Out-Null }
[System.GC]::Collect()
[System.GC]::WaitForPendingFinalizers()
}
catch {}
}keywords.txt
内部订单号 发货日期 出库日期 状态 快递公司 快递单号 省份 城市 商品总成交金额 商品编码 数量 商品单价 商品金额 原始线上订单号 单价 第三方订单号 金额 快递费 包装费 合计bat脚本
@echo off
chcp 936 > nul # 强制终端使用 GBK 编码(避免中文乱码)
set "PS_SCRIPT=%~dp0HideColumns.ps1"
set "KEYWORDS_FILE=%~dp0keywords.txt"
:: 检查文件是否存在
if not exist "%PS_SCRIPT%" (
echo 错误: 未找到脚本文件 %PS_SCRIPT%
pause
exit /b 1
)
if not exist "%KEYWORDS_FILE%" (
echo 错误: 未找到关键词文件 %KEYWORDS_FILE%
pause
exit /b 1
)
:: 运行 PowerShell 脚本(添加 -NoLogo 去除版权信息,减少干扰)
powershell.exe -NoProfile -NoLogo -ExecutionPolicy Bypass -File "%PS_SCRIPT%" -keywordsFile "%KEYWORDS_FILE%"
pause以上文件本保存为 HideColumns.ps1
没有权限时执行下这个就可以
Set-ExecutionPolicy RemoteSigned -Scope CurrentUser
V1.0
bat脚本下载
V1.2 修复自动对应表头对应的行
batv1.2脚本下载