none
Автомитизация MS Office Word RRS feed

  • Вопрос

  • Здравствуйте, уважаемые. Начал писать автоматизацию на Word столкнулся с проблемой, у меня не получается заставить нумерованный список выводится после теста который есть до него. Я создал список так:

    word.ListTemplate template = word_doc.ListTemplates.Add(true, "List");
    
                    word.ListLevels levels = template.ListLevels;
    
    
                    levels[1].Alignment = word.WdListLevelAlignment.wdListLevelAlignLeft;
                    levels[1].NumberFormat = "%1.";
                    levels[1].NumberStyle = word.WdListNumberStyle.wdListNumberStyleArabic;
    
                    word_app.Selection.Range.ListFormat.ApplyListTemplate(template,true,word.WdListApplyTo.wdListApplyToWholeList,word.WdDefaultListBehavior.wdWord10ListBehavior);
    
                    // элементы списка
                    word_app.Selection.TypeText("Элемент №1");
                    word_app.Selection.TypeParagraph();
    
                    word_app.Selection.TypeText("Элемент №2");
                    word_app.Selection.TypeParagraph();
    Пробовал искать в его свойствах, но к сожалению ничего не нашел. Подскажите, пожалуйста, как это сделать. Еще буду очень благодарен за какие то статти или книги по этой теме.

    10 апреля 2012 г. 20:02

Ответы

  • Здравствуйте.

    Вот 2 варианта как это можно сделать, 2ой вариант мне кажется более правильным и логичным:

                Application word_app = new Application();
                word.Document document = word_app.Documents.Open("D:\\test.docx");
                
                word.ListTemplate template = document.ListTemplates.Add(true, "List2");
    
                // добавляем в конец документа новый параграф
                document.Range(document.Content.Start, document.Content.End).InsertParagraphAfter();
                // выделяем данный параграф
                object what = word.WdGoToItem.wdGoToLine;
                object which = word.WdGoToDirection.wdGoToLast;
                word_app.Selection.GoTo(ref what, ref which);
    
    
                word.ListLevels levels = template.ListLevels;
                
                levels[1].Alignment = word.WdListLevelAlignment.wdListLevelAlignLeft;
                levels[1].NumberFormat = "%1.";
                levels[1].NumberStyle = word.WdListNumberStyle.wdListNumberStyleArabic;
    
                word_app.Selection.Range.ListFormat.ApplyListTemplate(template, true, word.WdListApplyTo.wdListApplyToWholeList, word.WdDefaultListBehavior.wdWord10ListBehavior);
    
                // элементы списка
                word_app.Selection.TypeText("Элемент №1");
                word_app.Selection.TypeParagraph();
    
                word_app.Selection.TypeText("Элемент №2");
                word_app.Selection.TypeParagraph();
    
                word_app.Visible = true;

    Второй вариант:
    Application word_app = new Application();
                word.Document document = word_app.Documents.Open("D:\\test.docx");
    
                word.ListTemplate template = document.ListTemplates.Add(true, "List2");
    
                // добавляем в конец документа новый параграф
                document.Paragraphs.Last.Range.InsertParagraphAfter();
                document.Paragraphs.Last.Range.Text = "Элемент №1";
                object start = document.Paragraphs.Last.Range.Start;
    
                document.Paragraphs.Last.Range.InsertParagraphAfter();
                document.Paragraphs.Last.Range.Text = "Элемент №1.5";
    
                document.Paragraphs.Last.Range.InsertParagraphAfter();
                document.Paragraphs.Last.Range.Text = "Элемент №2";
                object end = document.Paragraphs.Last.Range.End;
    
                document.Range(start, end).ListFormat.ApplyListTemplate(template, true, word.WdListApplyTo.wdListApplyToWholeList, word.WdDefaultListBehavior.wdWord10ListBehavior);
                word_app.Visible = true;


    Для связи [mail]

    • Помечено в качестве ответа Vlad Lukjanenko 16 апреля 2012 г. 16:51
    12 апреля 2012 г. 11:24

Все ответы

  • Здравствуйте.

    Вот 2 варианта как это можно сделать, 2ой вариант мне кажется более правильным и логичным:

                Application word_app = new Application();
                word.Document document = word_app.Documents.Open("D:\\test.docx");
                
                word.ListTemplate template = document.ListTemplates.Add(true, "List2");
    
                // добавляем в конец документа новый параграф
                document.Range(document.Content.Start, document.Content.End).InsertParagraphAfter();
                // выделяем данный параграф
                object what = word.WdGoToItem.wdGoToLine;
                object which = word.WdGoToDirection.wdGoToLast;
                word_app.Selection.GoTo(ref what, ref which);
    
    
                word.ListLevels levels = template.ListLevels;
                
                levels[1].Alignment = word.WdListLevelAlignment.wdListLevelAlignLeft;
                levels[1].NumberFormat = "%1.";
                levels[1].NumberStyle = word.WdListNumberStyle.wdListNumberStyleArabic;
    
                word_app.Selection.Range.ListFormat.ApplyListTemplate(template, true, word.WdListApplyTo.wdListApplyToWholeList, word.WdDefaultListBehavior.wdWord10ListBehavior);
    
                // элементы списка
                word_app.Selection.TypeText("Элемент №1");
                word_app.Selection.TypeParagraph();
    
                word_app.Selection.TypeText("Элемент №2");
                word_app.Selection.TypeParagraph();
    
                word_app.Visible = true;

    Второй вариант:
    Application word_app = new Application();
                word.Document document = word_app.Documents.Open("D:\\test.docx");
    
                word.ListTemplate template = document.ListTemplates.Add(true, "List2");
    
                // добавляем в конец документа новый параграф
                document.Paragraphs.Last.Range.InsertParagraphAfter();
                document.Paragraphs.Last.Range.Text = "Элемент №1";
                object start = document.Paragraphs.Last.Range.Start;
    
                document.Paragraphs.Last.Range.InsertParagraphAfter();
                document.Paragraphs.Last.Range.Text = "Элемент №1.5";
    
                document.Paragraphs.Last.Range.InsertParagraphAfter();
                document.Paragraphs.Last.Range.Text = "Элемент №2";
                object end = document.Paragraphs.Last.Range.End;
    
                document.Range(start, end).ListFormat.ApplyListTemplate(template, true, word.WdListApplyTo.wdListApplyToWholeList, word.WdDefaultListBehavior.wdWord10ListBehavior);
                word_app.Visible = true;


    Для связи [mail]

    • Помечено в качестве ответа Vlad Lukjanenko 16 апреля 2012 г. 16:51
    12 апреля 2012 г. 11:24
  • Спасибо большое!
    17 апреля 2012 г. 19:55
  • Здравствуйте, Дмитрий, сделал так как вы мне помогли, но после того когда текст вставляется в ту часть документа, куда мне нужно, оно автоматом дальше все остальные строки начинает нумеровать. Я просмотрел все свойства, но ничего не смог найти подходящего что бы остановить нумерование списка. Подскажите что можно с этим сделать, пожалуйста.
    20 апреля 2012 г. 8:04
  • Скорее всего, если вы делали по 2ом варианту, то проблема в определении границ документа к которым применяется форматирование списком. Так как end опрделяется самым последним параграфом документа:

     object end = document.Paragraphs.Last.Range.End;
    

    Вам нужно получить объект параграфа для последнего пункта списка и end определить через него.

    Для связи [mail]

    20 апреля 2012 г. 8:26
  • Здравствуйте. Извините, Дмитрий, Я пробовал вот так: 
    word.ListTemplate template1 = word_doc.ListTemplates.Add(true, "List1");
                    word.ListLevels levels1 = template1.ListLevels;
    
                    levels1[1].Alignment = word.WdListLevelAlignment.wdListLevelAlignLeft;
                    levels1[1].NumberFormat = "%1)";
                    levels1[1].NumberStyle = word.WdListNumberStyle.wdListNumberStyleArabic;
    
                    object start = null;     
                    object end = null;
                    bool s = false;
    
                    // добавляем выбранные записи
                    for (int i = 0; i < dataGridView1.Rows.Count; i++)
                    {
                        if(dataGridView1.Rows[i].Cells[0].Value != null 
                            && (bool)dataGridView1.Rows[i].Cells[0].Value == true
                            && dataGridView1.Rows[i].Cells[1].Value != null)
                        {
                            word_doc.Paragraphs.Last.Range.InsertParagraphAfter();
                            word_doc.Paragraphs.Last.Range.Text = dataGridView1.Rows[i].Cells[1].Value.ToString();
                            if(!s)
                            {
                                start = word_doc.Paragraphs[word_doc.Paragraphs.Count-1].Range.Start;
                                s = true;
                            }
                            end = word_doc.Paragraphs[word_doc.Paragraphs.Count-1].Range.End;
                        }
                    }
    
                    word_doc.Range(start, end).ListFormat.ApplyListTemplate(template1, false, word.WdListApplyTo.wdListApplyToSelection, word.WdDefaultListBehavior.wdWord10ListBehavior);
    
    но возникает проблема стем что оно последнее выбранное не заносит в документ и перед списком делает пустую строку. В datagridview 2 колонки в 1-вой checkbox во второй текст, по выбранному checkbox оно заносит текст в документ. Извините за плохой код если что, но пока что еще не знаю как это красиво написать. Не подскажете где может быть ошибка, пожалуйста??
    27 апреля 2012 г. 16:31