3

私は数日間、Word docxファイルをWindowsフォームC#に存在するWebブラウザーコントロールにロードしようとしています。これを成し遂げるのに何日も苦労しましたが、Google といくつかの役立つ投稿の助けを借りて、私は何とかやり遂げました。私はそれをやった:

  1. docx ファイルを一時的な html ファイルに変換します。
  2. Web ブラウザー コントロールをその一時的な HTML ドキュメントに移動しました。

1 つの問題に気付きました: Web ブラウザー コントロールは Web レイアウトでファイルを表示しているようです。それが Ms-Word Web レイアウトです。Ms-Word には、読み取りモード、印刷レイアウト、および Web レイアウトの 3 つの主要な表示レイアウトがあります。これに関する問題は、実際の Web ブラウザ アプリケーションに表示されるかのようにファイルが引き伸ばされるため、一部の非常にフォーマットされた docx ファイルがその Web ブラウザ コントロールですべて歪んでしまうことです。

今私が達成したいのは、その webbrowser コントロールのコンテンツを Ms-Word の印刷レイアウトに似たもので表示できるようにすること、または少なくともコントロールがコントロール自体のサイズ内でコンテンツを再調整できるようにすることです。

(私のコードが必要な場合は、提供できます)

4

2 に答える 2

1

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 メソッドを呼び出します。

docBrowser1.LoadDocument(@"Path_to_Doc_as_String");
于 2013-08-14T21:45:22.130 に答える