2012-07-16 3 views
3

У меня есть следующий код, который должен добавить маркированный список в текстовый документ, который я генерирую автоматически. Из других ответов я считаю, что код верен, но результат не вызывает никаких пуля, он, похоже, тоже не применяет отступ. Любые идеи?Точки пули в Word с C# Interop

Microsoft.Office.Interop.Word.Paragraph assets; 
assets = doc.Content.Paragraphs.Add(Type.Missing); 

// Some code to generate the text 

foreach (String asset in assetsList) 
{ 
    assetText = assetText + asset + "\n"; 
} 

assets.Range.ListFormat.ApplyBulletDefault(Type.Missing); 

// Add it to the document 
assets.Range.ParagraphFormat.LeftIndent = -1; 
assets.Range.Text = assetText; 
assets.Range.InsertParagraphAfter(); 

ответ

4

Это происходит потому, что вы добавляете несколько абзацев в диапазон после диапазона (кажется, что установка свойства Text эквивалентна InsertAfter). Вы хотите ВставитьВперед диапазону, чтобы применить форматирование.

Paragraph assets = doc.Content.Paragraphs.Add(); 

    assets.Range.ListFormat.ApplyBulletDefault(); 
    string[] bulletItems = new string[] { "One", "Two", "Three" }; 

    for (int i = 0; i < bulletItems.Length; i++) 
    { 
     string bulletItem = bulletItems[i]; 
     if (i < bulletItems.Length - 1) 
      bulletItem = bulletItem + "\n"; 
     assets.Range.InsertBefore(bulletItem); 
    } 

Обратите внимание, что мы добавляем знак конца абзаца ко всем элементам, кроме последнего. Вы получите пустую пулю, если вы добавите ее до последнего.

+0

Использование assets.Range.InsertBefore (bulletItem); вставляет элементы в список в обратном порядке. Возможно, вы имели в виду InsertAfter? –

+1

@GilesRoberts InsertAfter не работает, потому что форматирование (маркер по умолчанию) не применяется. Таким образом, этот код использует InsertBefore и добавляет элементы в обратном порядке. – Tergiver

+0

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

2

Это основано на ответе Тергивера. Разница заключается в том, что он вставляет элементы списка в правильном порядке после первоначально созданного абзаца. Для собственного использования сделайте начальный диапазон равным элементу, который вы хотите вставить в список.

Paragraph assets = doc.Content.Paragraphs.Add(); 
rng = assets.Range; 
rng.InsertAfter("\n"); 
start = rng.End; 
end = rng.End; 
rng = _oDoc.Range(ref start, ref end); 
object listType = 0; 
rng.ListFormat.ApplyBulletDefault(ref listType); 
string[] bulletItems = new string[] { "One", "Two", "Three" }; 
for (int i = 0; i < bulletItems.Length; i++) 
{ 
    string bulletItem = bulletItems[i]; 
    if (i < RowCount - 1) 
    bulletItem = bulletItem + "\n"; 
    rng.InsertAfter(bulletItem); 
} 

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

rng.InsertAfter("\n"); 
start = rng.End; 
end = rng.End; 
rng = _oDoc.Range(ref start, ref end); 

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

0

Вы можете попробовать ниже блока кода, если вы хотите список-Подсписок отношений:

static void Main(string[] args) 
    { 
     try 
     { 
      Application app = new Application(); 
      Document doc = app.Documents.Add(); 
      Range range = doc.Range(0, 0); 
      range.ListFormat.ApplyNumberDefault(); 
      range.Text = "Birinci"; 
      range.InsertParagraphAfter(); 
      ListTemplate listTemplate = range.ListFormat.ListTemplate; 

      //range.InsertAfter("Birinci"); 
      //range.InsertParagraphAfter(); 

      //range.InsertAfter("İkinci"); 
      //range.InsertParagraphAfter(); 

      //range.InsertAfter("Üçüncü"); 
      //range.InsertParagraphAfter(); 

      Range subRange = doc.Range(range.StoryLength - 1); 
      subRange.ListFormat.ApplyBulletDefault(); 
      subRange.ListFormat.ListIndent(); 
      subRange.Text = "Alt Birinci"; 
      subRange.InsertParagraphAfter(); 
      ListTemplate sublistTemplate = subRange.ListFormat.ListTemplate; 

      Range subRange2 = doc.Range(subRange.StoryLength - 1); 
      subRange2.ListFormat.ApplyListTemplate(sublistTemplate); 
      subRange2.ListFormat.ListIndent(); 
      subRange2.Text = "Alt İkinci"; 
      subRange2.InsertParagraphAfter(); 

      Range range2 = doc.Range(range.StoryLength - 1); 
      range2.ListFormat.ApplyListTemplateWithLevel(listTemplate,true); 
      WdContinue isContinue = range2.ListFormat.CanContinuePreviousList(listTemplate); 
      range2.Text = "İkinci"; 
      range2.InsertParagraphAfter(); 

      Range range3 = doc.Range(range2.StoryLength - 1); 
      range3.ListFormat.ApplyListTemplate(listTemplate); 
      range3.Text = "Üçüncü"; 
      range3.InsertParagraphAfter(); 



      string path = Environment.CurrentDirectory; 
      int totalExistDocx = Directory.GetFiles(path, "test*.docx").Count(); 
      path = Path.Combine(path, string.Format("test{0}.docx", totalExistDocx + 1)); 

      app.ActiveDocument.SaveAs2(path, WdSaveFormat.wdFormatXMLDocument); 
      doc.Close(); 

      Process.Start(path); 
     } 
     catch (Exception exception) 
     { 

      throw; 
     } 

    } 

Внимание это точка: Если вы не знаете длину ввода, вы не должны определить конец значения диапазона, как это:

static void Main(string[] args) 
    { 
     try 
     { 
      Application app = new Application(); 
      Document doc = app.Documents.Add(); 
      Range range = doc.Range(0, 0); 
      range.ListFormat.ApplyNumberDefault(); 
      range.Text = "Birinci"; 
      range.InsertParagraphAfter(); 
      ListTemplate listTemplate = range.ListFormat.ListTemplate; 

      //range.InsertAfter("Birinci"); 
      //range.InsertParagraphAfter(); 

      //range.InsertAfter("İkinci"); 
      //range.InsertParagraphAfter(); 

      //range.InsertAfter("Üçüncü"); 
      //range.InsertParagraphAfter(); 

      Range subRange = doc.Range(range.StoryLength - 1, range.StoryLength - 1); 
      subRange.ListFormat.ApplyBulletDefault(); 
      subRange.ListFormat.ListIndent(); 
      subRange.Text = "Alt Birinci"; 
      subRange.InsertParagraphAfter(); 
      ListTemplate sublistTemplate = subRange.ListFormat.ListTemplate; 

      Range subRange2 = doc.Range(subRange.StoryLength - 1, range.StoryLength - 1); 
      subRange2.ListFormat.ApplyListTemplate(sublistTemplate); 
      subRange2.ListFormat.ListIndent(); 
      subRange2.Text = "Alt İkinci"; 
      subRange2.InsertParagraphAfter(); 

      Range range2 = doc.Range(range.StoryLength - 1, range.StoryLength - 1); 
      range2.ListFormat.ApplyListTemplateWithLevel(listTemplate,true); 
      WdContinue isContinue = range2.ListFormat.CanContinuePreviousList(listTemplate); 
      range2.Text = "İkinci"; 
      range2.InsertParagraphAfter(); 

      Range range3 = doc.Range(range2.StoryLength - 1, range.StoryLength - 1); 
      range3.ListFormat.ApplyListTemplate(listTemplate); 
      range3.Text = "Üçüncü"; 
      range3.InsertParagraphAfter(); 



      string path = Environment.CurrentDirectory; 
      int totalExistDocx = Directory.GetFiles(path, "test*.docx").Count(); 
      path = Path.Combine(path, string.Format("test{0}.docx", totalExistDocx + 1)); 

      app.ActiveDocument.SaveAs2(path, WdSaveFormat.wdFormatXMLDocument); 
      doc.Close(); 

      Process.Start(path); 
     } 
     catch (Exception exception) 
     { 

      throw; 
     } 

    } 
Смежные вопросы