C#:使用Office Interop库在Word文档中的书签处插入并缩进项目符号点

时间:2018-06-25 19:58:14

标签: c# ms-word office-interop

这是我的难题。我被赋予了根据来自Web前端的用户输入生成现有Word文档的特定部分的任务。系统的后端使用C#编写,其部分使用Microsoft.Office.Interop.Word名称空间编辑word文档。

基本上,他们将从可用指令列表中进行选择,每种指令均属于string类型,然后将其用于生成文档的指令部分,每条单独的指令均是列表中的另一项。这部分工作正常。我的问题是,指令中可能包含字符\,需要将其替换为缩进,或者如果您用文字打开了文档,则必须在项目符号中击中TAB。到目前为止,我已经能够将子弹插入列表的中间,它会继续按预期对它们进行适当编号。更重要的是,我无法根据需要缩进它们。

我已经在这里和其他一些网站上找到了几乎所有可以使用的示例,但都没有成功。最新的迭代在下面的代码中,该代码仅缩进整个列表。

var bookmark = "bookMarkName";
var docPath = @"c:\temp\Template.docx";
var app = new Application();
var doc = app.Documents.Open(docPath);
var range = doc.Bookmarks[bookmark].Range;
var listTemplate = range.ListFormat.ListTemplate;

range.ListFormat.ApplyListTemplate(listTemplate);

string[] bulletList = new string[] {
    @"Point A",
    @"\Point B",
    @"\Point C",
    @"\\Point D",
    @"Point E"
}

var count = bulletList.Length;

for (var i = 0; i < count; i++)
{
    var listLevel = 0;
    var currentItem = bulletList[i];
    var item = currentItem.Replace(@"\", "");

    if (i < count - 1)
        item = item + "\n";

    listLevel += currentItem.ToList().Where(x => x == '\\').Select(x => x).Count();

    for (var x = 0; x < listLevel; x++)
    {
        range.ListFormat.ListIndent();
    }

    range.InsertAfter(item);
}

doc.SaveAs(@"c:\temp\" + DateTime.Now.Ticks + ".docx");
doc.Close();

所以我的代码输出应为:

  • 1点A
    • 1.1点B
    • 1.2点C
      • 1.2.1 D点
  • 2点E

这是我第一次真正需要使用Office Interop库,因此我很肯定这里缺少某些东西。任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:1)

我的计算机上没有Office Interop,但是您可以尝试使用DocX构建列表,将其写入文件,然后将该列表从所述文件插入文档中。

类似这样的东西:

using System.Collections.Specialized;
...
...

DocX doc = DocX.Create("bullet-text.docx");

var firstItem = bulletList[0];
var firstItemLevel = firstItem.ToList().Count(c => c == '\\');
// Using full Namespace to avoid ambiguous reference error.
Xceed.Words.NET.List list = doc.AddList(firstItem.Replace("\\", ""), firstItemLevel, ListItemType.Numbered);

for (var i = 1; i < count; i++)
{
    var currentItem = bulletList[i];
    var item = currentItem.Replace(@"\", "");
    int listLevel = currentItem.ToList().Count(c => c == '\\')

    doc.AddListItem(list, item, listLevel, ListItemType.Numbered);

}

doc.InsertList(list);

doc.Save();

// Collapse the range to the end, as to not overwrite it. Unsure if you need this
range.Collapse(WdCollapseDirection.wdCollapseEnd);

// Insert into the selected range
range.InsertFile(Environment.CurrentDirectory + "\\bullet-text.docx");

我引用过的参考文献:

Nested Bulleted lists in Novacode docx

How to embed file to word docx?

Collapse

InsertFile

答案 1 :(得分:0)

请使用此代码,但首先使用Add DocX DLL

 using (var document = DocX.Create(@"docs\Lists.docx"))
    {
        var numberedList = document.AddList("First List Item.", 0, ListItemType.Numbered);
                //Add a numbered list starting at 2
        document.AddListItem(numberedList, "Second List Item.");
        document.AddListItem(numberedList, "Third list item.");
        document.AddListItem(numberedList, "First sub list item", 1);

        document.AddListItem(numberedList, "Nested item.", 2);
        document.AddListItem(numberedList, "Fourth nested item.");

        var bulletedList = document.AddList("First Bulleted Item.", 0, ListItemType.Bulleted);
        document.AddListItem(bulletedList, "Second bullet item");
        document.AddListItem(bulletedList, "Sub bullet item", 1);
        document.AddListItem(bulletedList, "Second sub bullet item", 2);
        document.AddListItem(bulletedList, "Third bullet item");

        document.InsertList(numberedList);
        document.InsertList(bulletedList);
        document.Save();
        Console.WriteLine("\tCreated: docs\\Lists.docx");
    }

找到Reference From Here