将单词内容插入VSTO文档级自定义

时间:2014-03-19 14:01:35

标签: c# ms-word vsto office-interop copy-paste

我有一个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然后再重新压缩,这还没有成功,我在这个过程中最终破坏了一些文档。

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

感谢您的时间

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

基于

,还有一种更优雅的方式来管理它
Globals.ThisAddIn.Application.ActiveDocument.Range().ImportFragment(filePath);

或者您可以执行以下操作

Globals.ThisAddIn.Application.Selection.Range.ImportFragment(filePath);

以获取当前范围,其中filePath是您正在从中获取的文档的路径。

相关问题