|
|
|
Список полей из .docx файла | ☑ | ||
|---|---|---|---|---|
|
0
Stepa86
12.03.08
✎
15:14
|
Есть вордовский документ со списком полей, заранее неизвестным списком. Поля в документ добавляются следующим образом: Вставка -> Текст -> Экспресс-блоки -> Поле -> DOCVARIABLE -> Ввод имени поля (например "Контрагент").
Как получить из 1Ски список этих полей? создал тестовый док, и в 1ске написал вот это: Word = Новый COMОбъект("Word.Application"); Word.Documents.Open(ПолноеИмяФайла); Шаблон = Word.ActiveDocument(); //здесь должно быть получение списка полей, но Шаблон.Variables.Count = 0, Word.Quit(); |
|||
|
1
ТелепатБот
гуру
12.03.08
✎
15:14
|
||||
|
2
Stepa86
13.03.08
✎
11:55
|
неужели никто не сталкивался??? чую придется тогда делать через закладки, если их список можно получить или еще через какие нить извращения, так как по умному че т не получается
|
|||
|
3
DDD2006
13.03.08
✎
12:14
|
Я делал так
у меня только офис 2003 а не 2007 Шаблон=СокрЛП(Константы.ЗаявлениеЮрЛица.Получить()); Попытка Выпуск=Новый COMОбъект("Word.Application");//ПолучитьCOMОбъект("","WORD.Application") Исключение Сообщить(ОписаниеОшибки(),"!!!"); Сообщить("Возможно, MS Word не установлен на этом компьютере."); Возврат; КонецПопытки; ДокВыпуск = Выпуск.Documents.Add(Шаблон,False,0); Выпуск.Visible=True; //З 3 ДокВыпуск.Variables.Item("З_3").Value=?(Куда.Пустая()," ",СокрЛП(Куда.Наименование)); |
|||
|
4
Stepa86
13.03.08
✎
13:15
|
(3) суть в том, что мне и надо получить имя поля, которое в твоем случае "З_3". Зная поле записывать туда значения уже получается... Может кто знает где полный список методов (желательно на русском) для работы с Новый COMОбъект("Word.Application") можно достать???
|
|||
|
5
Stepa86
14.03.08
✎
13:22
|
Сырая версия получения списка:
ПолноеИмяФайла = "D:\Doc1.docx"; Сообщить("" + ТекущаяДата() + " Подключение к Word"); Word = Новый COMОбъект("Word.Application"); Сообщить("" + ТекущаяДата() + " Открытие документа"); Word.Documents.Open(ПолноеИмяФайла); Шаблон = Word.ActiveDocument(); Сообщить("" + ТекущаяДата() + " Получение списка полей"); Для Каждого цПоле Из Шаблон.Fields Цикл ТекстПоля = цПоле.Code.Text; Если Лев(ТекстПоля, 12)=" DOCVARIABLE" Тогда ИмяПеременной = Сред(ТекстПоля, 15, Найти(ТекстПоля, "\*") - 17); НовСтрока = ТабличноеПоле1.Добавить(); НовСтрока.ИмяПоля = ИмяПеременной; КонецЕсли; КонецЦикла; Шаблон = 0; Сообщить("" + ТекущаяДата() + " Отключение от Word"); Word.Quit(); Она мне самому не нравиться,но лучше пока не могу найти... |
|||
|
6
Lmn
14.03.08
✎
14:14
|
(4) Можно узнать из справки по VB для Word, но на инглише правда.
Вот тебе пример оттудова для твоего случая: For Each aVar In ActiveDocument.Variables If aVar.Name = "Blue" Then num = aVar.Index Next aVar If num = 0 Then ActiveDocument.Variables.Add Name:="Blue", Value:=6 Else ActiveDocument.Variables(num).Value = 6 End If |
|||
|
7
Stepa86
14.03.08
✎
14:33
|
(6) у меня коллекция ActiveDocument.Variables пустая, а ActiveDocument.Name - поле не найдено
|
|||
|
8
Lmn
14.03.08
✎
15:43
|
(7) Тады вот можно вот твкую красоту навести (обход всех полей типа DOCVARIABLE):
For Each aFld In ActiveDocument.Fields If aFld.Type = 64 Then {Моя мега прога для ковыряния содержимого поля} '64 = wdFieldDocVariable Next aFld Дальше не знаю как без "синтаксического аналза" кода поля имя переменной вырыть. |
|||
|
9
Stepa86
14.03.08
✎
17:08
|
Теперь код усовершенствовался до такого:
Состояние("Подключение к Word"); Попытка Word = Новый COMОбъект("Word.Application"); Исключение Сообщить("Не удалось подключиться к Word.", СтатусСообщения.Важное); Возврат; КонецПопытки; Состояние("Открытие документа"); Попытка Word.Documents.Open(ПолноеИмяФайла); Исключение Сообщить("Не удалось открыть документ в Word.", СтатусСообщения.Важное); Возврат; КонецПопытки; Шаблон = Word.ActiveDocument(); Состояние("Получение списка полей"); СоответствиеРеквизитов.Очистить(); //получение полей Для Каждого цПоле Из Шаблон.Fields Цикл Если цПоле.Type = 64 Тогда ТекстПоля = цПоле.Code.Text; ИмяПеременной = Сред(ТекстПоля, 15, Найти(ТекстПоля, "\* MERGEFORMAT") - 17); Если Лев(ИмяПеременной, 1) = """" И Прав(ИмяПеременной, 1) = """" Тогда ИмяПеременной = Сред(ИмяПеременной, 2, СтрДлина(ИмяПеременной) - 2); КонецЕсли; НовСтрока = СоответствиеРеквизитов.Добавить(); НовСтрока.ПолеДокумента = ИмяПеременной; КонецЕсли; КонецЦикла; //Закрываем документ без сохранения Шаблон.Close(0); Шаблон = 0; Состояние("Отключение от Word"); Word.Quit(); Попытка УдалитьФайлы(ПолноеИмяФайла); Исключение Сообщить(ОписаниеОшибки()); КонецПопытки; Единственное, что интересно: всегда ли .Code.Text = " DOCVARIABLE " + ИмяПеременной + " \* MERGEFORMAT" |
| Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |