【发布时间】:2023-03-09 00:33:01
【问题描述】:
这是我的困境。我的任务是根据来自 Web 前端的用户输入生成现有 Word 文档的特定部分。系统的后端是用 C# 编写的,其中部分是使用 Microsoft.Office.Interop.Word 命名空间编辑 word 文档。
基本上,他们会从可用指令列表中进行选择,每个指令的类型为string,然后将用于生成文档的指令部分,每个单独的指令是列表中的另一个项目符号。这部分工作正常。我的问题是,说明可以包含字符\,需要用缩进替换,或者如果您用word打开文档,则相当于在项目符号中按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 互操作库,所以我很肯定这里缺少一些东西。任何帮助将不胜感激。
【问题讨论】:
-
嗯,你不应该等到确定反斜杠的数量(该项目属于哪个级别)之后再替换反斜杠吗?
-
我想。我什至不知道如何在插入它们时缩进它们。事后我不知道从哪里开始追踪可能的几十个列表项。
-
如果没有 Word 如何处理此问题的背景知识,您的问题就“过于宽泛”了——尽管我表示同情。 Word 的这一部分很困难,即使在 UI 中也是如此。但是,如果我试图按现状回答这个问题,我们将一事无成,我担心...... -
我建议您首先以用户身份打开 Word 并研究如何创建这样的列表。您需要 Home 选项卡、Paragrph 组、Multilevel List 按钮。画廊中的任何内容都不会符合您的要求,因此请从菜单中选择“定义新的多级列表”。您将看到九个级别 - 选择一个级别以更改其外观。现在,转到此级别的数字样式并查找项目符号条目。为您要支持的每个级别选择一个项目符号。尝试使用缩进和其他东西,直到你得到一个你希望它的外观和理解你正在处理的内容的列表。
-
@DanS。由于项目符号缩进量由每条指令中的反斜杠数量控制,为什么不为所需的每个级别创建样式,然后根据每条指令中的反斜杠计数将样式应用于文本范围?
标签: c# ms-word office-interop