清理Excel单元格中不可见的垃圾字符

最近遇到一个Excel数据清理问题。某系统导出的数据,看起来是正常的,选择各个单元格就发现内容包含了一些随机的垃圾字符,位置也是随机的,这些垃圾字符在单元格中以白色和最小号字体显示,所以不影响正常文本的显示。在网上找到“Excel单元格部分字体颜色改变”的VBA代码,参考之后写出了清理垃圾字符的AHK代码。


;-----------------------------------------------
; 清理Excel单元格中不可见的垃圾字符 By FeiYue
;
; 说明:可能是为了防止拷贝泄密,看上去正常的数据
; 中加入了随机的垃圾字符,白色最小字体,需要清除
;-----------------------------------------------

; 热键左Win键启动
LWin::
Try {
  ; 获取Excel的COM对象
  objExcel:=Excel_Get()

  ; 让Excel不要刷新
  objExcel.ScreenUpdating := 0

  ; 获取选择范围的单元格总对象
  Selection:=objExcel.Selection

  ; 获取选择范围的行列数
  h:=Selection.Rows.Count
  w:=Selection.Columns.Count

  ; 提示百分比进度的变量
  tip_index:=0, tip_all:=w*h, tip_old:=""

  Loop, % h
  {
    y:=A_Index
    Loop, % w
    {
      ; 提示百分比进度,ToolTip比较耗时,但显示进度很重要
      if (++tip_index*100//tip_all)!=tip_old
        ToolTip, % (tip_old:=tip_index*100//tip_all) "/100"

      x:=A_Index, clear:=0, s:="'"

      ; 获取每一个单元格对象,获取单元格的值
      k:=Selection.Cells(y,x), v:=k.Value

      Loop, Parse, v
      {
        ; 获取单元格对象每个字符的颜色值,看是否黑色
        if (k.Characters(A_Index,1).Font.Color = 0)
          s.=A_LoopField  ; 收集所有黑色字符到变量
        else clear:=1
      }

      ; 如果有其他颜色的字符,就要替换本单元格内容
      if (clear=1)
      {
        ; 调整单元格的字体颜色、字号与正常的一致
        k.Font.Color := 0
        k.Font.Size := 9
        k.Value:=s
      }
    }
  }

  ; 让Excel刷新
  objExcel.ScreenUpdating := 1

  MsgBox, 4096,, 执行完毕!, 1
  ToolTip
}
return

;-- 获取Excel窗口的COM对象
Excel_Get(WinTitle="ahk_class XLMAIN")
{
  static obj
  Try
    if (obj.Version)
      return obj
  return obj:=Office_Get(WinTitle)
}

;-- 获取所有Office窗口的COM对象  By FeiYue
Office_Get(WinTitle="")
{
  static h:=DllCall("LoadLibrary", "Str","oleacc", "Ptr")
  WinGet, list, ControlListHwnd, % WinTitle ? WinTitle : "A"
  For i,hWnd in StrSplit(list, "`n")
  {
    ControlGetPos, x, y, w, h,, ahk_id %hWnd%
    if (w<100 or h<100)
      Continue
    if DllCall("oleacc\AccessibleObjectFromWindow", "Ptr", hWnd
    , "UInt", 0xFFFFFFF0, "Ptr", 0*(VarSetCapacity(IID,16)
    +NumPut(0x0000000000020400,IID,"Int64")
    +NumPut(0x46000000000000C0,IID,8,"Int64"))+&IID, "Ptr*", pacc)=0
    {
      Acc:=ComObject(9, pacc, 1)
      Try
        if (Acc.Application.Version)
          return Acc.Application
    }
  }
  MsgBox, 4096,, Error: Can't Get Object From ACC !
  Exit
}

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值