·您现在的位置: 云翼网络 >> 文章中心 >> 网站建设 >> 网站建设开发 >> ASP.NET网站开发 >> office文件在网页中显示

office文件在网页中显示

作者:佚名      ASP.NET网站开发编辑:admin      更新时间:2022-07-23

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