Лучший отвечающий
Автомитизация MS Office Word

Вопрос
-
Здравствуйте, уважаемые. Начал писать автоматизацию на 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