【发布时间】:2019-01-10 21:40:38
【问题描述】:
TL;DR:
如何将段落编号捕获为文本的“部分”并将其导出到 DOCX?
问题
我有一个文档,它分为多个部分和子部分,其内容类似于一组州法规(Statute 208,带有子部分 Statute 208.1、Statute 208.2 等)。我们通过修改 .docx zip 中的 numbering.xml 文件来创建它。
我想将“子部分”(208.5) 及其文本导出到单独的 .docx 文件中。我的 VSTO 加载项可以很好地导出文本,但 编号重置 为 208.1。这确实有些道理,因为它现在是文档中带有 <ilvl> 的第一段。
PDF 工作正常
有趣的是,我可以调用Word.Range 的ExportAsFixedFormat 函数并将这个选择导出为PDF 就好了——甚至保留编号。这使我走上了一条尝试“渲染”选择的道路,可能就像它会被打印一样,以便将其放入新的 .docx 文件中,但我也没有弄清楚。
我尝试过的:
-
Range.ExportFragment()使用wdFormatStrictOpenXMLDocument和wdFormatDocumentDefault作为wdSaveType值。- 这些导出还要重新编号。
-
Document.PrintOut()使用PrintToFile = true和有效的文件名。我现在意识到,从字面上看,这会生成“打印输出指令”,并且不会在路径filename处注入具有任何有效文件结构的新文件。- 显然不起作用。 :)
-
Application.Selection.XML到变量content并在新添加的 Document 对象上调用Document.Content.InsertXML(content)。- 仍会重置编号。
上下文的代码部分
using Word = Microsoft.Office.Interop.Word;
Word.Range range = Application.ActiveDocument.Range(startPosition, endPosition);
range.Select();
//export to DOCX?
Application.Selection.Range.ExportFragment(
filename, Word.WdSaveFormat.wdFormatDocumentDefault);
【问题讨论】:
-
您可以尝试设置 Range.ListFormat.ListLevelNumber 看看是否有帮助吗?
-
@Jazimov
ListLevelNumber是1,我认为这是因为它是顶级“部分”(域术语).. 但是,我确实在ListLevelNumber下看到了ListString同样,这就是我正在谈论的208.5。也许当我导出该内容时,我可以在事后设置ListLevelString。试一试。 -
太棒了!如果您的想法最终奏效,请告诉我们。
-
那个发现让我找到了
ListValue,它代表列表中 List 对象的“索引”。这也可以,但它只有一个 getter - 没有 setter。接下来,我找到了ListFormat.ConvertNumbersToText()方法。那行得通! ...但是,我还没有找到如何取消转换原始文本.. -
您是否尝试设置 ListLevelNumber?它是读/写的。
标签: c# ms-word vsto word-addins