Имя: Пароль:
1C
1С v8
Объединение файлов docx
0 idw
 
05.04.16
11:17
Можно ли программно объединить несколько word'ских файла?
1 Мимохожий Однако
 
05.04.16
11:18
Наверняка
2 DDwe
 
05.04.16
11:23
(0) Объединяйте, пожалуйста. Никто не возражает.
3 idw
 
05.04.16
11:29
Как?
4 Мимохожий Однако
 
05.04.16
11:30
(3)Открой учебник по офису
5 idw
 
05.04.16
11:32
(4) в учебнике по офису написано как в 1С склеить два файла ворда?
6 DDwe
 
05.04.16
11:33
(5) Ты не поверишь )
7 Мэс33
 
05.04.16
11:40
(0) file3.doc = file1.doc + file2.doc;
Шутка.
8 Мэс33
 
05.04.16
11:42
(0) открываешь файл.
Делаешь выделить все и копируешь в новый файл.
Со вторым файлом также.
9 Мэс33
 
05.04.16
11:44
Возможно, надо посмотреть команды (выдернул из макроса):
Selection.WholeStory
Selection.Copy
Selection.PasteAndFormat (wdUseDestinationStylesRecovery)
10 DDwe
 
05.04.16
11:44
(8) "программно объединить" - где программа?
11 idw
 
05.04.16
11:46
(10) 1С пойдет ;)
12 Рэйв
 
05.04.16
11:54
(0)макросом пишется так:

Selection.InsertFile FileName:="1.doc", Range:="", ConfirmConversions:= _
        False, Link:=False, Attachment:=False

Адаптируй в 1С:-)
13 Мэс33
 
05.04.16
12:01
(12) так не интересно. Давай полное законченное решение )
14 Рэйв
 
05.04.16
12:03
(13)полное и законченное стоит полый кошелек денюх:-)
15 Мэс33
 
05.04.16
12:04
(14) ах ты жадный 1Сник )))
16 Рэйв
 
05.04.16
12:07
(15)Надо же поддерживать имидж программиста 1С!
Еще вот поднатужусь и стану тупым и ленивым!:-)
17 Мэс33
 
05.04.16
12:07
EvilMacros = "Sub SuperMacros()
|Selection.InsertFile FileName:="file1.docx", _
|Range:="", ConfirmConversions:=False, Link:=False, Attachment:=False
|Selection.InsertFile FileName:="file2.docx", _
|Range:="", ConfirmConversions:=False, Link:=False, Attachment:=False
|Selection.InsertFile FileName:="file3.docx", _
|Range:="", ConfirmConversions:=False, Link:=False, Attachment:=False
|Selection.InsertFile FileName:="file4.docx", _
|Range:="", ConfirmConversions:=False, Link:=False, Attachment:=False
|End Sub";

Word = Новый COMОбъект("Word.Application");
Word.Documents.Add();
VBComponents = Word.ActiveDocument.VBProject.VBComponents;
Count = VBComponents.Count();
VBComponents.Add(1);
VBComponents.Item(Count + 1).CodeModule.I_nsertLines(1, EvilMacros);
Word.Application.Run(SuperMacros");
Word.Quit();
Word = Неопределено;
18 Рэйв
 
05.04.16
12:08
(17)Ты все испортил!!!(С)
:-)
19 Мэс33
 
05.04.16
12:10
(18) и не говори ))
20 idw
 
05.04.16
12:30
(17) спасибо. Попробую.
Хочу из 1С в один файл объединить несколько таблиц с разной ориентацией.
21 b_ru
 
05.04.16
12:32
(17) Извращение. Мало кто программный доступ к проекту ВБА разрешает.
22 idw
 
05.04.16
12:38
(21) ага.

{Форма.Форма.Форма(446)}: Ошибка при получении значения атрибута контекста (VBProject)
    VBComponents = Word.ActiveDocument.VBProject.VBComponents;
по причине:
Произошла исключительная ситуация (Microsoft Word): Отсутствует доверие к программируемому доступу к проекту Visual
23 Мэс33
 
05.04.16
12:44
(22) ну да разрешить )))

а иначе - юзайте MS Word Merge Tool. Но он платный.
24 b_ru
 
05.04.16
12:57
(23) написать по-человечески тот же макрос не варик?


Word = Новый COMОбъект("Word.Application");
Word.Documents.Add();
Word.ActiveDocument.Selection.InsertFile FileName:="file1.docx", _
Word.ActiveDocument.Range:="", ConfirmConversions:=False, Link:=False, Attachment:=False
Word.ActiveDocument.Selection.InsertFile FileName:="file2.docx", _
Word.ActiveDocument.Range:="", ConfirmConversions:=False, Link:=False, Attachment:=False
Word.ActiveDocument.Selection.InsertFile FileName:="file3.docx", _
Word.ActiveDocument.Range:="", ConfirmConversions:=False, Link:=False, Attachment:=False
Word.ActiveDocument.Selection.InsertFile FileName:="file4.docx", _
Word.ActiveDocument.Range:="", ConfirmConversions:=False, Link:=False, Attachment:=False

Word.Quit();
Word = Неопределено;


и я даже не говорю о том, что сам по себе макрос не особо хороший, хотя рабочий.
25 Мэс33
 
05.04.16
12:58
(24) может и варик ).
Мой вариант был симбиозом двух рецептов )
26 b_ru
 
05.04.16
12:59
точнее

Word = Новый COMОбъект("Word.Application");
Word.Documents.Add();
Word.ActiveDocument.Selection.InsertFile("file1.docx", "", False, False, False)
Word.ActiveDocument.Selection.InsertFile("file2.docx", "", False, False, False)

Word.Quit();
Word = Неопределено;
27 Мэс33
 
05.04.16
13:01
(26) то-то я думаю, что за странный синтаксис:
Word.ActiveDocument.Selection
Word.ActiveDocument.Range
28 idw
 
05.04.16
13:16
(26) не работает что-то метод Selection
тут
Word.ActiveDocument.Selection.InsertFile("file1.docx", "", False, False, False):
Метод объекта не обнаружен (Selection)
29 idw
 
05.04.16
13:29
Так работает:

MSWord = Новый COMОбъект("Word.Application");
    Документ = MSWord.Application.Documents.Add();
    //Документ.Activate();
    MSWord.Application.Selection.InsertFile("W:\ТабДок1.docx",,, Ложь);
    MSWord.Application.Selection.InsertFile("W:\ТабДок4.docx",,, Ложь);
    
    MSWord.Application.Visible = Истина;
    MSWord.Activate();
30 idw
 
05.04.16
13:42
Только при объединении двух вордовских файлов не сохраняется их ориентация:
1-й стоит Портрет,
2-й - Ландшафт.
Выводит все листы в портретной ориентации.
31 Fish
 
05.04.16
13:43
(30) Разрыв раздела вставляй.
32 idw
 
05.04.16
14:05
(31) разрыв страницы макросом делается так:

Selection.InsertBreak Type:=wdPageBreak

а в 1С как сделать?

Пробую так:
MSWord.Application.Selection.InsertBreak.Type=7;

выдает ошибку "Поле объекта не обнаружено (InsertBreak)"
33 Fish
 
05.04.16
14:19
(32) А так? MSWord.Application.Selection.InsertBreak(7)

Только 7 - это вроде разрыв страницы, а тебе нужен разрыв раздела wdSectionBreakNextPage.
34 Fish
 
05.04.16
14:21
(33) Вместо 7 это 2 .
35 idw
 
05.04.16
14:23
(33) (34) да так работает, спасибо. Но ориентацию ставит всё равно одну, первую (портрет).
36 Fish
 
05.04.16
14:24
(35) Потому что надо разрыв раздела ставить (может я с номером параметра ошибся). В ворде в разных разделах может быть разная ориентация, а на разных страницах одного раздела - нет.
37 idw
 
05.04.16
14:25
(36) я так делал:
MSWord.Application.Selection.InsertBreak(2)
38 idw
 
05.04.16
14:25
MSWord = Новый COMОбъект("Word.Application");
    Документ = MSWord.Application.Documents.Add();

    MSWord.Application.Selection.InsertFile("W:\ТабДок1.docx",,, Ложь);
    MSWord.Application.Selection.InsertBreak(2);
    MSWord.Application.Selection.InsertFile("W:\ТабДок5.docx",,, Ложь);
39 Fish
 
05.04.16
14:33
(38) Да, проверил. InsertFile - просто вставляет текст из файла без сохранения ориентации. Может там параметры какие есть, навскидку попробовал параметры ConfirmConversions.
40 Fish
 
05.04.16
14:33
+(39) Не помогло.
41 idw
 
05.04.16
14:39
Сделал так: нажал запись макроса, выделил раздел, нажал кнопку параметры и установил ориентацию, получил такой макрос:

Sub Макрос1()
'
' Макрос1 Макрос
'
'
    With Selection.PageSetup
        .LineNumbering.Active = False
        .Orientation = wdOrientLandscape
        .TopMargin = CentimetersToPoints(3)
        .BottomMargin = CentimetersToPoints(1.5)
        .LeftMargin = CentimetersToPoints(2)
        .RightMargin = CentimetersToPoints(2)
        .Gutter = CentimetersToPoints(0)
        .HeaderDistance = CentimetersToPoints(1.25)
        .FooterDistance = CentimetersToPoints(1.25)
        .PageWidth = CentimetersToPoints(29.7)
        .PageHeight = CentimetersToPoints(21)
        .FirstPageTray = wdPrinterDefaultBin
        .OtherPagesTray = wdPrinterDefaultBin
        .SectionStart = wdSectionNewPage
        .OddAndEvenPagesHeaderFooter = False
        .DifferentFirstPageHeaderFooter = False
        .VerticalAlignment = wdAlignVerticalTop
        .SuppressEndnotes = False
        .MirrorMargins = False
        .TwoPagesOnOne = False
        .BookFoldPrinting = False
        .BookFoldRevPrinting = False
        .BookFoldPrintingSheets = 1
        .GutterPos = wdGutterPosLeft
    End With
End Sub

Как вот его переделать для 1С вот в чем вопрос.
42 Fish
 
05.04.16
14:40
(40) А вот если из файла 2 копипастить (Ctrl+A, Сtrl+С) и вставлять в новый раздел файла 1, то ориентация тоже копируется :)
43 idw
 
05.04.16
14:44
Ура заработало:
MSWord.Application.Selection.PageSetup.Orientation = 1;
44 Fish
 
05.04.16
14:48
(43) Ну если ты заранее знаешь, в каком файле какая ориентация - то пойдёт. А иначе придётся извращаться. Или если в добавляемом файле будет несколько разделов с разной ориентацией.
45 b_ru
 
05.04.16
14:48
(41) Да хз в чем там вопрос. Объктная модель у ворда такая:
Application (окно приложений с конпками меню, вобщем сам ворд)
v
ActiveDocument (текущий открытый документ ворда)
v
Range (область в документе. Свойство Selection возвращает Range, который выделил пользователь, ессно при работе с COM Selection лучше не пользоваться, а использовать непосредственно Range).

Еще у Document есть коллекции Paragraphs (абзацы) и Words (отдельные слова). Элементы этих коллекций тоже имеют свойство Range.
46 idw
 
05.04.16
14:52
(44) да это известно.
47 idw
 
05.04.16
15:00
Еще проблема:
листы, у которых ориентация ландшафт широкие и при сохранении в ворд, получаю ошибку:
"Ошибка экспорта табличного документа: Превышена допустимая ширина документа Word 2007"

А ворде параметр - "по ширине листа не рабоает" FitToPagesWide
48 idw
 
05.04.16
16:12
В экселе это не сделаешь, нет метода InsertFile.
Остается выравнивать по вертикале, если не влазит, то ставить верикальный разделитель.
Всё это делать с помощью методов ПроверитьПрисоединение() и ВывестиВертикальныйРазделительСтраниц().