这是我的难题。我被赋予了根据来自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();
所以我的代码输出应为:
这是我第一次真正需要使用Office Interop库,因此我很肯定这里缺少某些东西。任何帮助将不胜感激。
答案 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
答案 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");
}