Вход | Регистрация
 
1С:Предприятие :: 1С:Предприятие 8 общая

Преобразование к типу "Дата" при загрузке из Excel через ADO

Преобразование к типу "Дата" при загрузке из Excel через ADO
Я
   ac13
 
27.12.18 - 08:59
Колонка с датой конечно отображается в виде даты, но совсем не той.

ПодключениеADODB = "MicrosoftJetOLEDB40";
ФайлEXCEL = ИмяФайла;

СonnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source= " + СокрЛП(ФайлEXCEL) + ";Extended Properties=""Excel 12.0;HDR=YES;IMEX=1;""";

ADODBConnection = Новый COMОбъект("ADODB.Connection");
ADODBConnection.ConnectionString = СonnectionString;
ADODBConnection.Open();
ADODBConnection.CursorLocation = 3;

Catalog = Новый COMОбъект("ADOX.Catalog");
Catalog.ActiveConnection = СonnectionString;

КолЛистов = Catalog.Tables.Count;
ИмяЛиста = СокрЛП(Catalog.Tables(0).Name);
ИмяЛиста = Лев(ИмяЛиста, СтрДлина(ИмяЛиста)-1); 

ТекстЗапроса = "SELECT * FROM [" + ИмяЛиста + "$]";

ADODBRecordset = Новый COMОбъект("ADODB.Recordset");
ADODBRecordset.Open(ТекстЗапроса, ADODBConnection);

КолвоСтрокExcel = ADODBRecordset.RecordCount + 1;
КолвоКолонокExcel = ADODBRecordset.Fields.Count;

ТаблицаРезультат = Новый ТаблицаЗначений;
Для ит = 1 ПО КолвоКолонокExcel Цикл
    Поле = ADODBRecordset.Fields.Item(ит - 1);
    ИмяКолонки = "К_" + ит;
    Колонка = ТаблицаРезультат.Колонки.Добавить(ИмяКолонки, , СокрЛП(СтрЗаменить(Поле.Name, "#", "."))); 

КонецЦикла;

НоваяСтрока = ТаблицаРезультат.Добавить();
НоваяСтрока.НомерСтроки = 1;
Для ит = 1 ПО КолвоКолонокExcel Цикл
    ИмяКолонки = "К_" + ит;
    Колонка = ТаблицаРезультат.Колонки.Найти(ИмяКолонки);
    НоваяСтрока[ИмяКолонки] = Колонка.Заголовок;
КонецЦикла;

НомерСтроки = 1;
Пока ADODBRecordset.EOF() = 0 Цикл
    НомерСтроки = НомерСтроки + 1;
    Если НомерСтроки < НачСтрока Тогда
        ADODBRecordset.MoveNext();
        Продолжить;
    КонецЕсли;
    Если КонСтрока > 0 И НомерСтроки > КонСтрока Тогда
        Прервать;
    КонецЕсли;
    
    НоваяСтрока = ТаблицаРезультат.Добавить();
    НоваяСтрока.НомерСтроки = НомерСтроки;
        
    Для ит = 1 ПО КолвоКолонокExcel Цикл
        Поле = ADODBRecordset.Fields.Item(ит - 1);
        Если Поле.ActualSize = 0 Тогда
            Продолжить;
        КонецЕсли;
        ЗначениеЯчейки = Строка(Поле.Value);        
        ИмяКолонки = "К_" + ит;
        НоваяСтрока[ИмяКолонки] = ЗначениеЯчейки;
        ШиринаКолонки = ТаблицаРезультат.Колонки[ИмяКолонки].Ширина;
        ДлинаСтроки   = СтрДлина(СокрЛП(ЗначениеЯчейки));
        ТаблицаРезультат.Колонки[ИмяКолонки].Ширина = ?(ШиринаКолонки < ДлинаСтроки, ДлинаСтроки, ШиринаКолонки);
    КонецЦикла;
    ADODBRecordset.MoveNext();
КонецЦикла;

 
 
   asady
 
1 - 27.12.18 - 09:25
(0) попробуй вместо
ЗначениеЯчейки = Строка(Поле.Value);  
поюзать
ЗначениеЯчейки = Строка(Поле.Value2);
   ac13
 
2 - 10.01.19 - 15:48
(1) не помогает, у меня в колонке с датой есть и другие (текстовые) значения
   ac13
 
3 - 10.01.19 - 16:07
В файле экселя дата вот в таком виде 41990,5960416667
По факту это дата 18.12.2018
Загружаю в 1С, там 17.12.2014
   Сияющий в темноте
 
4 - 10.01.19 - 16:09
на vbscript это vbDouble, переводится в дату просто CDate
а в 1с дата линуксовая,так что или самому считать в днях от начала даты и умножить на 86400.
   ac13
 
5 - 10.01.19 - 16:16
(4) не понял от начала какой даты нужно считать?
   ac13
 
6 - 10.01.19 - 16:32
то, что предлагается тут Вычленение даты из строки - как лучше? так же переводит дату вместо 18.12.2018 вот это 17.12.2014
   Сияющий в темноте
 
7 - 10.01.19 - 21:09
С какой точно не помню,но сразу вычисляется как CStr(CDate(1)) в том же VbScript
и понятно,что CDate(0) ничего не покажет
   breezee
 
8 - 11.01.19 - 06:03
(3) Если так на всех датах - просто добавьте день))
   spectre1978
 
9 - 11.01.19 - 06:34
(3) вообще наличие дробной части, если я верно помню, предполагает что у этой даты есть ещё и время. Оно нужно?
   spectre1978
 
10 - 11.01.19 - 06:53
Начало времен обычно 31.12.1899. с учётом того что 41990 это около 115 лет (неточно, потому что я не учел високосные года), то 2014 год кажется верной цифрой. Покорежиться этот дабл нигде не мог?
 
 Рекламное место пустует
   Sserj
 
11 - 11.01.19 - 07:18
А помоему можно просто
ЗначениеЯчейки = Поле.Text
   НЕА123
 
12 - 11.01.19 - 08:34
   NorthWind
 
13 - 11.01.19 - 08:35
(12) А что характерно, разница между 1899 и 1904 как раз и есть оно самое! Спасибо, пригодится для общего развития. Не знал...
   NorthWind
 
14 - 11.01.19 - 08:44
C++Builder:
    double Src = 41990.5960416667 + 1462;// Константа из (12)

    Label1->Caption = TDateTime (Src).DateTimeString ();
Результат:
18.12.2018 14:18:18
   NorthWind
 
15 - 11.01.19 - 08:49
(3) добавь 1462 дня. Правильным подходом будет сделать в обработке настройку "использовать даты Excel для Mac" и при взведенном крыжике добавлять 1462. Иначе не добавлять.
   ac13
 
16 - 11.01.19 - 14:45
Спасибо большое, очень помогли

Список тем форума
Рекламное место пустует  Рекламное место пустует
Требовать и эффективности, и гибкости от одной и той же программы — все равно, что искать очаровательную и скромную жену... по-видимому, нам следует остановиться на чем-то одном из двух.
Фредерик Брукс-младший
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.
Рекламное место пустует