65.9K
CodeProject 正在变化。 阅读更多。
Home

在 IFrame 中使用 TreeView 控件查看 Word 和 Excel 文档

starIconstarIconstarIconstarIconstarIcon

5.00/5 (5投票s)

2012年1月29日

CPOL

6分钟阅读

viewsIcon

50544

downloadIcon

2109

使用 TreeView 查看 Office 文档。

引言

当我在为一个客户的特定项目指导我的团队时,我预见到我项目的一部分将导向文档管理系统。客户希望能够查看文档,包括 PDF/Word/TXT/扫描图像等多种格式。但无论如何,他们都面临着打开单独应用程序的问题,以及许可成本。此外,打开和维护也很麻烦。他们要求一个解决方案,这促使我创建了树形视图方法和文档视图。当我开始这个项目时,我一直在谷歌上搜索想法,但大多数时候,人们将我引向了不同的方向。但我的问题仍然没有解决。即使在许多论坛上,人们也在为同一个问题哭诉求解决方案。

一旦我创建了这个,我想和大家分享,我希望它能极大地帮助到你们。

在这篇文章中,我们将实现两件事情:

  1. TreeView 中显示特定文件夹中的文件
  2. 使用 iframe 在同一个 aspx 页面的右侧窗格中显示文件内容

我们将使用的组件是 Word 和 Excel 的 Interops。

首先,从 Visual Studio 创建一个新的 Web 应用程序解决方案。

image001.jpg

右键单击解决方案并添加新项目,选择项目类型为类库。

image002.jpg image003.jpg

将类库项目命名为“LibraryConvertor”。现在将 Class1.cs 重命名为“WordXLS”。在类库的添加引用中,添加以下 Interops:Interop.Word.dllInterop.Excel.dll

image004.jpg

让我们在这个类库 WordXLS.cs 中创建数据成员,如下所示:

#region Data Members
public string Message = string.Empty;          // To store the Error or Message
private Word.ApplicationClass OfficeWord;       // The Interop Object for Word
private Excel.ApplicationClass OfficeExcel;     // The Interop Object for Excel
object Unknown = Type.Missing;                  // For passing Empty values
public enum StatusType { SUCCESS, FAILED };     // To Specify Success or Failure Types
public StatusType Status;                       // To know the Current Status
#endregion

在默认构造函数中,我们将按如下方式初始化 StatusMessage

public WordExcelToHTML()
{
Status = StatusType.FAILED;
      Message = string.Empty;
}

我们将创建一个将 Word 文档转换为 HTML 的方法,其签名如下:

public void WordToHTML(object Source, object Target)

这里 SourceTarget 是文件名。由于 Word 的 Active Document 总是接受对象,所以我们也在这里接受对象。当我们打开文档时,应用程序窗口不应该显式打开。为了抑制,以下代码很有帮助:

// To suppress window display the following code will help
OfficeWord.Visible = false;
OfficeWord.Application.Visible = false;                         
OfficeWord.WindowState = Word.WdWindowState.wdWindowStateMinimize;

要打开特定文档,请使用 ApplicationClass 对象的 Open 方法,如下所示:

OfficeWord.Documents.Open(ref Source, ref Unknown,
                     ref Unknown, ref Unknown, ref Unknown,
                     ref Unknown, ref Unknown, ref Unknown,
                     ref Unknown, ref Unknown, ref Unknown,
                     ref Unknown, ref Unknown, ref Unknown, ref Unknown); 

请注意,这里我们只传递 Source,其余参数为空。以下是 Open 方法的参数及其用途:

序号 参数类型
1 FileName
2 ConfirmConversions
3 ReadOnly
4 AddToRecentFiles
5 PasswordDocument
6 PasswordTemplate
7 Revert
8 WritePasswordDocument
9 WritePasswordTemplate
10 格式
11 编码
12 Visible
13 OpenAndRepair
14 DocumentDirection
15 NoEncodingDialog
object format = Word.WdSaveFormat.wdFormatHTML;

这里我们指定转换为 HTML 格式。可以转换的格式列表如下:

序号 参数类型
1 wdFormatDocument
2 wdFormatDOSText
3 wdFormatDOSTextLineBreaks
4 wdFormatEncodedText
5 wdFormatFilteredHTML
6 wdFormatHTML
7 wdFormatRTF
8 wdFormatTemplate
9 wdFormatText
10 wdFormatTextLineBreaks
11 wdFormatUnicodeText
12 wdFormatWebArchive

您可以分别查阅以上两个表。这里我们总是尝试转换为 HTML。

OpenFormatHTML 应该包含在 try...catch 块中。因此,可以分别捕获任何异常。

现在是时候使用 Target 文件名将文件另存为 HTML 了,如下所示:

OfficeWord.ActiveDocument.SaveAs(ref Target, ref format,
                        ref Unknown, ref Unknown, ref Unknown,
                        ref Unknown, ref Unknown, ref Unknown,
                        ref Unknown, ref Unknown, ref Unknown,
                        ref Unknown, ref Unknown, ref Unknown,
                        ref Unknown, ref Unknown);

Status = StatusType.SUCCESS;
Message = Status.ToString();

以下是供您进一步探索的各种参数:

序号 参数类型
1 FileName
2 FileFormat
3 LockComments
4 密码
5 AddToRecentFiles
6 WritePassword
7 ReadOnlyRecommended
8 EmbedTrueTypeFonts
9 SaveNativePictureFormat
10 SaveFormsData
11 SaveAsAOCELetter
12 编码
13 InsertLineBreaks
14 AllowSubstitutions
15 LineEnding

finally 块中,让我们释放我们实例化的对象。

finally
{
if (OfficeWord != null)
{    
OfficeWord.Documents.Close(ref Unknown, ref Unknown, ref Unknown);
OfficeWord.Quit(ref Unknown, ref Unknown, ref Unknown);
}
}

对于 Excel 操作,需要创建以下方法:

public void ExcelToHTML(string Source, string Target)

在此,我们将 SourceTarget 作为 string 类型,因为 Excel 类仅接受 String 类型。

同样,对于 OpenSaveAs,让我们按照 Word 中的方式进行,但请注意,参数有所不同。我将其留给您进一步探索。当您对不同格式进行此操作时,您会获得更多乐趣。

请参阅附件示例中的代码。

现在类库已完成。我们需要创建一个 Web 窗体来使用这个库。

将我们的“LibraryConvertor”程序集添加到我们 Web 应用程序的引用中。

首先删除您的 Default.aspx 并创建一个新窗体,将其命名为“LandingPage.aspx”。

标记应如下所示:

image005.gif

在我们的 aspx 文件中,我们需要执行以下操作:

添加 scriptManager

<asp:ScriptManager ID="ScriptManager1" runat="server"></asp:ScriptManager>

添加一个包含两列的表,左列用于 TreeView,右列用于 iframe

代码应如下所示:

image006.jpg

DesignMode 中,选择 TreeView 和两个 Events 属性,双击选中的节点更改事件“DocView_TreeView_SelectedNodeChanged”并移至代码隐藏文件。

在我们的代码隐藏文件中,包含类库的命名空间,如下所示:

using LibraryConvertor; 

并实例化 WordXLS 类。

web.configappsettings 中添加以下两个键:

<add key="ConvertLocation" value="D:\ TreeView_DocView\target\"/>
<add key="ErrorFile" value="D:\ TreeView_DocView\target\ErrorPage.jpg"/>

相应地,在我们的应用程序文件夹中创建一个名为 target 的文件夹。同时在此目录中添加一个 Error Jpeg。

包含此命名空间

using System.IO;

创建一个方法,用于从特定文件夹检索要提供给树形视图的文件,如下所示:

TreeNode OutputDirectory(System.IO.DirectoryInfo directory, TreeNode parentNode)
{
if (directory == null) return null;
      TreeNode DirNode = new TreeNode(directory.Name);
      System.IO.FileInfo[] Files = directory.GetFiles();
      for (int FileCount = 0; FileCount < Files.Length; FileCount++)
          DirNode.ChildNodes.Add(new TreeNode(Files[FileCount].Name));

if (parentNode == null)
          return DirNode;
else
      {
          parentNode.ChildNodes.Add(DirNode);
            return parentNode;
}
}

还创建另一个方法,该方法实际上执行 Tree Clear 功能并调用 OutputDirectory 方法。

private void BindTree()
{
DocViewTreeView.Nodes.Clear();
DirectoryInfo RootDir = new DirectoryInfo(Server.MapPath("~/target"));
TreeNode RootNode = OutputDirectory(RootDir, null);
DocViewTreeView.Nodes.Add(RootNode);
DocViewTreeView.ExpandAll();
}

从 Page Load 事件开始,如下所示:

if (!IsPostBack)
{
lblText.Text = "FileName :Error.jpg";
BindTree();
}
image007.gif

为了显示 ErrorPage.jpg,我们需要在“DocView_TreeView_SelectedNodeChanged”事件中编写以下代码:

WordXLS conv = new WordXLS();            
lblText.Text = "FileName :" + DocViewTreeView.SelectedNode.Text;
string strFilePath = ConfigurationManager.AppSettings
    ["ConvertLocation"].ToString().Trim();
string strFile = DocViewTreeView.SelectedNode.Text.ToString();
string strExtension = DocViewTreeView.SelectedNode.Text.ToString().Split
        ('.')[1].ToString().Trim().ToUpper();
string strUrl = "http://" + Request.Url.Authority + "/target/";

if (strExtension == "DOCX" || strExtension == "DOC")
{
conv.WordToHTML(strFilePath + strFile, strFilePath + strFile.Split('.')[0] + ".html");
      if (conv.Status == WordXLS.StatusType.SUCCESS)
          docPreview.Attributes["src"] = strUrl + strFile.Split('.')[0] + ".html";
}
else if (strExtension == "XLS" || strExtension == "XLSX")
{
conv.ExcelToHTML(strFilePath + strFile, strFilePath + strFile.Split('.')[0] + ".html");
      if (conv.Status == WordXLS.StatusType.SUCCESS)
          docPreview.Attributes["src"] = strUrl + strFile.Split('.')[0] + ".html";
}
else
docPreview.Attributes["src"] = strUrl + DocViewTreeView.SelectedNode.Text;

DocViewTreeView.SelectedNode.Text;”将提供选定的文件名,并且必须首先检查文件的扩展名。根据扩展名,我们可以调用相应的“WordToHTML”或“ExcelToHTML”并获取输出文件,然后将其关联到 docPreview 属性的“src”。

现在当我们执行时,输出应如下所示:

image008.gif

在 target 文件夹中添加一个 pdf 文件、一个 .doc 文件、.docx、.xls、.xlsx、.txt 文件,然后看看会发生什么。

例如,在 target 文件夹中找到以下 Excel 文件:

image009.jpg

现在浏览器中的输出应如下所示:

image010.jpg

请注意,客户端系统不需要安装 Microsoft Office,但他们可以以这种方式查看所有 Word 和 XLS 文档。

如果是 PDF,客户端系统必须安装 Adobe Reader。但你肯定可以为这个找到解决办法。

如果是文本文件或任何图像文件,它将在 iframe 中显示。

关注点

另外,如果是 Excel,一个惊人的功能是工作表将显示为下面的单独工具栏。通过单击特定的工作表,我们可以查看相应的工作表。

尝试在创建之前删除 HTML 文件和相应 Word/Excel 文件的 _files 文件夹。否则,我们会遇到覆盖的 yes/no 问题。

不要忘记探索所有不同的转换格式。

观察

  1. strUrl = "http://" + Request.Url.Authority + "/target/"; 
  2. strExtension == "XLS" || strExtension == "XLSX" 
  3. strFile.Split('.')[0] + ".html" 

我故意这样做的。请根据您的需要进行更改。我使用它来简化编码,以便让您理解我想传达的确切含义。

历史

我将致力于改进这个应用程序,使其成为一个单独的文档管理系统组件。

作者

image011.jpgA. Rishi Ganesh,项目经理,印度

如果您有任何意见或建议,请通过 rishwins@hotmail.com 与我联系。

© . All rights reserved.