office 文件在網頁中顯示


1.如何在網頁上顯示word和excel

  a.可以使用office組件或aspose將word 和excel 轉換為pdf 然后在網頁上打開pdf,但是效果不是很好

    .比如說excel 多個工作薄不是按exce 格式顯示出來,寬度大小,不好控制(?).

  b.可以使用office組件或aspose將文檔轉換為html,但是轉換為html 會產生額外的XML和CSS和圖片文件.(當文件保存到服務器其他盤符中,

    文件流讀取html,只好訪問html頁面,其他html附帶的 css和圖片和xml,無權限訪問,文件流也不好同時讀取他們幾個(?).

  c.可以使用其他轉換,比如http://www.cutepdf.com/(?),或者用文件流讀取再轉換(沒試過)

  d.最好將文件轉換為Mhtml格式的,這是因為Mhtml是個單個網頁文件.(主要是便於文件流讀取放在本地的文件)

     Mhtml稱為聚合html文檔web文檔或單一文件網頁應用於(asscss,word,excel)是單個網頁 文件可將網站所有元素(包括聲音,圖片)保存到單個mhtml文件中.

2.對於項目而言如何上傳文件,文件上傳到哪兒,如何保存這些上傳文件

  a.可以將文件上傳到asp.net項目當中,但是據說項目越來越大影響后期運行效率,不利於維護,沒有驗證過.

  b.可以將文件用數據流讀取保存到數據庫當中,沒有實踐過(?).

  b.可以將文件上傳到服務器本地磁盤當中,便於對文件的操作和管理.

      A.如果上傳到服務器讀取轉換的網頁文件

  B.上傳到數據庫轉換成網頁文件(沒試過)(?)

  C.上傳到服務器項目外的其他文件中,好像微軟在asp.net上面出於安全考慮並不支持直接訪問站點外的文件(?),其他類型開發不清楚支不支持,

   所以才必須將office裝換位單個網頁文件Mhtml,用文件流的方式讀取顯示在網頁上,

    1)可以使用添加虛擬目錄,就是在服務器上添加虛擬目錄路徑,映射到絕對路徑目錄上就是指向你要訪問的圖片路徑,在Vs開發中新建上傳文件夾,

      只是在發布文件后的ISS上, 做改動,將原有文件夾變為虛擬路徑文件,不過還是按照Server.MapPath(@"~/new_ams/file/" + fileName)獲取路徑,

      (?)具體還沒實踐過.

    2)可以將用文件流讀取本地文,參考代碼http://www.cnblogs.com/insus/archive/2013/02/05/2892678.html,

     但是有一點文件流好像只可以讀取單個文件(?),不可以讀取同時讀取html +外部CSS+圖片,所以運用前面的方法將文件轉換為Mhtml格式的,

              當Office轉化為來的Mhtml用文件流讀取時web頁面顯示的是Hmtl的亂碼內容,原因是解碼問題,具體參考 

          參考鏈接 http://www.cnblogs.com/SanMaoSpace/archive/2013/03/02/2941078.htm

            

3.利用office 自帶的組件將office轉換為Html

        用Office組件將Office轉換為Html,參考鏈接  http://zhidao.baidu.com/link?url=AvlZUEusXh7C

  a.引用office組件,如果office 沒有激活,最好激活和添加開發模式的(?),在vs添加引用里面程序集,如果引用失敗,右擊程序集屬性

    ,嵌入互操類改為False,為什么改為false(?). using Word = Microsoft.Office.Interop.Word; using Excel = Microsoft.Office.Interop.Excel;

  b.如何將office 轉變為單一網頁文件Mhtml,當時這個問題搞了一天結果是應該選擇wdFormatWebArchive ,

    Web 檔案格式,他是不帶Mhtml的單次,說明中也沒提示。

  c.但是,由於某些原因(權限,配置)在服務器上不可運行,具體解決方法,有待探究.

       文件出自:http://www.cnblogs.com/mark01/p/4244197.html

 

 

       /// <summary>   
    /// WinWord文件生成HTML並保存   
    /// </summary>   
    /// <param name="FilePath">需要生成的word文件的路徑</param>   
    /// <param name="saveFilePath">生成以后保存HTML文件的路徑</param>   
    /// <returns>是否生成成功,成功為true,反之為false</returns>   
        private bool GenerationWordHTML(string FilePath, string saveFilePath)
        {
            try
            {
                FilePath = @"D:\a\請假審批表.doc";
                saveFilePath = @"D:\a\請假審批表.html";
                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[] { FilePath, true, true });

                /// 轉換格式,另存為 HTML    
                Type docType = doc.GetType();

                /*下面是Microsoft Word 9 Object Library的寫法: */
                /*docType.InvokeMember("SaveAs", System.Reflection.BindingFlags.InvokeMethod, null, doc, new object[] { saveFilePath, Word.WdSaveFormat.wdFormatHTML });*/

                /*下面是Microsoft Word 10 Object Library的寫法: */
                docType.InvokeMember("SaveAs", System.Reflection.BindingFlags.InvokeMethod,
                null, doc, new object[] { saveFilePath, Word.WdSaveFormat.wdFormatFilteredHTML });

                /// 退出 Word   
                wordType.InvokeMember("Quit", System.Reflection.BindingFlags.InvokeMethod, null, word, null);
                return true;
            }
            catch
            {
                return false;
            }
            finally
            {
                //最后關閉打開的winword 進程   
                Process[] myProcesses = Process.GetProcessesByName("WINWORD");
                foreach (Process myProcess in myProcesses)
                {
                    myProcess.Kill();
                }
            }

        }

        /// <summary>   
        /// Ecxel文件生成HTML並保存   
        /// </summary>   
        /// <param name="FilePath">需要生成的ecxel文件的路徑</param>   
        /// <param name="saveFilePath">生成以后保存HTML文件的路徑</param>   
        /// <returns>是否生成成功,成功為true,反之為false</returns>   
        protected bool GenerationExcelHTML(string FilePath, string saveFilePath)
        {
            try
            {
                FilePath = @"D:\a\申購單.xlsx";
                saveFilePath = @"D:\a\申購單.html";
                Excel.Application app = new Excel.Application();
                app.Visible = false;
                Object o = Missing.Value;

                ///打開文件   
                /*下面是Microsoft Excel 9 Object Library的寫法: */
                /*_Workbook xls = app.Workbooks.Open(FilePath, o, o, o, o, o, o, o, o, o, o, o, o);*/

                /*下面是Microsoft Excel 10 Object Library的寫法: */
               Excel._Workbook xls = app.Workbooks.Open(FilePath, o, o, o, o, o, o, o, o, o, o, o, o, o, o);

                ///轉換格式,另存為 HTML   
                /*下面是Microsoft Excel 9 Object Library的寫法: */
                /*xls.SaveAs(saveFilePath, Excel.XlFileFormat.xlHtml, o, o, o, o, XlSaveAsAccessMode.xlExclusive, o, o, o, o);*/

                /*下面是Microsoft Excel 10 Object Library的寫法: */
               xls.SaveAs(saveFilePath, Excel.XlFileFormat.xlHtml, o, o, o, o, Excel.XlSaveAsAccessMode.xlExclusive, o, o, o, o, o);

                ///退出 Excel   
                app.Quit();
                return true;
            }
            catch
            {
                return false;
            }
            finally
            {
                //最后關閉打開的excel 進程   
                Process[] myProcesses = Process.GetProcessesByName("EXCEL");
                foreach (Process myProcess in myProcesses)
                {
                    myProcess.Kill();
                }
            }
        }
officeCom,用office組件將Office轉換為Html
   string parameter = context.Request.QueryString["file"];
            context.Response.ContentType = "message/rfc822";
            FileStream fs = new FileStream(parameter, FileMode.Open,   FileAccess.Read);
            BinaryReader br = new BinaryReader(fs);
            Byte[] bytes = br.ReadBytes((Int32)fs.Length);
            br.Close();
            fs.Close();
            context.Response.OutputStream.Write(bytes,                                               0,bytes.Length);
         
文件流讀取本地文件
            FileStream fileStream = new FileStream(fileResPath, FileMode.Open);
            long fileSize = fileStream.Length;
            byte[] fileBuffer = new byte[fileSize];
            fileStream.Read(fileBuffer, 0, (int)fileSize);
            //如果不寫fileStream.Close()語句,用戶在下載過程中選擇取消,將不能再次下載
            fileStream.Close();
            Context.Response.ContentType = "application/octet-stream";
            Context.Response.AppendHeader("Content-Disposition", "attachment;filename=" + HttpUtility.UrlEncode(fileName.Substring(19), Encoding.UTF8));
            Context.Response.AddHeader("Content-Length", fileSize.ToString());
            Context.Response.BinaryWrite(fileBuffer);
            Context.Response.End();
            Context.Response.Close();
文件流下載本地文件

總結:我認為最好的辦法, 上傳為offfice文件時,就將office轉換為Mhtml (可以通過Office組件,或者aspose),將他們同時保存到服務器本地的其他文件中

,然后再用文件流讀取office 和Mhtml ,剛開始就生成mhtml 方便后者的每次預覽都要生成,速度較慢,保存到服務器本地完全是減少項目壓力.便於數據管理操作.

 

$經過幾個星期的磨蹭,感覺用com 組件做,在服務器上對訪問權限做配置,因為不太了解,所以還是放棄,但是可以實現當然在本地可以運行(?)

,具體解決方法在我的后面一節有所說明,用aspose 沒有破解版的,最新版本的aspose.cell  可以將excel 轉換為Mhtml

 aspose :https://code.msdn.microsoft.com/Applying-Conditional-af9e0e4f/view/Discussions#content

  

 


免責聲明!

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



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