用 AutoHotkey 获取Excel的单元格数据类型(靠谱)

VBA中,单元格属性有NumberFormat可以获取单元格格式,比如:

  • G/通式格式:常规
  • @:文本
  • yyyy/m/d:日期

问题:

  • G/通式格式,无法知道值是整数还是浮点数,
  • yyyy/m/d,如果换一种日期格式就对不上了。

所以cell.Value(12)就派上用场了,是XML格式的单元格更详细的信息。

<xml xmlns:x="urn:schemas-microsoft-com:office:excel"
 xmlns:dt="uuid:C2F41010-65B3-11d1-A29F-00AA00C14882"
 xmlns:s="uuid:BDC6E3F0-6DA3-11d1-A2A3-00AA00C14882"
 xmlns:rs="urn:schemas-microsoft-com:rowset" xmlns:z="#RowsetSchema">
 <x:PivotCache>
  <x:CacheIndex>1</x:CacheIndex>
  <s:Schema id="RowsetSchema">
   <s:ElementType name="row" content="eltOnly">
    <s:attribute type="Col1"/>
    <s:extends type="rs:rowbase"/>
   </s:ElementType>
   <s:AttributeType name="Col1" rs:name="字段1">
    <s:datatype dt:type="dateTime"/>  <!-- 核心是这行的内容 -->
   </s:AttributeType>
  </s:Schema>
  <rs:data>
   <z:row Col1="2019-04-07T00:00:00"/>
  </rs:data>
 </x:PivotCache>
</xml>
dateTime就是相应的数据类型所在位置,以下是 AutoHotkey v2 的获取方法(AutoHotkey)

以下是AutoHotkey v2 beta版代码

;可以传入cell或cell.value(12)
;int
;float
;str(字符串)
;date 日期
;long(长字符串)
;None
static valueType(cell:="") {
    if (!isobject(cell)) {
        if (cell == "") {
            cell := ox().ActiveCell
            xml := cell.value(12)
        } else {
            xml := cell
        }
    } else {
        xml := cell.value(12)
    }
    if (RegExMatch(xml, 's:datatype dt:\w+\="\K\w+', &m)) {
        res := m[0]
    }else if (instr(xml, 's:datatype rs:long')) {
        return "long"
    } else {
        msgbox(format("{1}`n检测xml失败`n`n", xml))
        return
    }
    ;oXML := ComObject("MSXML2.DOMDocument.6.0")
    ;oXML.loadXML(xml)
    ;oDatatype := oXML.childNodes[0].childNodes[0].childNodes[1].childNodes[1].childNodes[0]
    ;strType := oDatatype.xml
    ;res := StrSplit(substr(strType,1,strlen(strType)-3),'"').pop()
    return map(
        "int","int",
        "float","float",
        "255","str",
        "dateTime","date",
        "boolean","None",
    )[res]
}
posted @ 2019-04-14 16:49  火冷  阅读(2136)  评论(0编辑  收藏  举报