Points de balle dans Word avec c # Interop

J’ai le code suivant qui est supposé append une liste à puces à un document Word que je génère automatiquement. D’après d’autres réponses, je pense que le code est correct, mais que le résultat ne produit pas de puce, il ne semble pas non plus appliquer l’indent. Des idées?

Microsoft.Office.Interop.Word.Paragraph assets; assets = doc.Content.Paragraphs.Add(Type.Missing); // Some code to generate the text foreach (Ssortingng 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(); 

Cela est dû au fait que vous ajoutez plusieurs paragraphes à la plage après la plage (il semble que définir la propriété Text équivaut à InsertAfter). Vous souhaitez insérer avant la plage afin que la mise en forme que vous définissez soit appliquée.

  Paragraph assets = doc.Content.Paragraphs.Add(); assets.Range.ListFormat.ApplyBulletDefault(); ssortingng[] bulletItems = new ssortingng[] { "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); } 

Notez que nous ajoutons une marque de fin de paragraphe à tous les éléments sauf le dernier. Vous obtiendrez une balle vide si vous ajoutez un à la dernière.

Ceci est basé sur la réponse de Tergiver. La différence est qu’il insère les éléments de la liste dans le bon ordre après le paragraphe créé initialement. Pour votre propre usage, définissez la plage de départ sur l’élément pour lequel vous souhaitez insérer la liste.

 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); ssortingng[] bulletItems = new ssortingng[] { "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); } 

S'il vous plaît noter que je ne comprends pas vraiment ce que je fais avec la gamme ici. Cette solution a été trouvée après de nombreux essais et erreurs. Je soupçonne que cela peut avoir à voir avec le fait que je réutilise la même gamme et que la solution de Tergiver saisit une nouvelle gamme à chaque access à la gamme. Je ne comprends surtout pas les lignes suivantes:

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

Généralement, toute modification du code ci-dessus et la liste se mêlent à l'élément précédent. Si quelqu'un pouvait expliquer pourquoi cela fonctionne, je vous en serais reconnaissant.

Vous pouvez essayer le bloc de code ci-dessous si vous souhaitez des relations liste-sous-liste :

 static void Main(ssortingng[] 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(); ssortingng path = Environment.CurrentDirectory; int totalExistDocx = Directory.GetFiles(path, "test*.docx").Count(); path = Path.Combine(path, ssortingng.Format("test{0}.docx", totalExistDocx + 1)); app.ActiveDocument.SaveAs2(path, WdSaveFormat.wdFormatXMLDocument); doc.Close(); Process.Start(path); } catch (Exception exception) { throw; } } 

Attention, ce point: si vous ne connaissez pas la longueur d’entrée, vous ne devez pas définir la valeur de fin de plage comme ceci:

 static void Main(ssortingng[] 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(); ssortingng path = Environment.CurrentDirectory; int totalExistDocx = Directory.GetFiles(path, "test*.docx").Count(); path = Path.Combine(path, ssortingng.Format("test{0}.docx", totalExistDocx + 1)); app.ActiveDocument.SaveAs2(path, WdSaveFormat.wdFormatXMLDocument); doc.Close(); Process.Start(path); } catch (Exception exception) { throw; } }