用 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]
}