Статистика

Участников проекта 105
Опубликовано статей 78
Отчет по карме. Топ 20

Новости блога

1 29.11.2013  Сегодня самым активным участникам newblog'а был выплачен доход с sape.
7 02.11.2012  Ура! Свешилось, нашему сайту дали тИЦ 10. Спасибо всем кто принимает участие в развитии нашего блога.
8 21.08.2012  Интеграция с sape.ru. Теперь каждый автор статей на newblog автоматически зарабатывает на рекламе.
Все новости

Топ 5 категорий

Программирование 46
Операционные системы 9
Базы данных 4
Туризм 2
Заметки 2

Последние 5 заметок (90)

gullyar - Закладки gullyar
gullyar - Ваша первая закладка
osadchaya - Закладки osadchaya
Ira0231188 - Закладки Ira0231188
Ira0231188 - Закладки Ira0231188

Ссылки

www.freedev.asia
12 000 шаблонов для Фотошопа: шаблоны для фотошопа. Photoshop Fashion.

Как импортирывать данные в 1С 8.2 из файла Excel если на ПК установлен OpenOffice? (Работаем с файлами xls и ods через Open Office)

23.12.2011 17:00 | Просмотров: 3888 | Доход: 54.39 руб. | Комментариев: 3
[Программирование] 
Рейтинг: 5/1

С ужесточением наказания за использования нелегального ПО, большинство фирм используют лицензионное ПО, однако все очень хотят экономить на ПО. В связи с этим стал вопрос об использование Open Office. И конечно теперь требуется интеграция с ним и 1С 8.2.

В этой статье приведены примеры на 1С 8.2 с описанием основных функций доступа к электронным таблицам через Open Office и небольшой фрагмент кода демонстрирующий использование этих функций на практике. Данный код используется на практике в работе на предприятии, он протестирован и является функционално рабочим.

Так же как и для Microsoft Office вначале необходимо создать COM объект для приложения Open Office:

    //создаем новый ServiceManager
    oServiceManager = Новый COMОбъект("com.sun.star.ServiceManager");  Затем необходимо создать переменную с аргументами (параметрами) запуска приложения sCalc:

    scr = Новый ComОбъект("MSScriptControl.ScriptControl");    
    scr.language = "javascript";
    scr.eval("aArguments = new Array()");
    aArguments = scr.eval("aArguments");
    scr.AddObject("OpenOffice", oServiceManager);
    scr.eval("aArguments[0]=OpenOffice.Bridge_GetStruct('com.sun.star.beans.PropertyValue')");
    scr.eval("aArguments[0].Name='Hidden'");
    scr.eval("aArguments[0].Value=true");

После чего вызываем из объекта ServiceManager непосредственно сам Calc и открываем книгу из файла с заданными параметрами:

   // создаем интерфейс приложения Calc
   oCalcDoc = oServiceManager.createInstance("com.sun.star.frame.Desktop");
   // открываем книгу из файла cUrl
   oBookSh = oCalcDoc.loadComponentFromURL(cUrl, "_blank", 0, aArguments);

Переменную cUrl необходимо сконвертировать из обычного пути Windows в формат подходящий для этой процедуры, для этого можно использовать вот такую функцию:

Функция СделайВURL(стрВхФайл)
    стрФайл = стрВхФайл;
    стрФайл = СтрЗаменить(стрФайл, "\", "/");
    стрФайл = СтрЗаменить(стрФайл, ":", "|");
    стрФайл = СтрЗаменить(стрФайл, " ", "%20");
    стрФайл = "file:///" + стрФайл;
    Возврат стрФайл;
КонецФункции

Для считывания какой-либо ячейки можно использовать функцию:
	//получаем ссылку на первый лист книги
	oSheetSh = oBookSh.getSheets().getByIndex(0);
        ЯчейкаА = СокрЛП(oSheetSh.getCellByPosition(НомерСтолбца, НомерСтроки).getString());//столбец, строка (нумерация с нуля, формат R1C1)

В завершении рекомендуется сделать следующее:
    //Закрытие документа 
    oBook.close(Истина);
    //Закрытие офиса.    
    oCalcDoc.terminate();    
    //ну и на всякий пожарный                 
    oSheet = Неопределено;
    oCalcDoc = Неопределено;

Описание всех классов Open Office можете найти тут http://api.openoffice.org/docs/common/ref/com/sun/star/frame/module-ix.html

Пример реализации, далее приведен фрагмент кода из рабочей обработки, для импорта данных из файла Excel или Ods:

    ФайлExcel = Новый Файл(ПутьШаблонаExcel);
    Если НЕ ФайлExcel.Существует() Тогда
	Предупреждение("Файл шаблона не найден! (" + ФайлExcel.ПолноеИмя + ")");
	Возврат;
    КонецЕсли;
		
    cUrl = "";
    Если Не ВыборФайлаExcel(cUrl) Тогда
	Возврат;
    КонецЕсли;
    //создаем новый ServiceManager
    oServiceManager = Новый COMОбъект("com.sun.star.ServiceManager");
	
    scr = Новый ComОбъект("MSScriptControl.ScriptControl");    
    scr.language = "javascript";
    scr.eval("aArguments = new Array()");
    aArguments = scr.eval("aArguments");
    scr.AddObject("OpenOffice", oServiceManager);
    scr.eval("aArguments[0]=OpenOffice.Bridge_GetStruct('com.sun.star.beans.PropertyValue')");
    scr.eval("aArguments[0].Name='Hidden'");
    scr.eval("aArguments[0].Value=true");	

	oCalcDoc = oServiceManager.createInstance("com.sun.star.frame.Desktop");
	
	cUrlПутьШаблонаExcel = СделайВURL(ПутьШаблонаExcel);
	
	oBookSh = oCalcDoc.loadComponentFromURL(cUrlПутьШаблонаExcel, "_blank", 0, aArguments);
	//получаем ссылку на первый лист новой книги
	oSheetSh = oBookSh.getSheets().getByIndex(0);	
	
	ТаблЗагрузки = Новый ТаблицаЗначений;
	ТаблЗагрузки.Колонки.Добавить("ВекторЗатраты");
	ТаблЗагрузки.Колонки.Добавить("Подразделение");	
	ТаблЗагрузки.Колонки.Добавить("ВидДеятельности");
	ТаблЗагрузки.Колонки.Добавить("УслугиНаСторону");
	ТаблЗагрузки.Колонки.Добавить("ВсегоУслуги");
		
	НачСтлб = 3;
	КонСтлб = 22;
	НачСтр = 6;
	КонСтр = 25;
	
	ВсегоУслугиСтлб = 27;
	УслугиНаСторонуСтлб = 23;
	
	ЯчПодраз = "";
	ЯчВидДеят = "";
	Пропуск = 4;
	
	КолВидовДеят = 20; //количество видов деятельности
	
	ТаблицаВыхода = Новый ТаблицаЗначений;
	ТаблицаВыхода.Колонки.Добавить("СтатьяРасходов").Заголовок = "Статья расходов";	
	Для Ит = 1 По КолВидовДеят Цикл
		ТаблицаВыхода.Колонки.Добавить("X" + Строка(Ит));
	КонецЦикла;	
	ТаблицаВыхода.Колонки.Добавить("УслугиНаСторону").Заголовок = "Услуги на сторону";
	ТаблицаВыхода.Колонки.Добавить("План");	
	
	ДобавьПоле = Истина;
	Для НомСтр = НачСтр По КонСтр Цикл
		СтрТаблЗагрузки = ТаблЗагрузки.Добавить();
		Для НомСтлб = НачСтлб По КонСтлб Цикл												
			ЯчПодразА = СокрЛП(oSheetSh.getCellByPosition(НомСтлб, НачСтр-3).getString());//столбец, строка
			Если НЕ ЯчПодразА = "" Тогда
				ЯчПодраз = ЯчПодразА;
			КонецЕсли;
			ЯчВидДеят = СокрЛП(oSheetSh.getCellByPosition(НомСтлб, НачСтр-1).getString());
			
			Если (НомСтлб - НачСтлб) = (НомСтр - НачСтр) Тогда
				СтрТаблЗагрузки.Подразделение = ЯчПодраз;
				СтрТаблЗагрузки.ВидДеятельности = ЯчВидДеят;
				СтрТаблЗагрузки.ВекторЗатраты = 0;
			КонецЕсли;
				
			Если ДобавьПоле Тогда	
				Если ЯчВидДеят = "" Тогда
					НаимПоля = ЯчПодраз;	
				Иначе
					НаимПоля = ЯчВидДеят;
				КонецЕсли;
				ТаблицаВыхода.Колонки[НомСтлб - НачСтлб + 1].Заголовок = НаимПоля;
				НаимПоля = СтрЗаменить(НаимПоля, "-", "_");
				НаимПоля = СтрЗаменить(НаимПоля, """", "");
				ТаблЗагрузки.Колонки.Добавить(СтрЗаменить(НаимПоля, " ", "_"));				
			КонецЕсли;
				
			Попытка
				СтрТаблЗагрузки[НомСтлб - НачСтлб + 5] = Число(oSheetSh.getCellByPosition(НомСтлб, НомСтр).getString())	
			Исключение
				СтрТаблЗагрузки[НомСтлб - НачСтлб + 5] = 0;
			КонецПопытки
		КонецЦикла;
		
		Попытка
			СтрТаблЗагрузки.ВсегоУслуги = Число(oSheetSh.getCellByPosition(ВсегоУслугиСтлб, НомСтр).getString());
		Исключение
			Сообщить("Не удалось получить ""Всего Услуги"" [Столбец - " + Строка(ВсегоУслугиСтлб) + ", строка - " + Строка(НомСтр) + "]");
			СтрТаблЗагрузки.ВсегоУслуги = 0;
		КонецПопытки;
		
		Попытка
			СтрТаблЗагрузки.УслугиНаСторону = Число(oSheetSh.getCellByPosition(УслугиНаСторонуСтлб, НомСтр).getString());
		Исключение
			Сообщить("Не удалось получить ""Всего Услуги"" [Столбец - " + Строка(УслугиНаСторонуСтлб) + ", строка - " + Строка(НомСтр) + "]");
			СтрТаблЗагрузки.УслугиНаСторону = 0;
		КонецПопытки;		
		ДобавьПоле = Ложь;
	КонецЦикла;
	
	cUrl = СделайВURL(cUrl);
	oBook = oCalcDoc.loadComponentFromURL(cUrl, "_blank", 0, aArguments);
	//получаем ссылку на первый лист новой книги
	oSheet = oBook.getSheets().getByIndex(0);
	
	ПределПС = 20; //количество пустых строк до остановки
	КолПС = 0; // количество пустых строк
	НомСтроки = 3;
	ПределИтераций = 65535;
	
	Попытка 
		КодВидДеят = oSheet.getCellByPosition(2, 3).getString();
		КодВидДеят = Число(КодВидДеят);
	Исключение
		Сообщить("Не удалось получить код вида деятельности! Установлен код 0!");
		КодВидДеят = 0;
	КонецПопытки;
	
	Если (КодВидДеят<0) ИЛИ (КодВидДеят>=КолВидовДеят) Тогда
		Сообщить("Неверный код вида деятельности (" + Строка(КодВидДеят) + ")! Установлен код 0! (Код должен быть от 0 до 19)");
		КодВидДеят = 0;
	КонецЕсли;
	
	Пропуск = 5;
	КолОпераций = 0;
	
	НачСтлб = 1;
	КонСтлб = КолВидовДеят;
	
	Пока (КолПС <= ПределПС) И (НомСтроки <= ПределИтераций) Цикл
		ЗначЯчейкиА = oSheet.getCellByPosition(0, НомСтроки).getString();
		ЗначЯчейкиА = СокрЛП(Строка(ЗначЯчейкиА));		

		Если ЗначЯчейкиА = "" Тогда
			КолПС = КолПС + 1;
		Иначе
			ПустаяСтрокаДанных = Истина;
			Для иСтлб = НачСтлб По КонСтлб Цикл	
				ЗначЯчейкиБ = oSheet.getCellByPosition(иСтлб, НомСтроки).getString();
				Попытка
					ЗначЯчейкиБ = Число(ЗначЯчейкиБ);
				Исключение
					ЗначЯчейкиБ = 0;
				КонецПопытки;
				Если Не ЗначЯчейкиБ = 0 Тогда
                 	ПустаяСтрокаДанных = Ложь;
					Прервать;
				КонецЕсли;
			КонецЦикла;
		КонецЕсли;

		НомСтроки = НомСтроки + 1;		
	КонецЦикла;
	
	ЭлементыФормы.ТабПолеExcel.Значение = ТаблицаВыхода;
	ЭлементыФормы.ТабПолеExcel.СоздатьКолонки();

    //Закрытие документа 
    oBook.close(Истина);
    //Закрытие офиса.    
    oCalcDoc.terminate();    
    //ну и на всякий пожарный                 
    oSheet = Неопределено;
    oCalcDoc = Неопределено;
Предупреждение("Завершено!");

© Tiger
| Комментировать статью |
  • Rman +2 (06.05.2012 19:17)
    Дорого!
    | Ответить |
    • GM +2587 (06.05.2012 22:19)
      Дорого за работающий код?? И сколько по вашему должна стоить статья?
      | Ответить |
  • Rman +2 (06.05.2012 19:17)
    Покажите хотябы часть кода!
    | Ответить |