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

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

Denisovich
01.02.2011 16:17Прочитано: 2777
Выложите, пожалуйста пример шаблона с таблицей, который будет заполняться данным кодом.
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
Вопрос закрыт!
Подсказка: Для выделения Кода используйте (в редакторе).
Вы не можете отправить комментарий анонимно, пожалуйста войдите или зарегистрируйтесь.