如何导出一段 DOCX 文件并保持相同的段落编号?



TL;博士:

如何将段落编号捕获为文本的"部分"并将其导出到 DOCX?


问题

我有一份文件,分为几节和小节,读起来类似于一组州法规(Statute 208,有Statute 208.1Statute 208.2等小节)。我们通过修改 .docx zip 中的numbering.xml文件来创建此文件。

我想导出一个"子部分"(208.5)及其文本到一个单独的.docx文件中。我的 VSTO 外接程序导出文本足够好,但编号重置208.1。这确实有些道理,因为它现在是文档中该<ilvl>的第一段。

PDF工作正常

有趣的是,我能够调用Word.RangeExportAsFixedFormat函数并将此选择导出为PDF,甚至可以保留编号。这导致我走上了一条尝试"渲染"选择的道路,可能是打印出来,以便将其放入新的.docx文件中,但我也没有弄清楚。


我尝试过:

  • Range.ExportFragment()同时使用wdFormatStrictOpenXMLDocumentwdFormatDocumentDefault作为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);

您可以在导出之前使用 ConvertNumbersToText(wdNumberAllNumbers),然后在导出后_Document.Undo()或关闭而不保存。

在这个(日期的)链接中有一些很好的信息,仍然应该适用于当前的Word API: https://forums.windowssecrets.com/showthread.php/27711-确定哪些列表模板-项正在使用-(VBA-Word-2000)

该链接中的信息表明,您可以为 ListTemplate 创建名称/句柄,以便可以在代码中引用它 - 只要法规样式的项目符号与文档的命名样式相关联即可。这个想法是首先命名与活动文档的法规项目符号样式关联的 ListTemplate,然后在访问 ListLevels 集合时引用该名称。

例如,您可能有如下所示的代码:

ActiveDocument.Styles("StatutesBulletStyle").ListTemplate.Name = "StatuteBulletListTemplate";

完成上述作业后,您可以按名称引用模板:

ActiveDocument.ListTemplates("StatuteBulletListTemplate").ListLevels(1).StartAt = 5;

使用上述技术不再需要您尝试找出活动模板是什么......

这有帮助吗?

最新更新