wps excel一健隐藏不需要的列

首页 / 默认分类 / 正文

每次打开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脚本下载

无标签
评论区
头像