1

Тема: Автоматическая нумерация, и не только

Добрый день, уважаемые форумчане, имеется такой вопрос...
имеется несколько файлов Word, расположенные в одной папке, нужно их всех пронумировать поочередно, как бы один документ продолжение другого, а затем из исходя из содержания всех документов собрать одно содержание...
как это все полегче и поудобней сделать?
работаю с Word из с#, с нумерацией вроде разобрался, но был бы очень раз услышав другие способы реализации,
и как быть с содержанием??

2

Re: Автоматическая нумерация, и не только

А по отдельности содержания в документах уже составлены?

3

Re: Автоматическая нумерация, и не только

нет, это как бы большой проект, и каждый раздел вынесен в отдельный документ, содержание должно быть в первом файле сразу после титульного листа


пока что написал вот такую функцию на с#,  идет поочередное открытие каждого файла в папке и проставляются номера страниц исходя из количества страниц в предыдущем файле

   

 public int insertPage(string viWhere, bool bPageFirst,int startPage,int hlevel)
        {
            object alignment = Word.WdPageNumberAlignment.wdAlignPageNumberCenter;
            object bFirstPage = bPageFirst;
            object bF = true;
            Word.Range MyRange;
      
            wordApplication.ActiveWindow.ActivePane.View.SeekView = Word.WdSeekView.wdSeekCurrentPageHeader; // заходим в коллонтитул 
            switch (viWhere)
            {
                case "right":
                    alignment = Word.WdPageNumberAlignment.wdAlignPageNumberRight;
                    break;
                case "left":
                    alignment = Word.WdPageNumberAlignment.wdAlignPageNumberLeft;
                    break;
            }

wordApplication.Selection.HeaderFooter.PageNumbers.NumberStyle = Word.WdPageNumberStyle.wdPageNumberStyleArabic;
wordApplication.Selection.HeaderFooter.PageNumbers.HeadingLevelForChapter = hlevel;
wordApplication.Selection.HeaderFooter.PageNumbers.IncludeChapterNumber = false;
wordApplication.Selection.HeaderFooter.PageNumbers.Add(alignment, bFirstPage);
wordApplication.Selection.HeaderFooter.PageNumbers.RestartNumberingAtSection = true;
wordApplication.Selection.HeaderFooter.PageNumbers.StartingNumber = startPage;
wordApplication.ActiveWindow.ActivePane.View.SeekView = Word.WdSeekView.wdSeekMainDocument; // закрываем коллонтитул
wordApplication.Selection.EndKey();
MyRange = wordDocument.Range();
MyRange.MoveEnd();
MessageBox.Show(Convert.ToString(MyRange.get_Information(Word.WdInformation.wdActiveEndAdjustedPageNumber)));
int rez = (int)MyRange.get_Information(Word.WdInformation.wdActiveEndAdjustedPageNumber);
     return rez;
        }

4

Re: Автоматическая нумерация, и не только

Так общий принцип понятен, Вы проверили этот код и пронумеровали страницы в документах, результат устроил?

5

Re: Автоматическая нумерация, и не только

код рабочий, сам писал, только почему то номера страниц сверху,
хотя это наверно зависит от типа колонтитула: верхний, нижний? не подскажете
и еще непонятно расположение куда вставляются эти самые номера, у меня в колонтитулах рамка и там есть спец место для страниц?
насчет содержаний- думаю пробегаться по всем документам и выявлять все предложения со стилем Заголовок1 и записывать их в отдельный документ, с номерами страниц соответствеено, как вы думаете, правильное решение?

6

Re: Автоматическая нумерация, и не только

1. По колонтитулам: В Ворде верхний колонтитул обозначается параметром Headers, а нижний Footers и доступны эти объекты через объект Section(Раздел). Если обращаться к колонтитулам через объект Selection.HeaderFooter как это делаете вы то для активизации верхнего колонтитула надо обязательно прописать код

ActiveWindow.ActivePane.View.SeekView = wdSeekCurrentPageHeader

для нижнего

 ActiveWindow.ActivePane.View.SeekView =wdSeekCurrentPageFooter

т.е. этими строками вы обращаетесь к текущему верxниму или нижниму колонтитулу.
Опять же Selection.HeaderFooter может привести к ошибке если наборщик вставлял в документ знаки разрывов разделов. Я напишу Вам свой код нумерации страниц документа на VBA комментариями и вы его сможете адаптировать под синтаксис с# xотя код который я напишу можно будет использовать напрямую сразу в ворде. И еще по какому принципу созданы имена файлов, т.е. по какому принципу вы даете понять коду в какой последовательности должны идти файлы.
2. По составлению общего содержания вообще особых проблем не вижу, если правильно решен 1-й пункт

7

Re: Автоматическая нумерация, и не только

Спасибо)
с последовательностью проблем возникнуть не должно, каждый файл имеет в начале своего названия номер. я их буду сортировать на этапе выбора папки, в случае необходимости пользователь сможет поменять местами те или иные документы
при наличии разрывов код ведет себя не так как нужно, почему то выдает не то число страниц в документе

8

Re: Автоматическая нумерация, и не только

и еще одна проблема, просмотрел еще раз эти документы, там довольно таки часто встречаются страницы альбомной ориентации, и все они пронумерованы... раньше нумерация всвавлялась при помощи опять таки с помощью разрывов разделов... и как тут поступать??

9

Re: Автоматическая нумерация, и не только

Тут вот какая фишка. Настройка нумерации страниц и их отображение в документе 2 разных процесса. ОБЪЯСНЮ, в настройках колонтитула в свойстве PageNumbers мы определяем интелектульную нумерацию страниц и от ориентации страницы она не зависит, чтобы в документе видеть номер страницы надо в него добавить поле Page, и его расположение к настройке порядка нумерации не имеет ни какого отношения.

10

Re: Автоматическая нумерация, и не только

Процедура настройки нумерации не сложна. Но есть несколько закавык. Априори для Оглавления мы должны выделить в 1-м документе как минимум 1-ну страницу и нумерацию последующих документов начинать с как минимум с ее учетом. Потом пробежав по всем документам и составив оглавление которое вставим в первый документ, если оно замет более 1-й страницы нам нужно опять пробежать по всем документам и обновить нумерацию страниц и оглавления этих документов а потом уже составить новое уточненное общее оглавление и вставить его в 1-й документ.

11

Re: Автоматическая нумерация, и не только

Вот общая функция нумерующая 1 раздел документа по параметру StartNamber и возвращающая Номер последней страницы документа без учета Оглавления если оно вставлено в конец документа.

Public Function PagesCount(Doc As Document, StartNamber As Long) As Long
Dim Section As Section
Dim HeaderFooter As HeaderFooter, TOC As TableOfContents
    Set HeaderFooter = Doc.Sections(1).Headers(wdHeaderFooterFirstPage)
        With HeaderFooter.PageNumbers
            .RestartNumberingAtSection = True
            .StartingNumber = StartNamber
        End With
     Set HeaderFooter = Doc.Sections(1).Headers(wdHeaderFooterPrimary)
        With HeaderFooter.PageNumbers
            .RestartNumberingAtSection = False
        End With
    Set HeaderFooter = Doc.Sections(1).Headers(wdHeaderFooterEvenPages)
        With HeaderFooter.PageNumbers
            .RestartNumberingAtSection = False
        End With
        If Doc.Sections.Count = 1 Then Exit Function
            For i = 2 To Doc.Sections.Count
                Set Section = Doc.Sections(i)
                Set HeaderFooter = Doc.Sections(i).Headers(wdHeaderFooterFirstPage)
                    With HeaderFooter.PageNumbers
                        .RestartNumberingAtSection = False
                    End With
                Set HeaderFooter = Doc.Sections(i).Headers(wdHeaderFooterPrimary)
                    With HeaderFooter.PageNumbers
                        .RestartNumberingAtSection = False
                    End With
                Set HeaderFooter = Doc.Sections(i).Headers(wdHeaderFooterEvenPages)
                    With HeaderFooter.PageNumbers
                        .RestartNumberingAtSection = False
                    End With
                Next i
                    Set Section = Doc.Sections(Doc.Sections.Count)
                        For i = 1 To Doc.TablesOfContents.Count
                            Set TOC = Doc.TablesOfContents(i)
                                If TOC.Range.Sections(1).Index = Section.Index Then
                                    PagesCount = Doc.Sections(Doc.Sections.Count - 1).Range.Characters.Last.Information(wdActiveEndAdjustedPageNumber) _
                                        - Section.Range.Characters.Last.Information(wdActiveEndAdjustedPageNumber)
                                    Exit Function
                                End If
                        Next i
End Function

Ознакомьтесь пока с кодом, если что-то не понятно пишите, я напишу комментарии

12

Re: Автоматическая нумерация, и не только

Общий смысл должен быть понятен, но сейчас кое сто проверю, и внесу некоторые изменения.

13

Re: Автоматическая нумерация, и не только

aap77 пишет:

Процедура настройки нумерации не сложна. Но есть несколько закавык. Априори для Оглавления мы должны выделить в 1-м документе как минимум 1-ну страницу и нумерацию последующих документов начинать с как минимум с ее учетом. Потом пробежав по всем документам и составив оглавление которое вставим в первый документ, если оно замет более 1-й страницы нам нужно опять пробежать по всем документам и обновить нумерацию страниц и оглавления этих документов а потом уже составить новое уточненное общее оглавление и вставить его в 1-й документ.

Каждый вид проекта имеет определенное количество разделов, также к каждому проекту имеется стандартный образец из которого ясно сколько страниц будет содержать содержание


спасибо большое за помощь), дальнейшие разработки будут продолжаться в понедельник)

14

Re: Автоматическая нумерация, и не только

Вот код уточненый

Public Function PagesCount(Doc As Document, StartNamber As Long) As Long
Dim Section As Section
Dim HeaderFooter As HeaderFooter, TOC As TableOfContents
    Set HeaderFooter = Doc.Sections(1).Headers(wdHeaderFooterPrimary)
        HeaderFooter.Exists = True
        HeaderFooter.LinkToPrevious = True
        With HeaderFooter.PageNumbers
            .RestartNumberingAtSection = True
            .StartingNumber = StartNamber
        End With
        If Doc.Sections.Count > 1 Then
            For i = 2 To Doc.Sections.Count
                Set Section = Doc.Sections(i)
                Set HeaderFooter = Doc.Sections(i).Headers(wdHeaderFooterFirstPage)
                    With HeaderFooter.PageNumbers
                        .RestartNumberingAtSection = False
                    End With
                Set HeaderFooter = Doc.Sections(i).Headers(wdHeaderFooterPrimary)
                    With HeaderFooter.PageNumbers
                        .RestartNumberingAtSection = False
                    End With
                Set HeaderFooter = Doc.Sections(i).Headers(wdHeaderFooterEvenPages)
                    With HeaderFooter.PageNumbers
                        .RestartNumberingAtSection = False
                    End With
                Next i
        End If
                    Set Section = Doc.Sections(Doc.Sections.Count)
                        For i = 1 To Doc.TablesOfContents.Count
                            Set TOC = Doc.TablesOfContents(i)
                                If TOC.Range.Sections(1).Index = Section.Index Then
                                    PagesCount = Doc.Sections(Doc.Sections.Count - 1).Range.Characters.Last.Information(wdActiveEndAdjustedPageNumber)
                                    Exit Function
                                End If
                        Next i
                        PagesCount = Section.Range.Characters.Last.Information(wdActiveEndAdjustedPageNumber)
End Function