for flooders
:: Главная :: Решения :: Статьи :: Сайт М. Дроздова :: Файловый архив :: Книга по VFP 9 :: Русский Help Online :: OFF-LINE Форум
   Лисоводы   всех   стран,  объединяйтесь !!!  

Список Форумов  :: Вопросы по 1С
  

1C8 и OpenOffice
minotavr
Автор

Сообщений: 3
Дата: 27.09.10 13:10:32
Добрый день. Кто может помочь:
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
Дата: 19.10.11 11:22:30
* Возвращает .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

Сообщений: 32967
Дата: 19.10.11 13:46:15
Вообще странно что дата в таком случае трактуется не как дата. Однако перевод несложен. Эксель (на 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

Сообщений: 3401
Откуда: Куда:
Дата: 20.10.11 09:05:38
шота у тя брат кейс продублировался но думаю чел разберется


------------------
P.S. будете проходить мимо, не стесняйтесь, проходите
Ratings: 0 negative/0 positive

Re: 1C8 и OpenOffice
minotavr
Автор

Сообщений: 3
Дата: 20.10.11 09:29:41
==> Саян
Спасиба! буду изучать )



Исправлено: minotavr, 20.10.11 09:30
Ratings: 0 negative/0 positive

Re: 1C8 и OpenOffice
minotavr
Автор

Сообщений: 3
Дата: 20.10.11 09:31:56
==> 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: 20 pasha_usue Chemberzhy Meskis  (Гостей: 17)

17.09.2019 13:17:28 exec: 0.34
Mem: 1.228 Mb

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