Что нового

Дата из Excel

Frost_Imp

looooseeeer
Сообщения
17
Репутация
0
Всем доброго времени суток!
Вопрос по Экселю.
Итак, 2 слова о том, как эксель хранит даты...
При вводе даты в ячейку рабочего листа Excel она выглядит как нормальная календарная дата. Но во внутреннем представлении Excel даты — это порядковые номера от 1 до 2958325, потому что с 1 января 1900 года по 31 декабря 9999 года 2958325 дней. Таким образом, даты в интервале с 01.01.1900 по 31.12.9999 хранятся в Excel как соответствующий порядковый номер. Например, 31.05.57 хранится как 20971, т.к. между 01.01.1900 и 31.05.57 как раз 20971 день. Такое представление дат в Excel позволяет оперировать с ними как с числами. Система дат 1900 по умолчанию используется в Microsoft Excel для Windows.
Если пользоваться функцией _ExcelReadCell - в память (в переменную, в буфер - не важно) сохраняется не дата в привычном представлении, а дата в фотрате excel, то есть некое порядковое число. Соответственно оперировать такой датой в дальнейшем (в частности, вставить туда, куда мне нужно) я не могу.
Подскажите, как избавиться от сей напасти...
 

El Panda

Продвинутый
Сообщения
101
Репутация
59
Напиши небольшую функцию.
Ниже пример, только он возвращает 1957/06/02 :-[ думаю или ты или я где-то просчитался...

Код:
#include <Date.au3>

Func _ExсelDateConvert($date)
   Return _DateAdd("h",$date*24,"1900/01/01 00:00:00")
EndFunc
 
Автор
F

Frost_Imp

looooseeeer
Сообщения
17
Репутация
0
МММ, не подскажешь, как в нее передать... Что-то туплю...
Вот я беру дату
Код:
$birth_date = _ExcelReadCell($oExcel,$row,17) ;дата рождения
 
Автор
F

Frost_Imp

looooseeeer
Сообщения
17
Репутация
0
Код:
$birth_date = _ExcelReadCell($oExcel,$row,17) ;дата рождения
$NewDate = _ExсelDateConvert($birth_date)
Func _ExсelDateConvert($date)
   Return _DateAdd("h",$date*24,"01.01.1900")
EndFunc

возвращает 0
 
Автор
F

Frost_Imp

looooseeeer
Сообщения
17
Репутация
0
El Panda сказал(а):
Дата в формате "YYYY/MM/DD[ HH:MM:SS]"
А если нужен формат DD.MM.YYYY?
Другими словами, как мне сохранить в переменной нормальную дату, например, 12.05.2009?
 

El Panda

Продвинутый
Сообщения
101
Репутация
59
Frost_Imp сказал(а):
А если нужен формат DD.MM.YYYY?
Другими словами, как мне сохранить в переменной нормальную дату, например, 12.05.2009?

Функции нужно передавать дату в формате "YYYY/MM/DD[ HH:MM:SS]"!
А дальше уже работай с возвращаемой датой.

Код:
Func _ExcelDateConvert($date)
   $date = _DateAdd("h",$date*24,"1900/01/01 00:00:00")
   $date = _DateTimeFormat($date,2)
   Return $date
EndFunc
 
Автор
F

Frost_Imp

looooseeeer
Сообщения
17
Репутация
0
Перед всеми нижайше извиняюсь... Из-за своей невнимательности и сам 3 часа убил, и вас отвлек...
В буфер копируется значение
19022009000000
вместо
19.02.2009
А не то что я посчитал датой экселя... Фух...
Что только теперь делать?
_DateTimeFormat требует, чтоб ему скормили "Input date in the format "YYYY/MM/DD[ HH:MM:SS]"". А у меня вообще какой-то самолепный формат... Как от этого кошмара обрать нули и расставить точки?
 

El Panda

Продвинутый
Сообщения
101
Репутация
59
Frost_Imp сказал(а):
А у меня вообще какой-то самолепный формат... Как от этого кошмара обрать нули и расставить точки?

Какая проблема спарсить строку?

Код:
Func ParseDateString($date)
   Return StringLeft($date,2)&"."&StringMid($date,3,2)&"."&StringMid($date,5,4)
EndFunc
 
Автор
F

Frost_Imp

looooseeeer
Сообщения
17
Репутация
0
а если нужно из
19680816000000
сделать
16.08.1968
?
Вопрос снимается
Код:
Return StringMid($date,7,2)&"."&StringMid($date,5,2)&"."&StringLeft($date,4)
 

XpycT

Скриптер
Сообщения
380
Репутация
133
Вот функия которая переделывает дату. Писал для себя, тоже была необходимость переделывать дату в разные форматы.
Код:
#include <Array.au3>

$Date = "19680816000000"

$NewDate = _DateRemake($Date)
If IsArray($NewDate) Then _ArrayDisplay($NewDate)
ConsoleWrite("$NewDate = " & $NewDate & @CR)

; $iDateFormat Определяет в кком формате возвращать дату
; 	0 - Возвращает Массив с датами (По Умолчанию)
; 	1 - Возвращает Дату в Формате "DD.MM.YYYY
; 	2 - Возвращает Дату в Формате "YYYY/MM/DD
Func _DateRemake($iDate, $iDateFormat = 0)
	If Not $iDate Then Return 0

	$NewDotDate   = StringRegExpReplace($iDate, "^(\d{4})(\d{2})(\d{2}).*", "\3.\2.\1")
	$NewSlashDate = StringRegExpReplace($iDate, "^(\d{4})(\d{2})(\d{2}).*", "\1/\2/\3")

	Dim $aDate[3] = [2, $NewDotDate, $NewSlashDate]

	If $iDateFormat = 0 Then Return $aDate
	If $iDateFormat = 1 Then Return $aDate[1]
	If $iDateFormat = 2 Then Return $aDate[2]
EndFunc   ;==>_DateRemake
 

HelpMe

Новичок
Сообщения
85
Репутация
3
Предварительно скопировать
$bak = ClipGet()
Send($bak)
:IL_AutoIt_1:
 

RUVATA

лучше один раз увидеть, чем десять раз услышать...
Сообщения
132
Репутация
38
Frost_Imp, советы конечно дельные, но не изобретайте велосипед.
У ячеек в Excel есть свойство Text (отображаемой строки)
Вот пример:
Содайте на диске C:\ книгу с именем "Test.xls"
в ячейке A1 напишите любую дату, в любом каком хочется фиде и формате
закройте ее сохраните, и поехали...
Код:
#include <Excel.au3>

$sFilePath1 = "C:\Test.xls"
$oExcel = _ExcelBookOpen($sFilePath1)

$myDate = $oExcel.ActiveSheet.Cells(1,1).Text

MsgBox (1,"вот и все...",$myDate)


а для AutoIt "параллельно" - строка или дата, т.к. для него вообще нет разделения и приведения типов.
 
Верх