我已经尝试了几天,将一个单词docx文件加载到一个存在于Windows窗体c#中的webbrowser控件中。 经过几天的努力才能完成这项工作,但在谷歌和一些有用的帖子的帮助下,我已经设法做到这一点,并且它是完美的。我已经完成了:
只有我注意到一个问题: webbrowser控件似乎在Web Layout中查看文件。这就是Ms-Word Web Layout,您知道在Ms-Word,读取模式,打印布局和Web布局中有3种主要的查看布局。问题在于,一些格式错误的docx文件在该webbrowser控件中全部出现偏差,因为它会将它们拉伸出来,好像它们会出现在实际的Web浏览器应用程序中一样。
现在我想要实现的是能够在类似于Ms-Word中的Print Layout的内容中查看该webbrowser控件的内容,或者至少是控件在控件自己的大小内重新调整内容。
(如果我的代码是必要的,那么我可以提供它)
答案 0 :(得分:0)
找到http://codinglight.blogspot.de/2008/10/simple-docbrowser-control.html
这使用webBrowser-Control,但将您的文档转换为HTML文件。 此外,您必须安装MS Word。
使用以下代码创建一个类:
using System;
using System.Linq;
using System.Windows.Forms;
using Microsoft.Office.Interop.Word;
using System.IO;
namespace WordControls
{
public partial class DocBrowser : UserControl
{
private System.Windows.Forms.WebBrowser webBrowser1;
delegate void ConvertDocumentDelegate(string fileName);
public DocBrowser()
{
InitializeComponent();
// Create the webBrowser control on the UserControl.
// This code was moved from the designer for cut and paste
// ease.
webBrowser1 = new System.Windows.Forms.WebBrowser();
webBrowser1.Dock = System.Windows.Forms.DockStyle.Fill;
webBrowser1.Location = new System.Drawing.Point(0, 0);
webBrowser1.MinimumSize = new System.Drawing.Size(20, 20);
webBrowser1.Name = "webBrowser1";
webBrowser1.Size = new System.Drawing.Size(532, 514);
webBrowser1.TabIndex = 0;
Controls.Add(webBrowser1);
// set up an event handler to delete our temp file when we're done with it.
webBrowser1.DocumentCompleted += webBrowser1_DocumentCompleted;
}
string tempFileName = null;
public void LoadDocument(string fileName)
{
// Call ConvertDocument asynchronously.
ConvertDocumentDelegate del = new ConvertDocumentDelegate(ConvertDocument);
// Call DocumentConversionComplete when the method has completed.
del.BeginInvoke(fileName, DocumentConversionComplete, null);
}
void ConvertDocument(string fileName)
{
object m = System.Reflection.Missing.Value;
object oldFileName = (object)fileName;
object readOnly = (object)false;
ApplicationClass ac = null;
try
{
// First, create a new Microsoft.Office.Interop.Word.ApplicationClass.
ac = new ApplicationClass();
// Now we open the document.
Document doc = ac.Documents.Open(ref oldFileName, ref m, ref readOnly,
ref m, ref m, ref m, ref m, ref m, ref m, ref m,
ref m, ref m, ref m, ref m, ref m, ref m);
// Create a temp file to save the HTML file to.
tempFileName = GetTempFile("html");
// Cast these items to object. The methods we're calling
// only take object types in their method parameters.
object newFileName = (object)tempFileName;
// We will be saving this file as HTML format.
object fileType = (object)WdSaveFormat.wdFormatHTML;
// Save the file.
doc.SaveAs(ref newFileName, ref fileType,
ref m, ref m, ref m, ref m, ref m, ref m, ref m,
ref m, ref m, ref m, ref m, ref m, ref m, ref m);
}
finally
{
// Make sure we close the application class.
if (ac != null)
ac.Quit(ref readOnly, ref m, ref m);
}
}
void DocumentConversionComplete(IAsyncResult result)
{
// navigate to our temp file.
webBrowser1.Navigate(tempFileName);
}
void webBrowser1_DocumentCompleted(object sender,
WebBrowserDocumentCompletedEventArgs e)
{
if (tempFileName != string.Empty)
{
// delete the temp file we created.
File.Delete(tempFileName);
// set the tempFileName to an empty string.
tempFileName = string.Empty;
}
}
string GetTempFile(string extension)
{
// Uses the Combine, GetTempPath, ChangeExtension,
// and GetRandomFile methods of Path to
// create a temp file of the extension we're looking for.
return Path.Combine(Path.GetTempPath(),
Path.ChangeExtension(Path.GetRandomFileName(), extension));
}
}
}
将控件添加到表单并调用LoadDocument-method。
docBrowser1.LoadDocument(@"Path_to_Doc_as_String");
答案 1 :(得分:0)
保存方法没有这样的选项可供选择布局。
您可以将webbrowser用作ActiveX文档服务器,然后访问DOM一词。设置布局类型的方法是通过Document.ActiveWindow.View.Type:
private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
var webbrowser = webBrowser1.ActiveXInstance as SHDocVw.IWebBrowser2;
var document =webbrowser.Document;
if (document != null)
{
var wordDocument = document as Microsoft.Office.Interop.Word.Document ;
if (wordDocument != null)
{
var activeWindow=wordDocument.ActiveWindow;
if (activeWindow != null)
{
var view=activeWindow.View;
if (view != null)
{
view.Type = WdViewType.wdPrintView;
Marshal.ReleaseComObject(view);
}
Marshal.ReleaseComObject(activeWindow);
}
Marshal.ReleaseComObject(wordDocument);
}
Marshal.ReleaseComObject(document);
}
Marshal.ReleaseComObject(webbrowser);
}
}
根据用户对不安全对象的Internet安全设置,您可能会在打开文档之前看到提示,或者只是从IWebBrowser2.Document获取null(因此无法自动化DOM这个词)。