在VSTO文档级别自定义中插入单词内容

本文关键字:插入 单词内 自定义 VSTO 文档级别 | 更新日期: 2023-09-27 17:51:06

我有一个VSTO文档级别自定义,当从我们的应用程序中打开时执行特定的功能。基本上,我们从应用程序内部打开普通文档,然后将普通docx文件中的内容复制到存储在数据库中的VSTO文档文件中。

 var app = new Microsoft.Office.Interop.Word.Application();
                    var docs = app.Documents;
                    var vstoDoc = docs.Open(vstoDocPath);
                    var doc = docs.Open(currentDocPath);
doc.Range().Copy();
vstoDoc.Range().PasteAndFormat(WdRecoveryType.wdFormatOriginalFormatting);

一切都很好,但是使用上面的代码遗漏了与文档相关的某些格式。下面的代码修复了这些问题,但是我很可能会遇到更多的问题,当我遇到它们时,我可以一个接一个地解决它们…

 for (int i = 0; i < doc.Sections.Count; i++)
                    {
                        var footerFont = doc.Sections[i + 1].Footers.GetEnumerator();
                        var headerFont = doc.Sections[i + 1].Headers.GetEnumerator();
                        var footNoteFont = doc.Footnotes.GetEnumerator();
                        foreach (HeaderFooter foot in vstoDoc.Sections[i + 1].Footers)
                        {
                            footerFont.MoveNext();
                            foot.Range.Font.Name = ((HeaderFooter)footerFont.Current).Range.Font.Name;
                        }
                        foreach (HeaderFooter head in vstoDoc.Sections[i + 1].Headers)
                        {
                            headerFont.MoveNext();
                            head.Range.Font.Name = ((HeaderFooter)headerFont.Current).Range.Font.Name;
                        }
                        foreach (Footnote footNote in vstoDoc.Footnotes)
                        {
                            footNoteFont.MoveNext();
                            footNote.Range.Font.Name = ((Footnote)footNoteFont.Current).Range.Font.Name;
                        }
                    }

我需要一种防傻瓜的安全方法,将一个docx文件的内容复制到另一个docx文件,同时保留格式并消除损坏文档的风险。我曾尝试使用反射将两个文档的属性设置为彼此,但代码确实开始看起来有点难看,而且我总是担心我所设置的某些属性可能会产生不希望看到的副作用。我也试过压缩和解压缩docx文件,手动编辑xml,然后重新压缩,这并没有太好工作,我最终在这个过程中损坏了一些文档。

如果过去有人处理过类似的问题,请给我指出正确的方向。

感谢您的宝贵时间

在VSTO文档级别自定义中插入单词内容

此代码复制并保留源格式。

 bookmark.Range.Copy();
 Document newDocument = WordInstance.Documents.Add();
 newDocument.Activate();
 newDocument.Application.CommandBars.ExecuteMso("PasteSourceFormatting");

还有一种更优雅的基于

的管理方法
Globals.ThisAddIn.Application.ActiveDocument.Range().ImportFragment(filePath);

或者您可以执行以下操作

Globals.ThisAddIn.Application.Selection.Range.ImportFragment(filePath);
以获取当前范围,其中filePath是您正在复制的文档的路径。