Интеграция ООо и 1С77.

Автор smaharbA, 14 октября 2010, 23:25

0 Пользователи и 1 гость просматривают эту тему.

smaharbA

думаю в этом разделе уместнее, ООо приходится и адинеснегам пользовать
уже набил оскомину "кривой" код работы с ООо адинес 77 (лично ООо не пользую),
единожды с похмелья выданный страждущим, так и кочует по всему рунету
немного облагородим (были и ранее предложены методы, но инертность она и будет)

Функция ПолучитьОбертку()
// Вынесем неблагозвучный код для адинеснегов за пределы
Скрипт=СоздатьОбъект("MSScriptControl.ScriptControl");
Скрипт.language="javascript";
//<-- Подготовим нужные методы
Скрипт.Eval("
|ПрототипМассива=Array.prototype;
|ПрототипМассива.ПолучитьЗначение=function(x){return this[x-1]};
|ПрототипМассива.УстановитьЗначение=function(x,y){this[x-1]=y;return this[x-1]};
|ПрототипМассива.РазмерМассива=function(){return this.length};
|УстановитьБулево=function(x){x.Value=Boolean(x.Value)};
|Массив=new Array();
|;");
// Внедрение объекта Скрипта в самого себя, для сохранности контекста
   Скрипт.AddObject("Скрипт",Скрипт);
// Все подготовке -->
Возврат Скрипт.Eval("this");
КонецФункции // ПолучитьОбертку(Это)
//*******************************************
Процедура Сформировать()
Перем Имя,Путь,Это,Скрипт;
Если ФС.ВыбратьФайл(0,Имя,Путь,"","Файлы офиса|*.ods;*.xls;*.odt;*.doc","*")=0 Тогда
Возврат;
КонецЕсли;
Файл=Путь+Имя;
Это=ПолучитьОбертку();
Сообщить(Это);
Массив=Это.Массив;
//УРЛ="file:///"+Это.encodeURI(СтрЗаменить(Файл,"\","/"));
СервисМанагер=СоздатьОбъект("com.sun.star.ServiceManager");
Обновлялка=СервисМанагер.createInstance("com.sun.star.reflection.CoreReflection");
Проводник=СервисМанагер.createInstance("com.sun.star.ucb.FileContentProvider");
УРЛ=Проводник.getFileURLFromSystemPath("",Файл);
Сообщить(УРЛ);
Обновлялка.forName("com.sun.star.beans.PropertyValue").createObject(Массив);
Сообщить(Массив.РазмерМассива(0));
Параметр=Массив.ПолучитьЗначение(1);
Параметр.Name="Hidden";
Параметр.Value=1;//Если 0 или любое пустое значение то Ложь, иначе Истина
Это.УстановитьБулево(Параметр);
Десктоп = СервисМанагер.createInstance("com.sun.star.frame.Desktop");
   //Док = Десктоп.LoadComponentFromURL("private:factory/scalc", "_blank", 0, Массив );
   Док = Десктоп.LoadComponentFromURL(УРЛ, "_blank", 0, Массив );
Листы=Док.getSheets();
Лист=Листы.getByIndex(0);
Курсор=Лист.createCursor();
Курсор.gotoStartOfUsedArea(0);
Курсор.gotoEndOfUsedArea(-1);
Адреса=Курсор.getRangeAddress();
Диапазон=Лист.getCellRangeByPosition(Адреса.StartColumn,Адреса.StartRow,Адреса.EndColumn,Адреса.EndRow);
Поиск=Диапазон.createSearchDescriptor();
Поиск.SearchRegularExpression = -1;
Поиск.SearchString = ".+";
Рез=Диапазон.findAll(Поиск);
Всего=Рез.getCount();
Начало=Рез.getByIndex(0).getRangeAddress();
Конец=Рез.getByIndex(Всего-1).getRangeAddress();
ДиапазонДанных=Диапазон.getSpreadsheet().getCellRangeByPosition(Начало.StartColumn, Начало.StartRow,Конец.EndColumn,Конец.EndRow);
Для С=1 По ДиапазонДанных.getRows().getCount() Цикл
Стр="";
Для К=1 По ДиапазонДанных.getColumns().getCount() Цикл
Стр=Стр+"; "+ДиапазонДанных.getCellByPosition(К-1,С-1).getText().String();
КонецЦикла;
Сообщить(Стр);
КонецЦикла;
Десктоп.Terminate();
//createSearchDescriptor
КонецПроцедуры


(тут присутствует и идея "Фауста" по нахождению диапазона данных, немного требует доделки, выражаю благодарность)
дальнейшее пусть доделывают страждущие
Я конечно далек от мысли... (с)