charleschaiyu 发表于 2017-7-14 12:18:49

[已解决]关于_Excel_RangeRead读取时间格式问题

本帖最后由 charleschaiyu 于 2017-7-18 12:01 编辑

B3单元格是时间格式,_Excel_RangeRead 读取后变成0.416666,请问如何能读取为10:00?

改为$sResult = _Excel_RangeRead($oWorkbook, Default, Default, 3)不显示。
改为$sResult =$oAppl.text($oAppl.transpose($oWorkbook.Activesheet.range("a1:c3").value),"hh:mm"),B2变成00:00了

#include <Array.au3>
#include <Excel.au3>

Local $sResult, $iRows, $iCols
Local $oAppl = _Excel_Open(False)
Local $sWorkbook = @ScriptDir & '\LEDDisp.xls'
Local $oWorkbook = _Excel_BookOpen($oAppl, $sWorkbook, Default, Default, True)
$sResult = _Excel_RangeRead($oWorkbook, Default, Default, 2)
_Excel_Close($oAppl, True, True)
_ArrayDisplay($sResult,"读取结果")

yamakawa 发表于 2017-7-14 13:33:26

回复 1# charleschaiyu


    一秒是 “0.0000115740740740741”

只能自己计算了吧,估计

kk_lee69 发表于 2017-7-14 14:34:28

本帖最后由 kk_lee69 于 2017-7-14 14:35 编辑

回复 1# charleschaiyu
範例給你自己改一下

#include <Excel.au3>
$oExcel = _ExcelBookNew() ;Open Excel
$wintitle = $oExcel.Name & " - " & $oExcel.ActiveWorkbook.Name ;Get window title
WinSetState($wintitle, "", @SW_MAXIMIZE) ;Maximize Excel window
_ExcelWriteCell ($oExcel, "09:00", 1, 1) ;Write cell
$sCellValue = _ExcelReadCell ($oExcel, "A1") ;Read cell value
$sTime = _NumToTime($sCellValue) ;Convert number to time in AM/PM format
MsgBox(0,"",$sTime) ;Show time
$sTime = _NumToTime($sCellValue, False) ;Convert number to time in 24-hour format
MsgBox(0,"",$sTime) ;Show time

Func _NumToTime($sNumValue, $AMPM_Format = True)
    $sHour = Int($sNumValue * 24) ;$sNumValue is a fraction of a 24-hour period
    $sRemainder = ($sNumValue * 24) - $sHour ;$sRemainder is a fraction of a minute
    $sMinute = Int($sRemainder * 60) ;Calculate minute
    If $AMPM_Format Then
      If $sHour < 12 Then
            $sAMPM = "AM" ;Anything before 12:00 is AM
      Else
            $sAMPM = "PM" ;Anything after 12:00 is PM
      EndIf
      If $sHour = 0 Or $sHour > 12 Then $sHour = Abs($sHour - 12) ;Use Abs in case $sHour is 0
    Else
      If $sHour < 10 Then $sHour = "0" & $sHour ;Add 0 placeholder to hour
      $sAMPM = "" ;AM/PM is blank
    EndIf
    If $sMinute < 10 Then $sMinute = "0" & $sMinute ;Add 0 placeholder to minute
    Return StringStripWS($sHour & ":" & $sMinute & " " & $sAMPM, 2) ;Return time value and strip spaces at end if format is 24-hour
EndFunc


Macgyver 留個腳印

kk_lee69 发表于 2017-7-14 14:37:50

回复 1# charleschaiyu

或者用這個

#include <Date.au3>
CONST $CONV_DAY_TO_MSEC = 24*1000*60*60
local $Hour = 0
local $Mins = 0
local $Secs = 0
local $ExcelInputValue = 0.34375
$Time = _TicksToTime($ExcelInputValue*$CONV_DAY_TO_MSEC, $Hour, $Mins, $Secs )
$Time = StringFormat("%02i:%02i", $Hour, $Mins)
consolewrite( $Time & @CRLF)

kk_lee69 发表于 2017-7-14 17:51:49

回复 1# charleschaiyu

方法三
#include <Array.au3>
#include <Excel.au3>

Local $sResult, $iRows, $iCols
$eExcel = _ExcelBookOpen(@ScriptDir&"\LEDDisp.xls",0,True) ;打開EXCEL表
$sResult=_ExcelReadCell($eExcel,3,2)
$sResult2=$eExcel.text($eExcel.Activesheet.range("b3:b3").value,"hh:mm")


MsgBox(0,"",$sResult)
MsgBox(0,"",$sResult2)

_ExcelBookClose($eExcel, 0, 0)
$eExcel=0
                       

yamakawa 发表于 2017-7-14 19:26:06

回复 5# kk_lee69


    问题是,假如那个时间格式的位置不确定的话,就不好写啊。。。。不然太简单了。

charleschaiyu 发表于 2017-7-17 13:10:48

先谢谢K大的回复。
再说明一下我的需求描述不对:
我的情况是Excel文件行,列数都不确定,单元格格式只有常规,文本和时间三种。
我想到的是UBound获取Excel的行、列数,再For循环读取Excel单元格数据。然后问题出现了,读取到时间格式的单元格就变成小数数值了。
再次求教,谢谢!

charleschaiyu 发表于 2017-7-17 13:11:33

回复 5# kk_lee69


先谢谢K大的回复。
再说明一下我的需求描述不对:
我的情况是Excel文件行,列数都不确定,单元格格式只有常规,文本和时间三种。
我想到的是UBound获取Excel的行、列数,再For循环读取Excel单元格数据。然后问题出现了,读取到时间格式的单元格就变成小数数值了。
再次求教,谢谢!

kk_lee69 发表于 2017-7-17 13:13:13

回复 7# charleschaiyu

那不就得了先讀取到數組

然後循換判斷用上面的 方法將0.XXXX 換算成文字 不就好了

charleschaiyu 发表于 2017-7-17 13:54:52

谢谢K大指点,最终完成如下,顺便问下,如何将问题改成已解决?

#include <Array.au3>
#include <Excel.au3>
#include <Date.au3>

Local $sResult, $iRows, $iCols
Local $Hour = 0, $Mins = 0, $Secs = 0
Const $CONV_DAY_TO_MSEC = 24 * 1000 * 60 * 60

Local $oAppl = _Excel_Open(False)
Local $sWorkbook = @ScriptDir & '\LEDDisp.xls'
Local $oWorkbook = _Excel_BookOpen($oAppl, $sWorkbook, Default, Default, True)
$sResult = _Excel_RangeRead($oWorkbook, Default, Default, 2)
;$sResult =$oAppl.text($oAppl.transpose($oWorkbook.Activesheet.range("a1:c3").value),"hh:mm")
;_ArrayDisplay($sResult, "显示数组")
$iRows = UBound($sResult, $UBOUND_ROWS) ; 总行数
$iCols = UBound($sResult, $UBOUND_COLUMNS) ; 总列数

For $i = 0 To $iRows - 1
        For $j = 0 To $iCols - 1
                If StringIsFloat($sResult[$i][$j]) = 1 Then
                        $sResult[$i][$j] = _TicksToTime($sResult[$i][$j] * $CONV_DAY_TO_MSEC, $Hour, $Mins, $Secs)
                        $sResult[$i][$j] = StringFormat("%02i:%02i", $Hour, $Mins)
                EndIf
                If $sResult[$i][$j] = "" Then
                        ExitLoop
                EndIf
                MsgBox(0, "", $sResult[$i][$j])
        Next
Next
_Excel_Close($oAppl, True, True)

kk_lee69 发表于 2017-7-17 13:59:42

回复 10# charleschaiyu

直接修改 標題後面加上 [已完成]
页: [1]
查看完整版本: [已解决]关于_Excel_RangeRead读取时间格式问题