TL;博士:
如何将段落编号捕获为文本的"部分"并将其导出到 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);
您可以在导出之前使用 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;
使用上述技术不再需要您尝试找出活动模板是什么......
这有帮助吗?