|
Как при выводе в шаблон ворд сделать цикл? | ☑ | ||
---|---|---|---|---|
0
Мисти
27.02.13
✎
23:07
|
Колонтитулы нашла, весь вывод параметров тоже, осталась одна засада - пункт 2.7 должен быть выведен (3 строчки в нем) последовательно - от 0 до 10 раз (по разным договорам)
Как бы это изобразить? В ексел - понятно (в смысле, в табличный документ) - строчка в цикле заполняется и выводится, а тут как быть? |
|||
1
Classic
27.02.13
✎
23:22
|
Копируй строку
|
|||
2
sanja26
27.02.13
✎
23:36
|
Док.Paragraphs.Add();
//Word.Selection.MoveRight(,); Табл= Word.Selection.Range; //Формируем заголовок: Табл.InsertAfter("П/П*Наименование статьи расходов Агента*Стоимость (руб.)"); Табл.InsertParagraphAfter(); //сама таблица й = 1; Для Каждого строка из Услуги Цикл Табл.InsertAfter(Строка(й) + "*" + строка.Услуга+"*"+Строка.СуммаOUTСНДС); Табл.InsertParagraphAfter(); й = й + 1; КонецЦикла; |
|||
3
sanja26
27.02.13
✎
23:37
|
вот так делал таблицу, полный код. можешь урезать
Word.selection.MoveDown(,12); Док.Paragraphs.Add(); //Word.Selection.MoveRight(,); Табл= Word.Selection.Range; //Формируем заголовок: Табл.InsertAfter("П/П*Наименование статьи расходов Агента*Стоимость (руб.)"); Табл.InsertParagraphAfter(); //сама таблица й = 1; Для Каждого строка из Услуги Цикл Табл.InsertAfter(Строка(й) + "*" + строка.Услуга+"*"+Строка.СуммаOUTСНДС); Табл.InsertParagraphAfter(); й = й + 1; КонецЦикла; Табл.InsertAfter("" + "*" + "ИТОГО общая сумма расходов Агента без НДС:"+"*"+"5"); Табл.InsertParagraphAfter(); Табл.InsertAfter("" + "*" + "НДС 18%:"+"*"+"5"); Табл.InsertParagraphAfter(); Табл.InsertAfter("" + "*" + "ИТОГО общая сумма расходов Агента, включая НДС 18%:"+"*"+"5"); Табл.InsertParagraphAfter(); Табл.ConvertToTable("*"); //Происходит конвертация строки в таблицу //не нравятся звездочки - используйте другой символ Док.Tables(1).AutoFormat(1); Док.Tables(1).Borders(wdBorderBottom).LineStyle = wdLineStyleNone; Док.Tables(1).Borders(wdBorderLeft).LineStyle = wdLineStyleNone; Док.Tables(1).Borders(wdBorderRight).LineStyle = wdLineStyleNone; Док.Tables(1).Borders(wdBorderTop).LineStyle = wdLineStyleNone; Док.Tables(1).Borders(wdBorderVertical).LineStyle = wdLineStyleNone; Док.Tables(1).Borders(wdBorderHorizontal).LineStyle = wdLineStyleNone; |
|||
4
sanja26
27.02.13
✎
23:38
|
й = й + 1 :))
|
|||
5
Мисти
28.02.13
✎
22:20
|
Спасибо большое!
А я и не верила, что это возможно! |
|||
6
mikecool
28.02.13
✎
22:25
|
(5) загугли "Объектная модель Ворд" - кажется первая ссылка дает шикарное описание по свойствам-методам
|
|||
7
Мисти
28.02.13
✎
22:33
|
Спасибо!
|
|||
8
ВалераОшкин
28.02.13
✎
23:06
|
Как вариант работы с таблицами в Ворде.
// Табличная часть ВсегоТЧ = УПН_ОбщиеПроцедуры.ПолучитьКоличествоТЧ(СсылкаНаОбъект); Для WordDocTableNuber = 1 По WordDoc.Tables.Count() Цикл TC = WordDoc.Tables(WordDocTableNuber); // Обходим все строки таблицы в документе Ворд НомерСтрокиДок = 1; Попытка СтрокаТаблицы = TC.Rows(НомерСтрокиДок); Исключение // Есть строки объединеные по вертикали Продолжить; КонецПопытки; //Для Каждого СтрокаТаблицы Из TC.Rows Цикл Пока НомерСтрокиДок <= TC.Rows.Count() Цикл СтрокаТаблицы = TC.Rows(НомерСтрокиДок); // Ищем реквизит ТЧ НашлиРеквизитТЧ = Ложь; КоличествоПолей = СтрокаТаблицы.Range.Fields.Count; Если КоличествоПолей > 0 Тогда Для Инд = 1 По КоличествоПолей Цикл Ном = КоличествоПолей - Инд + 1; СтрокаТаблицы.Range.Fields(Ном).Select(); ИмяРеквизита = WD.Selection.Text; Если ПустаяСтрока(ИмяРеквизита) Тогда Продолжить; КонецЕсли; // Получим имя ТЧ ПозицияТочки = Найти(ИмяРеквизита, "."); Если ПозицияТочки > 0 Тогда ИмяТЧ = Лев(ИмяРеквизита, ПозицияТочки - 1); Иначе Продолжить; КонецЕсли; Если Не УПН_ОбщиеПроцедуры.ОбъектСодержитТЧ(СсылкаНаОбъект, ИмяТЧ) Тогда Продолжить; Иначе НашлиРеквизитТЧ = Истина; КонецЕсли; //ТабличнаяЧасть = УПН_ОбщиеПроцедуры.ПолучитьТаблицуЗначенийИЗТЧ(СсылкаНаОбъект, ИмяТЧ); Прервать; КонецЦикла; КонецЕсли; Если Не НашлиРеквизитТЧ Тогда НомерСтрокиДок = НомерСтрокиДок + 1; Продолжить; КонецЕсли; // Добавляем пустые строки по количеству строк в ТЧ документа ПерваяСтрока = Истина; КоличествоСтрокТЧ = УПН_ОбщиеПроцедуры.ПолучитьКоличествоСтрокТЧ(СсылкаНаОбъект, ИмяТЧ); Если КоличествоСтрокТЧ = 0 Тогда Если TC.Rows.Count() = 1 Тогда Иначе СтрокаТаблицы.Range.Cut(); КонецЕсли; Иначе Для Сч = 1 По КоличествоСтрокТЧ Цикл Если ПерваяСтрока Тогда ПерваяСтрока = Ложь; СтрокаТаблицы.Range.Copy(); Иначе СтрокаТаблицы.Range.Paste(); КонецЕсли; КонецЦикла; КонецЕсли; // Обход таблицы документа по столбцам и заполняем строки Для Сч = 1 По КоличествоСтрокТЧ Цикл НомерСтрокиТЧ = НомерСтрокиДок + Сч - 1; СтрокаТаблицы = TC.Rows(НомерСтрокиТЧ); КоличествоПолей = СтрокаТаблицы.Range.Fields.Count; Если КоличествоПолей > 0 Тогда Для Инд = 1 По КоличествоПолей Цикл Ном = КоличествоПолей - Инд + 1; СтрокаТаблицы.Range.Fields(Ном).Select(); ИмяРеквизита = WD.Selection.Text; Если ПустаяСтрока(ИмяРеквизита) Тогда Продолжить; КонецЕсли; Если ИмяТЧ = Лев(ИмяРеквизита, СтрДлина(ИмяТЧ)) Тогда // Это реквзит ТЧ ИмяРеквизита = Сред(ИмяРеквизита, СтрДлина(ИмяТЧ) + 2); Значение = УПН_ОбщиеПроцедуры.ПолучитьЗначениеРеквизитаТЧДляWord(СсылкаНаОбъект, ИмяТЧ, Сч, ИмяРеквизита, ПолучитьСсылкуНаЗащищеннуюОбработку()); Если Значение <> Неопределено И ЗначениеЗаполнено(Значение) Тогда // ??? изменил 10.12.2012 16:14:25 Wd.ActiveWindow.View.ShowFieldCodes = -1; Wd.Selection.Text = Строка(Значение); Wd.ActiveWindow.View.ShowFieldCodes = 0; Иначе Wd.Selection.Font.Color = 255; КонецЕсли; Иначе // Это реквизит документа Значение = УПН_ОбщиеПроцедуры.ПолучитьЗначениеРеквизитаДляWord(СсылкаНаОбъект, ИмяРеквизита, ПолучитьСсылкуНаЗащищеннуюОбработку()); Если Значение <> Неопределено И ЗначениеЗаполнено(Значение) Тогда // ??? изменил 10.12.2012 16:14:25 Wd.ActiveWindow.View.ShowFieldCodes = -1; Wd.Selection.Text = Строка(Значение); Wd.ActiveWindow.View.ShowFieldCodes = 0; Иначе Wd.Selection.Font.Color = 255; КонецЕсли; КонецЕсли; КонецЦикла; КонецЕсли; КонецЦикла; НомерСтрокиДок = НомерСтрокиДок + ?(КоличествоСтрокТЧ = 0, 1, КоличествоСтрокТЧ); КонецЦикла; КонецЦикла; |
|||
9
Мисти
04.03.13
✎
19:40
|
А сохранить как потом получившееся?
|
|||
10
Mikeware
04.03.13
✎
19:42
|
(6) Это же франч.
|
|||
11
Мисти
04.03.13
✎
19:47
|
(10) А ты знаешь ответ?
Я там почитала - что нашла. Всего очень много, "сохранить" - не видать. |
|||
12
Мисти
04.03.13
✎
20:05
|
SaveAs( - и сразу путь, что ли?
|
|||
13
Мисти
04.03.13
✎
20:10
|
Про цикл:
Что должно быть в шаблоне ворда, чтобы моя таблица встала в нужное место? |
|||
14
KAO111
04.03.13
✎
20:10
|
||||
15
Мисти
04.03.13
✎
20:11
|
Word.selection.MoveDown(,12); - вот это, что ли? 12 - от чего? От верха?
Я пляшу от общеизвестного (уже 10 штук нашла таких в сети) - MSWord = Шаблон.Получить(); //Попытка Документ = MSWord.Application.Documents(1); Документ.Activate(); // колонтитулы MSWord.Sections(1).Headers(1).Range.Text = "Договор лизинга №"+НомерДоговора+ " от " +Формат(ДатаДоговора,"ДФ='дд ММММ гггг'") + " между "+СокрЛП(Лизингодатель.НаименованиеСокращенное)+" и "+СокрЛП(НаименованиеЛизингополучателя.НаименованиеПолное); Замена = Документ.Content.Find; Для каждого СтрокаПараметров Из ТаблицаПараметров Цикл // Заменить заранее определенные ключевые конструкции на требуемый текст. Замена.Execute("[" + СтрокаПараметров.Имя + "]",,,,,,,,, СтрокаПараметров.Значение, 2); Сообщить( СтрокаПараметров.Имя); КонецЦикла; |
|||
16
Мисти
04.03.13
✎
20:18
|
Сохранилось!!
Уря. Осталось с циклом разобраться! Предположим, мне нужно вывести все-то Покупатель1 Покупатель2 Покупатель3 |
|||
17
Мисти
04.03.13
✎
21:20
|
Очень надо!!
|
|||
18
Мисти
04.03.13
✎
21:22
|
Просто параметр - это [пер]
А как сказать, что у меня это таблица! |
|||
19
Мисти
04.03.13
✎
21:49
|
Выборка = Ворд.Selection;
Выборка.GoTo(-1,,,ИмяЗакладки) - это я нашла. Как задать ИмяЗакладки? Это ж не параметр? |
|||
20
Мисти
04.03.13
✎
22:27
|
Закладку тоже нашла.
Выборка = Ворд.Selection; - как это привязать к моим переменным? |
|||
21
Мисти
04.03.13
✎
22:29
|
http://www.abelov.com/kuban/169919.html - вот там, кстати, всё прям у человека получилось!
|
|||
22
Мисти
04.03.13
✎
22:43
|
Табл= Word.Selection.Range; - кто такой тут Word?
Я так понимаю, что у меня и в нужных мне примерах файл открывается разными способами. У меня - Шаблон = ПолучитьМакет("ШаблонWord"); MSWord = Шаблон.Получить(); Документ = MSWord.Application.Documents(1); Документ.Activate(); |
|||
23
Мисти
04.03.13
✎
22:45
|
А в примере -
MSWord=CreateObject("Word.Application"); Документ=MSWord.Documents.Open("c:\aaa.doc"); MSWord.Selection.TypeText("BEGIN"); А как скрестить ужа с ежом? |
|||
24
Мисти
05.03.13
✎
00:34
|
Это самое важное!
|
|||
25
sanja26
05.03.13
✎
01:09
|
(24)а в чем проблема-то?
|
|||
26
sanja26
05.03.13
✎
01:12
|
Word.selection.MoveDown(,12);
Док.Paragraphs.Add(); //Word.Selection.MoveRight(,); Табл= Word.Selection.Range; //Формируем заголовок: Табл.InsertAfter("П/П*Наименование статьи расходов Агента*Стоимость (руб.)"); Табл.InsertParagraphAfter(); //сама таблица й = 1; Для Каждого строка из Услуги Цикл Табл.InsertAfter(Строка(й) + "*" + строка.Услуга+"*"+Строка.СуммаOUTСНДС); Табл.InsertParagraphAfter(); й = й + 1; КонецЦикла; Табл.InsertAfter("" + "*" + "ИТОГО общая сумма расходов Агента без НДС:"+"*"+"5"); Табл.InsertParagraphAfter(); Табл.InsertAfter("" + "*" + "НДС 18%:"+"*"+"5"); Табл.InsertParagraphAfter(); Табл.InsertAfter("" + "*" + "ИТОГО общая сумма расходов Агента, включая НДС 18%:"+"*"+"5"); Табл.InsertParagraphAfter(); Табл.ConvertToTable("*"); //Происходит конвертация строки в таблицу //не нравятся звездочки - используйте другой символ Док.Tables(1).AutoFormat(1); Док.Tables(1).Borders(wdBorderBottom).LineStyle = wdLineStyleNone; Док.Tables(1).Borders(wdBorderLeft).LineStyle = wdLineStyleNone; Док.Tables(1).Borders(wdBorderRight).LineStyle = wdLineStyleNone; Док.Tables(1).Borders(wdBorderTop).LineStyle = wdLineStyleNone; Док.Tables(1).Borders(wdBorderVertical).LineStyle = wdLineStyleNone; Док.Tables(1).Borders(wdBorderHorizontal).LineStyle = wdLineStyleNone; |
|||
27
sanja26
05.03.13
✎
01:13
|
Word.selection.MoveDown(,12);
Док.Paragraphs.Add(); //Word.Selection.MoveRight(,); Табл= Word.Selection.Range; //Формируем заголовок: Табл.InsertAfter("П/П*Наименование статьи расходов Агента*Стоимость (руб.)"); Табл.InsertParagraphAfter(); //сама таблица й = 1; Для Каждого строка из Услуги Цикл Табл.InsertAfter(Строка(й) + "*" + строка.Услуга+"*"+Строка.СуммаOUTСНДС); Табл.InsertParagraphAfter(); й = й + 1; КонецЦикла; Табл.ConvertToTable("*"); //Происходит конвертация строки в таблицу //не нравятся звездочки - используйте другой символ Док.Tables(1).AutoFormat(1); Док.Tables(1).Borders(wdBorderBottom).LineStyle = wdLineStyleNone; Док.Tables(1).Borders(wdBorderLeft).LineStyle = wdLineStyleNone; Док.Tables(1).Borders(wdBorderRight).LineStyle = wdLineStyleNone; Док.Tables(1).Borders(wdBorderTop).LineStyle = wdLineStyleNone; Док.Tables(1).Borders(wdBorderVertical).LineStyle = wdLineStyleNone; Док.Tables(1).Borders(wdBorderHorizontal).LineStyle = wdLineStyleNone; |
|||
28
Мисти
05.03.13
✎
07:53
|
(27) Спасибо! Этот код вселяет оптимизм!
Если у меня ворд определен как Шаблон = ПолучитьМакет("ШаблонWord"); MSWord = Шаблон.Получить(); Документ = MSWord.Application.Documents(1); Документ.Activate(); То к чему можно привязать Word.selection.MoveDown(,12); ? Мне говорят - нет такого метода! |
|||
29
Wobland
05.03.13
✎
07:56
|
(28) вас там двое? v8: Помогите с Word шаблоном
|
|||
30
Мисти
05.03.13
✎
08:28
|
Видела я эту тему!
Если б я нашла описание - к какому объекту какой метод применяется, или как в 1С - точку ставишь, а тебе - подсказку, а так я не могу понять, как соединить мое с примером. У меня готовый шаблон (макет), туда вставляются параметры и, в частности, надо вставить несколько табличных частей. |
|||
31
sanja26
05.03.13
✎
12:25
|
||||
32
sanja26
05.03.13
✎
12:27
|
Word = MSWord.Application;
Документ = Word.Documents(1); Word.selection.MoveDown(,12); |
|||
33
Мисти
17.03.13
✎
16:05
|
В 32 - это то, чего мне не хватало.
Теперь цикл выводится. Как сделать, чтобы в табличку попадало? Шапка есть, как сделать, чтобы строка соответствовала шапке? |
|||
34
Мисти
17.03.13
✎
17:38
|
Табл.ConvertToTable("*");
Почему этот фокус мог не отработать? |
|||
35
Мисти
17.03.13
✎
17:43
|
wdLineStyleNone - ругается.
|
|||
36
Мисти
17.03.13
✎
18:02
|
wdBorderBottom = -3;// Нижняя грань таблицы
wdBorderLeft = -2; // Левая грань таблицы wdBorderRight = -4; //Правая wdBorderTop = -1; // нижняя wdBorderVertical = -6; //Вертикальная (видимо смежная) О!! Что нашла! |
|||
37
acsent
17.03.13
✎
18:11
|
почему бы не взять методологию из бсп?
|
|||
38
Мисти
17.03.13
✎
18:12
|
Сделать хотел грозу, а получил....
Почему-то границы зеленые!! |
|||
39
Мисти
17.03.13
✎
18:12
|
бсп - это что?
|
|||
40
Мисти
17.03.13
✎
18:28
|
Осталась мелочь!
Промежуточной горизонтальной линии нет. Поможите люди-добрые!! |
|||
41
sanja26
17.03.13
✎
20:28
|
insertparagrafafter в цикле забыла
|
|||
42
Мисти
18.03.13
✎
14:50
|
ТабДокумент = Новый ТабличныйДокумент;
Шаблон = ПолучитьМакет("АктВводВагон"); // Получить объект из макета. MSWord = Шаблон.Получить(); //Попытка Документ = MSWord.Application.Documents(1); Документ.Activate(); // колонтитулы MSWord.Sections(1).Headers(1).Range.Text = "Договор лизинга №"+НомерДоговора+ " от " +Формат(ДатаДоговора,"ДФ='дд ММММ гггг'") + " между "+СокрЛП(Лизингодатель.НаименованиеСокращенное)+" и "+СокрЛП(НаименованиеЛизингополучателя.НаименованиеПолное); Замена = Документ.Content.Find; Для каждого СтрокаПараметров Из ТаблицаПараметров Цикл // Заменить заранее определенные ключевые конструкции на требуемый текст. Замена.Execute("[" + СтрокаПараметров.Имя + "]",,,,,,,,, СтрокаПараметров.Значение, 2); Сообщить( СтрокаПараметров.Имя); КонецЦикла; MSWord.Application.Selection.GoTo(-1,,,"Строка1"); Табл= MSWord.Application.Selection.Range; //Формируем заголовок: й=1; Табл.InsertAfter("№ п/п "+ "*" + "Производитель"+"*" +"Наименование"+"*"+ "Идентификационный номер (заводской номер)"+"*"+"Сетевой номер"+"*"+ "Год постройки"); Табл.InsertParagraphAfter(); Для Каждого СтрНом из СписокНоменклатуры Цикл Если СтрНом.Исп Тогда Табл.InsertAfter(Строка(й) + "*" + СтрНом.Номенклатура.ПТС.Производитель+"*" +СтрНом.Номенклатура.ПТС.Наименование+"*"+СтрНом.Номенклатура.ПТС.ИД+"*"+ СтрНом.Номенклатура.ПТС.СетевойНомер+"*"+ СтрНом.Номенклатура.ПТС.ГодИзготовления); Табл.InsertParagraphAfter(); // MSWord.Application.Selection.InsertBreak(7); // MSWord.Application.Selection.Paste(); // MSWord.Application.Selection.TypeParagraph(); // MSWord.Application.Selection.TypeText(СтрокаТекста); //MSWord.Application.Selection.TypeParagraph(); й=й+1; КонецЕсли; КонецЦикла; Табл.ConvertToTable("*"); wdBorderBottom = -3;// Нижняя грань таблицы wdBorderLeft = -2; // Левая грань таблицы wdBorderRight = -4; //Правая wdBorderTop = -1; // нижняя wdBorderVertical = -6; //Вертикальная (видимо смежная) Документ.Tables(1).AutoFormat(1); Документ.Tables(1).Borders(wdBorderBottom).LineStyle = 1; Документ.Tables(1).Borders(wdBorderLeft).LineStyle = 1; //wdLineStyleNone Документ.Tables(1).Borders(wdBorderRight).LineStyle = 1; //wdLineStyleNone Документ.Tables(1).Borders(wdBorderTop).LineStyle = 1; //wdLineStyleNone Документ.Tables(1).Borders(wdBorderVertical).LineStyle = 1; //wdLineStyleNone Ничего не забыла! У меня 3 дефекта - нет промежуточных линий, основные линии почему-то зеленые, а во втором месте, куда я вставляю всё точно так же (дубль, по сути!) - линий нет вообще. Почему? |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |