Word/Excel 在線預覽


前言

近日項目中做到一個功能,需要上傳附件后能夠在線預覽。之前也沒做過這類似的,於是乎就查找了相關資料,.net實現Office文件預覽大概有這幾種方式:

 ① 使用Microsoft的Office組件將文件直接轉換為html文件(優點:代碼實現最簡單,工作強度最小。缺點:效果極差)

 ②使用Microsoft的Office組件將文件轉換為PDF格式文件,然后再使用pdf2swf轉換為swf文件,也就是flash文件在使用FlexPaper展示出來(優點:預覽效果能接受,缺點:代碼量大)

 ③使用Office online(優點:表現完美,缺點:不適合中小企業應用)

 

由於開發時間短而且還有其他功能點需要完成,所以暫時先已第一種方式實現了,這里也主要講第一種方式,效果如下圖:

 

具體實現

這里簡單提一下效果圖中的遮罩效果和上傳實現,有喜歡的朋友也可以參考參考。

遮罩效果就是HTML+CSS+JS來實現的,全部代碼如下:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>彈出層</title>
<script src="jquery-1.6.2.min.js" type="text/javascript"></script>
<style>
.black_overlay{
 display: none;
 position: absolute;
 top: 0%;
 left: 0%;
 width: 100%;
 height: 100%;
 background-color: black;
 z-index:1001;
 -moz-opacity: 0.8;
 opacity:.80;
 filter: alpha(opacity=80);
}
.white_content {
 display: none;
 position: absolute;
 top: 10%;
 left: 10%;
 width: 80%;
 height: 80%;
 border: 16px solid lightblue;
 background-color: white;
 z-index:1002;
 overflow: auto;
}
.white_content_small {
 display: none;
 position: absolute;
 top: 20%;
 left: 30%;
 width: 40%;
 height: 50%;
 border: 16px solid lightblue;
 background-color: white;
 z-index:1002;
 overflow: auto;
}
</style>
<script type="text/javascript">
//彈出隱藏層
function ShowDiv(show_div,bg_div){
 document.getElementById(show_div).style.display='block';
 document.getElementById(bg_div).style.display='block' ;
 var bgdiv = document.getElementById(bg_div);
 bgdiv.style.width = document.body.scrollWidth; 
 // bgdiv.style.height = $(document).height();
 $("#"+bg_div).height($(document).height());
};
//關閉彈出層
function CloseDiv(show_div,bg_div)
{
 document.getElementById(show_div).style.display='none';
 document.getElementById(bg_div).style.display='none';
};
</script>
</head>
<body>
<input id="Button1" type="button" value="點擊彈出層" onclick="ShowDiv('MyDiv','fade')" />
<!--彈出層時背景層DIV-->
<div id="fade" class="black_overlay">
</div>
 <div id="MyDiv" class="white_content">
  <div style="text-align: right; cursor: default; height: 40px;">
   <span style="font-size: 16px;" onclick="CloseDiv('MyDiv','fade')">關閉</span>
  </div>
  目前來說,我還是喜歡這個自己改造的彈出層。自己在項目中也用的是這個。
 </div>
</body>
</html>
View Code

上傳的話,因為文件比較小,所以采用的是保存在服務器,在數據庫中存放路徑的方式

前台代碼

 <div class="white_content" id="MyDiv" style="text-align: center; display: none;">
            <div style="text-align: right; cursor: default; height: 40px;">
                <span style="font-size: 16px;" onclick="CloseDiv('MyDiv','fade')">關閉</span>
            </div>
            <tr style="width: 50%" id="upload_Image">
                <h1>
                    請上傳常見問題附件</h1>
                <td align="right" class="Title">
                    上傳附件
                </td>
                <td>
                    <asp:FileUpload ID="FileUpload1" runat="server" />
                    <asp:Label ID="label1" runat="server" ForeColor="Red"></asp:Label>
                    <asp:Button ID="UploadButton" runat="server" Text="上傳附件" OnClick="UploadButton_Click" />
                </td>
            </tr>
            <tr>
                <td colspan="2" align="center" id="show_image" style="visibility: hidden">
                    <asp:Image ID="Image1" runat="server" Height="118px" Width="131px" />
                </td>
            </tr>
        </div>

后台方法

      try
            {
                string FullName = FileUpload1.PostedFile.FileName;//獲取附件物理地址
                FileInfo fi = new FileInfo(FullName);
                string name = fi.Name;//獲取附件名稱
                string type = fi.Extension;//獲取附件類型
                if (type == ".xls" || type == ".xlsx" || type == ".doc" || type == ".docx" || type == ".pdf")
                {
                    string SavePath = Server.MapPath("~\\uploadFile");//附件保存到文件夾下
                    if (!Directory.Exists(SavePath))
                    {
                        Directory.CreateDirectory(SavePath);
                    }
                    this.FileUpload1.PostedFile.SaveAs(SavePath + "\\" + name);//保存路徑
                    #region 將附件內容保存到數據庫中
                    int showsuccess = CMSModelManager.Submitted_questionsDAO.Save_File(name,type,SavePath);
                    if (showsuccess == 1)
                    {
                        this.label1.Text = "上傳成功";
                    }
                    else
                    {
                        this.label1.Text = "服務器繁忙,請稍后重試";
                    }
                    #endregion 
                }
                else
                {
                    this.label1.Text = "請選擇正確的格式附件";
                }
            }
            catch (Exception ex)
            {
                Response.Write(ex.Message);
            }

圖中所示的將Word轉換成HTML的實現方式:

首先新建一個幫助類

using System;
using System.Collections.Generic;
using System.Web;
//using Microsoft.Office.Core;
using Word = Microsoft.Office.Interop.Word;

namespace Com.VanruPortal.Admin
{
    public class Office2HtmlHelper
    {
        /// <summary>
        /// Word轉成Html
        /// </summary>
        /// <param name="path">要轉換的文檔的路徑</param>
        /// <param name="savePath">轉換成html的保存路徑</param>
        /// <param name="wordFileName">轉換成html的文件名字</param>
        public static void Word2Html(string path, string savePath, string wordFileName)
        {

            Word.ApplicationClass word = new Word.ApplicationClass();
            Type wordType = word.GetType();
            Word.Documents docs = word.Documents;
            Type docsType = docs.GetType();
            Word.Document doc = (Word.Document)docsType.InvokeMember("Open", System.Reflection.BindingFlags.InvokeMethod, null, docs, new Object[] { (object)path, true, true });
            Type docType = doc.GetType();
            string strSaveFileName = savePath + wordFileName + ".html";
            object saveFileName = (object)strSaveFileName;
            docType.InvokeMember("SaveAs", System.Reflection.BindingFlags.InvokeMethod, null, doc, new object[] { saveFileName, Word.WdSaveFormat.wdFormatFilteredHTML });
            docType.InvokeMember("Close", System.Reflection.BindingFlags.InvokeMethod, null, doc, null);
            wordType.InvokeMember("Quit", System.Reflection.BindingFlags.InvokeMethod, null, word, null);
        }
        /// <summary>
        /// Excel轉成Html
        /// </summary>
        /// <param name="path">要轉換的文檔的路徑</param>
        /// <param name="savePath">轉換成html的保存路徑</param>
        /// <param name="wordFileName">轉換成html的文件名字</param>
        public static void Excel2Html(string path, string savePath, string wordFileName)
        {
            string str = string.Empty;
            Microsoft.Office.Interop.Excel.Application repExcel = new Microsoft.Office.Interop.Excel.Application();
            Microsoft.Office.Interop.Excel.Workbook workbook = null;
            Microsoft.Office.Interop.Excel.Worksheet worksheet = null;
            workbook = repExcel.Application.Workbooks.Open(path, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing);
            worksheet = (Microsoft.Office.Interop.Excel.Worksheet)workbook.Worksheets[1];
            object htmlFile = savePath + wordFileName + ".html";
            object ofmt = Microsoft.Office.Interop.Excel.XlFileFormat.xlHtml;
            workbook.SaveAs(htmlFile, ofmt, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Microsoft.Office.Interop.Excel.XlSaveAsAccessMode.xlNoChange, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing);
            object osave = false;
            workbook.Close(osave, Type.Missing, Type.Missing);
            repExcel.Quit();
        }

    }
}
View Code

后台調用方法

            #region 上傳成功后將文件轉換
                        string physicalPath = Server.MapPath(Server.UrlDecode("/uploadFile"+"\\"+ name));//讀取相對路徑 string extension = Path.GetExtension(physicalPath);//獲取后綴名 string[] show_name = name.Split(new string[] { "." }, StringSplitOptions.RemoveEmptyEntries);//此處的name是上面上傳附件中的名稱分割 string show_name_View = show_name[0];//拿到實際name switch (extension)
                        {

                            case ".doc":
                            case ".docx":
                                Office2HtmlHelper.Word2Html(MapPath("/uploadFile" + "\\" + name + ""),
                                    MapPath("/Html/"), "" + show_name_View + "");//調用幫助類中生成WordHtml的方法,並保存起來
                                Response.Write("<script>window.open('/Html/" + show_name_View + ".html','_blank')</script>");//跳轉並打開保存的相對路徑中hmtl文件 break;
                            case ".xls":
                            case ".xlsx":
                                Office2HtmlHelper.Excel2Html(MapPath("/uploadFile" + "\\" + name + ""),
                                    MapPath("/Html/"), "" + show_name_View + "");
                                Response.Write("<script>window.open('/Html/" + show_name_View + ".html','_blank')</script>");
                                break;
                            default:
                                break;
                        }
                        #endregion

至此,一個簡易的上傳附件在線瀏覽已經全部實現

 

如果小伙伴有更好得實現方式或者其他建議,歡迎留言告知~

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM