如何导出一段 DOCX 文件并保持相同的段落编号?
How can I export a piece of a DOCX file and keep the same paragraph numbering?
长话短说:
如何将段落编号捕获为文本的 'part' 并将其导出到 DOCX?
问题
我有一份文件分为章节和小节,读起来类似于一组州法规(Statute 208
,有小节 Statute 208.1
、Statute 208.2
等) .我们通过修改 .docx zip 中的 numbering.xml
文件来创建它。
我想将 'sub-section' (208.5
) 及其文本导出到单独的 .docx 文件。我的 VSTO 加载项可以很好地导出文本,但 编号重置 为 208.1
。这确实有一定道理,因为它现在是文档中 <ilvl>
的第一段。
PDF 工作正常
有趣的是,我能够调用 Word.Range
的 ExportAsFixedFormat
函数并将此选择导出为 PDF 就好了——甚至保留了编号。这让我走上了尝试 'render' 选择的道路,可能会打印出来,以便将其放入新的 .docx 文件中,但我也没有弄清楚。
我尝试过的:
Range.ExportFragment()
同时使用 wdFormatStrictOpenXMLDocument
和 wdFormatDocumentDefault
作为 wdSaveType
值。
- 这些出口但也重置编号。
Document.PrintOut()
使用 PrintToFile = true
和有效的文件名。我现在意识到,从字面上看,这会生成 'printout instructions' 并且不会在路径 filename
处注入具有任何有效文件结构的新文件。
- 显然行不通。 :)
Application.Selection.XML
到变量 content
并在新添加的文档对象上调用 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()
或在导出后关闭而不保存。
此(已过时)link 中有一些有用的信息仍然适用于当前的 Word API:
https://forums.windowssecrets.com/showthread.php/27711-Determining-which-ListTemplates-item-is-in-use-(VBA-Word-2000)
那里的信息 link 建议您可以为您的 ListTemplate 创建一个 name/handle 以便您可以在代码中引用它——只要您的法规样式项目符号与命名的相关联文档的样式。这个想法是首先命名与活动文档的法规项目符号样式关联的 ListTemplate,然后在访问 ListLevels 集合时引用该名称。
例如,您的代码可能如下所示:
ActiveDocument.Styles("StatutesBulletStyle").ListTemplate.Name = "StatuteBulletListTemplate";
完成上述赋值后,您可以通过名称引用模板:
ActiveDocument.ListTemplates("StatuteBulletListTemplate").ListLevels(1).StartAt = 5;
使用上述技术不再需要您尝试弄清楚活动模板是什么...
有帮助吗?
长话短说:
如何将段落编号捕获为文本的 'part' 并将其导出到 DOCX?
问题
我有一份文件分为章节和小节,读起来类似于一组州法规(Statute 208
,有小节 Statute 208.1
、Statute 208.2
等) .我们通过修改 .docx zip 中的 numbering.xml
文件来创建它。
我想将 'sub-section' (208.5
) 及其文本导出到单独的 .docx 文件。我的 VSTO 加载项可以很好地导出文本,但 编号重置 为 208.1
。这确实有一定道理,因为它现在是文档中 <ilvl>
的第一段。
PDF 工作正常
有趣的是,我能够调用 Word.Range
的 ExportAsFixedFormat
函数并将此选择导出为 PDF 就好了——甚至保留了编号。这让我走上了尝试 'render' 选择的道路,可能会打印出来,以便将其放入新的 .docx 文件中,但我也没有弄清楚。
我尝试过的:
Range.ExportFragment()
同时使用wdFormatStrictOpenXMLDocument
和wdFormatDocumentDefault
作为wdSaveType
值。- 这些出口但也重置编号。
Document.PrintOut()
使用PrintToFile = true
和有效的文件名。我现在意识到,从字面上看,这会生成 'printout instructions' 并且不会在路径filename
处注入具有任何有效文件结构的新文件。- 显然行不通。 :)
Application.Selection.XML
到变量content
并在新添加的文档对象上调用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()
或在导出后关闭而不保存。
此(已过时)link 中有一些有用的信息仍然适用于当前的 Word API: https://forums.windowssecrets.com/showthread.php/27711-Determining-which-ListTemplates-item-is-in-use-(VBA-Word-2000)
那里的信息 link 建议您可以为您的 ListTemplate 创建一个 name/handle 以便您可以在代码中引用它——只要您的法规样式项目符号与命名的相关联文档的样式。这个想法是首先命名与活动文档的法规项目符号样式关联的 ListTemplate,然后在访问 ListLevels 集合时引用该名称。
例如,您的代码可能如下所示:
ActiveDocument.Styles("StatutesBulletStyle").ListTemplate.Name = "StatuteBulletListTemplate";
完成上述赋值后,您可以通过名称引用模板:
ActiveDocument.ListTemplates("StatuteBulletListTemplate").ListLevels(1).StartAt = 5;
使用上述技术不再需要您尝试弄清楚活动模板是什么...
有帮助吗?