:: Вопросы по 1С
1C8 и OpenOffice
minotavr
Автор

Сообщений: 3
Дата регистрации: 27.09.2010
Добрый день. Кто может помочь:
1). команда на "просто открыть" .xls-файл при помощи OpenOffice из 1С8
2). из 1С8 читаю данные из .xls-файла при помощи OpenOffice,
ячейка, формат = Дата, значение = 01.03.2008
он читает как: тип = Строка, значение = "39 508"
как с такого значения можно дату получить?.....

"инструментарий":
прServiceManager = Новый COMОбъект("com.sun.star.ServiceManager");
Desktop = прServiceManager.createInstance("com.sun.star.frame.Desktop");
лпСвойства = прServiceManager.Bridge_GetStruct("com.sun.star.beans.PropertyValue");
лпСвойства.Name = "AsTemplate";
лпСвойства.Value = Истина;
Args = Новый COMSafeArray("VT_VARIANT", 2);
Args.SetValue(0, лпСвойства);
лпСвойства2 = прServiceManager.Bridge_GetStruct("com.sun.star.beans.PropertyValue");
лпСвойства2.Name = "Hidden";
лпСвойства2.Value = Истина;
Args.SetValue(1,лпСвойства2);
Document = Desktop.LoadComponentFromURL(ConvertToURL(ФайлПрайсЛиста), "_blank", 0, Args);

Sheets = Document.getSheets();
Sheet = Sheets.getByIndex(0);

лпМассив = ВернутьМассивДиапазонДляOpenOffice();

begCol = лпМассив[0] - 1; //начальная колонка диапазона
begRow = НачСтрока - 1; //нач ячейка
endCol = лпМассив[лпМассив.Количество() - 1];
endRow = КонечнаяСтрока - 1;
Range = Sheet.getCellRangeByPosition(begCol, begRow, endCol, endRow);
лпМассивCOM = Новый COMSafeArray("VT_VARIANT", Range.Columns.Count, Range.Rows.Count);
Состояние(НСтр("ru=""Получение диапазона данных из файла..."";uk=""Отримання діапазону даних з файлу..."""));
лпМассивCOM = Range.getDataArray();

лпПростойМассив = лпМассивCOM.Выгрузить();

Состояние(НСтр("ru = ""Отключение от файла прайс-листа...""; uk = ""Відключення від файлу прайс-листа ..."""));
лпМассивCOM = Неопределено;
прServiceManager = Неопределено;
Document.close(true);
Desktop.terminate();
Ratings: 0 negative/0 positive
Re: 1C8 и OpenOffice
Саян

Сообщений: 57
Дата регистрации: 26.07.2007
* Возвращает .t., если OpenOffice.org инсталлирован, .f. - если нет
* открытие файла
FUNCTION OOoOpenFile( cFilename )
* change backslashes to forward slashes.
LOCAL cURL
cURL = "file:///" + CHRTRAN( cFilename, "\", "/" )
LOCAL oDoc
oDoc = OOoOpenURL( cURL )
RETURN oDoc
ENDFUNC
PROCEDURE DoNothing__ErrorHandler( pnError, pcErrMessage, pnLineNo, pcProgramFileSys16, pcProgram, pcErrorParamSys2018 )
ENDPROC
FUNCTION OOoGetServiceManager()
IF (TYPE([goOOoServiceManager])!="O") OR ISNULL( goOOoServiceManager )
PUBLIC goOOoServiceManager
goOOoServiceManager = CREATEOBJECT( "Com.Sun.Star.ServiceManager.1" )
ENDIF
RETURN goOOoServiceManager
ENDFUNC
FUNCTION OOoServiceManager_CreateInstance( cServiceName )
LOCAL oServiceManager
oServiceManager = OOoGetServiceManager()
LOCAL oInstance
oInstance = .NULL.
LOCAL cOldErrHandler
cOldErrHandler = ON( "ERROR" )
ON ERROR = DoNothing__ErrorHandler( ERROR(), MESSAGE(), LINENO(), SYS(16), PROGRAM(), SYS(2018) )
oInstance = oServiceManager.createInstance( cServiceName )
ON ERROR &cOldErrHandler
IF ISNULL( oInstance )
=__OOoReleaseCachedVars()
oServiceManager = OOoGetServiceManager()
oInstance = oServiceManager.createInstance( cServiceName )
ENDIF
RETURN oInstance
ENDFUNC
FUNCTION OOoGetDesktop()
IF (TYPE([goOOoDesktop])!="O") OR ISNULL( goOOoDesktop )
PUBLIC goOOoDesktop
goOOoDesktop = OOoServiceManager_CreateInstance( "com.sun.star.frame.Desktop" )
* COMARRAY( goOOoDesktop, 10 ) && определяет, каким образом массив передается в com-объект
ENDIF
RETURN goOOoDesktop
ENDFUNC
FUNCTION OOoGetCoreReflection()
IF (TYPE([goOOoCoreReflection])!="O") OR ISNULL( goOOoCoreReflection )
PUBLIC goOOoCoreReflection
goOOoCoreReflection = OOoServiceManager_CreateInstance( "com.sun.star.reflection.CoreReflection" )
* COMARRAY( goOOoCoreReflection, 10 ) && определяет, каким образом массив передается в com-объект
ENDIF
RETURN goOOoCoreReflection
ENDFUNC
FUNCTION OOoCreateStruct( cTypeName )
* Ask service manager for a CoreReflection object.
LOCAL oCoreReflection
oCoreReflection = OOoGetCoreReflection()
* Get the IDL Class for the type name.
LOCAL oXIdlClass
oXIdlClass = .NULL.
LOCAL cOldErrHandler
cOldErrHandler = ON( "ERROR" )
ON ERROR = DoNothing__ErrorHandler( ERROR(), MESSAGE(), LINENO(), SYS(16), PROGRAM(), SYS(2018) )
oXIdlClass = oCoreReflection.forName( cTypeName )
ON ERROR &cOldErrHandler
IF ISNULL( oXIdlClass )
=__OOoReleaseCachedVars()
oCoreReflection = OOoGetCoreReflection()
oXIdlClass = oCoreReflection.forName( cTypeName )
ENDIF
* Create a variable to hold the created Struct.
* Assign it some initial value.
LOCAL oStruct
oStruct = CREATEOBJECT( "relation" ) && assign some kind of object initially
* Ask the class definition to create an instance.
oXIdlClass.CreateObject( @oStruct )
RETURN oStruct
ENDFUNC
FUNCTION OOoPropertyValue( cName, uValue, nHandle, nState )
LOCAL oPropertyValue
oPropertyValue = OOoCreateStruct( "com.sun.star.beans.PropertyValue" )
oPropertyValue.Name = cName
oPropertyValue.Value = uValue
IF TYPE([nHandle])="N"
oPropertyValue.Handle = nHandle
ENDIF
IF TYPE([nState])="N"
oPropertyValue.State = nState
ENDIF
RETURN oPropertyValue
ENDFUNC
FUNCTION OOoOpenURL( cURL )
LOCAL ARRAY aNoArgs[1]
aNoArgs[1] = OOoPropertyValue( "ReadOnly", .F. )
LOCAL oDesktop
oDesktop = OOoGetDesktop()
PUBLIC oDoc
oDoc = oDesktop.LoadComponentFromUrl( cURL, "_blank", 0, @ aNoargs )
* COMARRAY( oDoc, 10 ) && определяет, каким образом массив передается в com-объект
RETURN oDoc
ENDFUNC
PROCEDURE __OOoReleaseCachedVars()
RELEASE goOOoServiceManager, goOOoDesktop, goOOoCoreReflection
ENDPROC
* Convert a local filename to an OOo URL.
FUNCTION OOoConvertToURL( cFilename )
* Ensure leading slash.
IF LEFT( cFilename, 1 ) != "/"
cFileName = "/" + cFileName
ENDIF
LOCAL cURL
cURL = CHRTRAN( cFilename, "\", "/" ) && change backslashes to forward slashes.
cURL = "file://" + cURL
RETURN cURL
ENDFUNC
Ratings: 0 negative/0 positive
Re: 1C8 и OpenOffice
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
Вообще странно что дата в таком случае трактуется не как дата. Однако перевод несложен. Эксель (на Win платформе по умолчанию) использует так называемую "систему дат 1900" - гда дата определяется как порядковый номер дня с начала 1900-го года (т.е. 1 января 1900 года принят как 1 и т.д.) Что нужно обязательно учитывать, так это безмерный идиотизм разработчиков Lotus 1-2-3, которые при разработке своего продукта посчитали что 1900-й год является високосным (тогда как это вовсе не так), и несколько спорное решение MS придерживаться лотусовского формата даты, из-за чего в экселе тоже существует дата 29 февраля 1900 года (а такого дня не существует в календаре). Подробнее про проблему написано тут
Итого - для перевода эекселевского даты-числа в настоящую дату необходимо выполнить следующее преобразование (для простоты в фоксовой нотации):
DO CASE
CASE экселевское_число_дата < 60
дата = DATE(1900, 1, 1) + экселевское_число_дата - 1
CASE экселевское_число_дата > 60
дата = DATE(1900, 1, 1) + экселевское_число_дата - 2
CASE экселевское_число_дата > 60
дата = несуществующий_день_29_февраля_1900_года
ENDCASE


------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: 1C8 и OpenOffice
Foxtrot

Сообщений: 3408
Откуда: Куда:
Дата регистрации: 25.04.2003
шота у тя брат кейс продублировался;) но думаю чел разберется


------------------
Мойте ноги, моя ноги вы моете и руки
Ratings: 0 negative/0 positive
Re: 1C8 и OpenOffice
minotavr
Автор

Сообщений: 3
Дата регистрации: 27.09.2010
==> Саян
Спасиба! буду изучать )



Исправлено 1 раз(а). Последнее : minotavr, 20.10.11 09:30
Ratings: 0 negative/0 positive
Re: 1C8 и OpenOffice
minotavr
Автор

Сообщений: 3
Дата регистрации: 27.09.2010
==> Igor Korolyov
Функция ВернутьДатаСрокГодности(прДней)
Попытка
Если прДней = 0 ИЛИ прДней = "" Тогда
Возврат Неопределено;
КонецЕсли;

Если ТипЗнч(прДней) = Тип("Строка") Тогда
Если Найти(прДней, ".") > 0 Тогда //есть точка в значении, формат ячейки Excel = "общий"
прДней = прДней + " 0:00:00";
прДней = Дата(прДней);
Возврат прДней;
КонецЕсли;
КонецЕсли;

//формат ячейки Excel = "дата"
прДней = Число(прДней);

лпКонстантаВремени = Дата("01.01.0001 0:00:00") + 59926435200; // для OpenOffice начало дат = "01.01.1900 00:00:00" он возвращает "дни"
лпСекунд = прДней * 60 * 60 * 24;
лпДата = лпКонстантаВремени + лпСекунд;

Исключение
гпОшибка = НСтр("ru=""Ошибка: Не удалось считать Срок Годности."";uk=""Помилка: Не вдалося зчитати Термін Придатності.""");
Возврат Неопределено;
КонецПопытки;

Возврат лпДата;
КонецФункции
Ratings: 0 negative/0 positive


Извините, только зарегистрированные пользователи могут оставлять сообщения в этом форуме.

On-line: 3 (Гостей: 3)

© 2000-2024 Fox Club 
Яндекс.Метрика