helpf.pro
Регистрация

Как сформировать новый документ на основании файла, шаблона OpenOffice?

Denisovich
01.02.2011 16:17Прочитано: 5130
Выложите, пожалуйста пример шаблона с таблицей, который будет заполняться данным кодом.
Yandex
Возможно, вас также заинтересует
Реклама на портале
E_Migachev
01.02.2011 16:42Ответ № 1
(0) Denisovich, ниже пример(взят от сюда
):
В файле шаблона должны быть заменяемые элементы типа [НомерДок] и в коде ниже ты заменяешь такие элементы на нужные тебе

Код 1C v 8.х
 //формируем файл из OpenOffice	
	Попытка
		ServiceManager = Новый COMОбъект("com.sun.star.ServiceManager");
		Reflection = ServiceManager.createInstance("com.sun.star.reflection.CoreReflection");
		Desktop = ServiceManager.createInstance("com.sun.star.frame.Desktop");
		
		Args = Новый COMSafeArray("VT_DISPATCH", 1);
		OOДокумент = Desktop.loadComponentFromURL(ПреобразоватьВURL(ИмяФайла), "_blank", 0, Args);
		
		//------------------------------------------------------------
		// Перебираем таблицы в документе, и сопоставляем имена переменных
		// с именами табличных частей.
		Для ТекущаяТаблица = 0 ПО OOДокумент.getTextTables().Count-1 Цикл 
			мТабличнаяЧасть = Неопределено;
			Для ТекущаяСтрока  = 0 ПО OOДокумент.getTextTables().getByIndex(ТекущаяТаблица).Rows.Count-1 Цикл 
				Для ТекущаяКолонка = 0 ПО OOДокумент.getTextTables().getByIndex(ТекущаяТаблица).Columns.Count-1 Цикл 
					
					мТабличнаяЧасть = ИмяТабличнойЧастиВСтроке(
					ПолучитьСтартПеременной( OOДокумент.getTextTables().getByIndex(ТекущаяТаблица).getCellByPosition(ТекущаяКолонка, ТекущаяСтрока).string	) 
					,ДокументСсылка);
					
					Если  мТабличнаяЧасть <> Неопределено Тогда
						Прервать;;	
					КонецЕсли;	
					
				КонецЦикла;
				Если  мТабличнаяЧасть <> Неопределено Тогда
					Прервать;;	
				КонецЕсли;	
			КонецЦикла;
			
			//Итак мы имеем номер текущей таблицы  и имя табличной части
			Если  мТабличнаяЧасть <> Неопределено Тогда
				//Производим редактирование нашей таблицы в соответствии с количеством строк
				ВсегоСтрокТЧ = 0;
				Для Каждого строкаТЧ Из  ДокументСсылка[мТабличнаяЧасть.Имя] Цикл
					ВсегоСтрокТЧ = ВсегоСтрокТЧ+1;
				КонецЦикла;
				//ВсегоСтрокТЧ = ДокументСсылка[мТабличнаяЧасть.Имя].Количество;
				// Добавляем строки
				Для ТекущаяСтрокаТЧ  = 1  По ВсегоСтрокТЧ Цикл
					Если ТекущаяСтрокаТЧ <> ВсегоСтрокТЧ  Тогда
						// Добавляем строку перед нашей
						OOДокумент.getTextTables().getByIndex(ТекущаяТаблица).Rows.I_nsertByIndex(ТекущаяСтрока+ТекущаяСтрокаТЧ-1, 1);
					КонецЕсли;	
					
					Для ТекКол = 0 ПО OOДокумент.getTextTables().getByIndex(ТекущаяТаблица).Columns.Count-1 Цикл 
						
						Если ТекущаяСтрокаТЧ <> ВсегоСтрокТЧ  Тогда             
							ТекстПеременной = ПолучитьПеременнуюИзСтроки(СокрЛП(OOДокумент.getTextTables().getByIndex(ТекущаяТаблица).getCellByPosition(ТекКол, ТекущаяСтрока+ТекущаяСтрокаТЧ).string));
							ТекстПеременной = ?(ПустаяСтрока(ТекстПеременной),"", "["+"_"+Строка(ТекущаяСтрокаТЧ)+"_"+ТекстПеременной+"]");
							OOДокумент.getTextTables().getByIndex(ТекущаяТаблица).getCellByPosition(ТекКол, ТекущаяСтрока+ТекущаяСтрокаТЧ-1).string = ТекстПеременной;
						Иначе                                                   
							ТекстПеременной = ПолучитьПеременнуюИзСтроки(СокрЛП(OOДокумент.getTextTables().getByIndex(ТекущаяТаблица).getCellByPosition(ТекКол, ТекущаяСтрока+ТекущаяСтрокаТЧ-1).string));
							ТекстПеременной = ?(ПустаяСтрока(ТекстПеременной),"", "["+"_"+Строка(ТекущаяСтрокаТЧ)+"_"+ТекстПеременной+"]");
							
							OOДокумент.getTextTables().getByIndex(ТекущаяТаблица).getCellByPosition(ТекКол, ТекущаяСтрока+ТекущаяСтрокаТЧ-1).string = ТекстПеременной;
						КонецЕсли;	
					КонецЦикла;	
				КонецЦикла;	
			КонецЕсли;	
		КонецЦикла;
		
		//------------------------------------------------------------
		// Вытаскивам из шаблона текст 
		//ТекстДокумента = MSWordDoc.Range(0, MSWordDoc.Characters.Count).Text;
		ТекстДокумента = ООПолучитьТекст(OOДокумент);
		
		// Из текста вытаскиваем Имена переменных залюченных а скобки []
		Список = ПолучитьСписокПеременных(ТекстДокумента);
		//Список.ВыбратьЭлемент();
		
		// Заполняем в структуру ревизитовперечень переменных
		СтруктураРеквизитов=СтруктураРеквизитовДокумента(ДокументСсылка);
		ЗначениеРеквизита="";
		
		OOЗамена = OOДокумент.CreateReplaceDescriptor();
		
		Для Каждого ЭлементСписка Из Список Цикл
			
			// Если находится соответствие переменной из документа и шаблона то производим замену
			Если СтруктураРеквизитов.Свойство(ЭлементСписка.Значение, ЗначениеРеквизита ) Тогда
				OOЗамена.SearchString  = "["+ЭлементСписка.Значение+"]";
				OOЗамена.ReplaceString = Строка(ЗначениеРеквизита);
				OOДокумент.ReplaceAll(OOЗамена);
			Иначе
				Сообщить("-> " + ЭлементСписка.Значение+" - Не найден в структуре документа");
				// Заменим переменную на пустую строку
				OOЗамена.SearchString  = "["+ЭлементСписка.Значение+"]";
				OOЗамена.ReplaceString = " ";
				OOДокумент.ReplaceAll(OOЗамена);
				
			КонецЕсли;
			
		КонецЦикла;
		OOДокумент.getCurrentController().getFrame().getContainerWindow().setFocus();
		
	Исключение
		Предупреждение(ОписаниеОшибки());
	КонецПопытки;		   
bugor666
01.02.2011 16:45Ответ № 2
(0) Denisovich, вот здесь обрати внимание на конец процедуры СформироватбФайл_MS_Word_И_OpenOffice(Кнопка):
Код 1C v 8.х
 		OOЗамена = OOДокумент.CreateReplaceDescriptor();
		
		Для Каждого ЭлементСписка Из Список Цикл
			
			// Если находится соответствие переменной из документа и шаблона то производим замену
			Если СтруктураРеквизитов.Свойство(ЭлементСписка.Значение, ЗначениеРеквизита ) Тогда
				OOЗамена.SearchString  = "["+ЭлементСписка.Значение+"]";
				OOЗамена.ReplaceString = Строка(ЗначениеРеквизита);
				OOДокумент.ReplaceAll(OOЗамена);
			Иначе
				Сообщить("-> " + ЭлементСписка.Значение+" - Не найден в структуре документа");
				// Заменим переменную на пустую строку
				OOЗамена.SearchString  = "["+ЭлементСписка.Значение+"]";
				OOЗамена.ReplaceString = " ";
				OOДокумент.ReplaceAll(OOЗамена);
				
			КонецЕсли;
			
		КонецЦикла;
		OOДокумент.getCurrentController().getFrame().getContainerWindow().setFocus();
   

Из этого следует, что в ООДокументе будут меняться слова заключенные в скобки "[]".
Denisovich
01.02.2011 16:52Ответ № 3
Насчет скобок я понял, спасибо.
Для меня не понятен вывод таблицы:
- как вычисляется заголовок таблицы
- как выводятся строки
- как выводится подвал
E_Migachev
01.02.2011 17:52Ответ № 4
(3) Denisovich, этого нет
просто во всем шаблоне слова в [] заменяются на указанные тобой, а шапку или подвал рисуй какую хочешь в шаблоне
Denisovich
02.02.2011 11:06Ответ № 5
Всем спасибо. Разобрался. В строке таблицы параметры должны выглядеть как [НаименованиеТабличнойЧастиДокумента_НаименованиеПеременной], в этом случае строка будет копироваться и потом заполняться значениями из табличной части документа.
Denisovich
02.02.2011 16:14Ответ № 6
Вопрос закрыт!
Подсказка: Вы можете приложить к ответу файл или изображение щелкнув по значку или в редакторе.
Вы не можете отправить комментарий анонимно, пожалуйста войдите или зарегистрируйтесь.
Загрузка... Дождитесь завершения!