2016-10-19 3 views
1

Спасибо, что посмотрели. Я пишу C# для создания слова doc на основе набора данных. Использование Microsoft.Office.Interop.Word Я могу создать документ с отформатированными заголовками для разделов, но нет связанной структуры. Другими словами, я не могу видеть свои разделы в области переходов или создавать Оглавление.Как добавить структурированный контент в документ Word через Interop (C#)?

Вот что я пытаюсь:

Microsoft.Office.Interop.Word.Application WordApp = new Microsoft.Office.Interop.Word.Application(); 
Microsoft.Office.Interop.Word.Document document = WordApp.Documents.Add(ref missing, ref missing, ref missing, ref missing); 

document.Range(0, 0); 

foreach (var solutionModel in solutions) 
{ 
    var hText = document.Paragraphs.Add(); 
    hText.Format.SpaceAfter = 10f; 
    hText.set_Style(Microsoft.Office.Interop.Word.WdBuiltinStyle.wdStyleHeading1); 
    hText.Range.Text = solutionModel.Name; 
    hText.Range.InsertParagraphAfter(); 

    var pText = document.Paragraphs.Add(); 
    pText.Format.SpaceAfter = 50f; 
    pText.set_Style(Microsoft.Office.Interop.Word.WdBuiltinStyle.wdStyleNormal); 
    pText.Range.Text = "Lorem ipsum dolor sit amet."; 
    pText.Range.InsertParagraphAfter(); 
} 

WordApp.Visible = true; 

Это делает красиво в Слове с заголовками (hText), принимающих на родном Header 1 типа, но не связана структура.

+0

Это также может быть проблемой обновления. Сохраните вновь созданный документ, закройте Word и снова откройте документ. На панели навигации * теперь отображается структура вашего документа? –

ответ

2

Вы можете установить OutlineLevel (который расположен на ParagrapFormat в диапазоне абзацев) до желаемого уровня (VBA):

ActiveDocument.Paragraphs(1).Range.ParagraphFormat.OutlineLevel = wdOutlineLevel1 

В вашем случае (C#):

hText.Range.Text = solutionModel.Name; 
hText.Range.ParagraphFormat.OutlineLevel = Microsoft.Office.Interop.Word.WdOutlineLevel.wdOutlineLevel1; 

Это добавит выбранный абзац в навигационный вид

+0

+1 Это действительно может быть проблема. Только для записи: если встроенные стили заголовков не изменены, то уровень контура должен быть уже правильным (т.е. * Заголовок 1 * имеет контурный уровень 1, * Заголовок 2 * имеет общий уровень 2 и т. Д.) –

+0

Это то, что Я изначально тоже думал @DirkVollmar и был очень удивлен, обнаружив, что (как @Matthew) я обнаружил, что он не работает должным образом. Сделав еще несколько исследований, я обнаружил, что установка текста после применения стиля была потеряна. Перемещая настройку текста, прежде чем применять стиль, похоже, решило проблему (см. Мой другой ответ). –

2

Первоначально я думал о том же, что и @Dirk, упомянутом в комментариях, но проверял его и, как вы видели себя, что не работал в ваш код.

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

Вам необходимо установить текст до, применяя стиль.

var hText = document.Paragraphs.Add(); 

hText.Range.Text = solutionModel.Name; // <-- 

hText.set_Style(Microsoft.Office.Interop.Word.WdBuiltinStyle.wdStyleHeading1); 
hText.Format.SpaceAfter = 10f; 
hText.Range.InsertParagraphAfter(); 

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

+1

Действительно, а также установка 'SpaceAfter' должна произойти * после * установки' Style'. –

+1

Правильно, иначе стиль заголовка возвращает измененный SpaceAfter. –

+0

Спасибо, да - порядок, в котором был установлен текст, имеет решающее значение. После этого я устанавливал как уровень контура, так и стиль, и все работало. Спасибо, agian. –