system.runtime.interopservices.comexception (0x80004005)
文档管理系统 之一 doc、xls、ppt文档转换成html及System.Runtime.InteropServices.COMException (0x80004005): 360的问题
公司最近需要一套文档管理系统,其实功能很简单,能上传、显示文档,根据权限能否下载、复制、查看
网上也有很多,试用了一下感觉功能都太花哨,都是着重协同办公功能
因为功能不多,所以自己写一个也不费劲,思路如下:
1.先解决文档上传、转换的功能
2.权限管理功能
文档上传转换,将上传的doc、xls、ppt文档转换成html格式,显示时通过js脚本禁止复制
昨天上传转换功能写完后,在本机测试正常,今天发布到服务器后是各种问题,在服务器打开网页都不行,解决到最后可服务器服务器运行了,到客户端上“转换”又报错
具体碰到的问题会在以后的文章中慢慢贴出来,但是今天最大的收获就是“360浏览器 不支持office操作”
文件上传成功后,在转换时出现“System.Runtime.InteropServices.COMException (0x80004005): Error HRESULT E_FAIL has been returned from a call to a COM component. at Microsoft.Office.Interop.PowerPoint.PresentationClass.SaveAs(String FileName, PpSaveAsFileType FileFormat, MsoTriState EmbedTrueTypeFonts) at FileHtml.PPTToHtlm(FileUpload FileUpload1 错误,但是用ie,就可以上传并转换
这个问题很纠结,在本机编译成功运行,360浏览器可以转换,不报错,但是在本机一旦访问服务器,就报错,网上没有貌似很好的解决方案,我的解决方案就是,别用360~~~
附带doc、xls、ppt转换html代码
using System; using System.Data; using System.Configuration; using System.Web; using System.Web.Security; using System.Web.UI; using System.Web.UI.WebControls; using System.Web.UI.WebControls.WebParts; using System.Web.UI.HtmlControls; using System.IO; using Microsoft.Office.Interop.Excel; using System.Diagnostics; using Microsoft.Office.Interop.PowerPoint; using Microsoft.Office; using System.Reflection; /// <summary> /// FileHtml 的摘要说明 /// </summary> public class FileHtml { //public static string FileToHtml(string filePath) public static string FileToHtml(FileUpload FileUpload1) { string fileExtension = System.IO.Path.GetExtension(FileUpload1.FileName).ToLower(); string strss = "|doc|docx|"; string strss2 = "|xls|xlsx|"; string strss3 = "|ppt|pptx|"; if (strss.IndexOf("|" + fileExtension.Substring(1) + "|") > -1) { return wordToHtml(FileUpload1); } else if (strss2.IndexOf("|" + fileExtension.Substring(1) + "|") > -1) { return ExcelToHtml(FileUpload1); } else if (strss3.IndexOf("|" + fileExtension.Substring(1) + "|") > -1) { return PPTToHtlm(FileUpload1); } else { return ""; } } /// <summary> /// /// </summary> /// <param name="filePath">上传后文件的路径</param> /// <returns></returns> public static string wordToHtml(FileUpload FileUpload1) { try { Microsoft.Office.Interop.Word.ApplicationClass word = new Microsoft.Office.Interop.Word.ApplicationClass(); Type wordType = word.GetType(); Microsoft.Office.Interop.Word.Documents docs = word.Documents; Type docsType = docs.GetType(); FilesOperate fo = new FilesOperate(); //定义服务器doc存储地址 string wordPath = System.Web.HttpContext.Current.Server.MapPath(fo.GetOriginalFullName(System.IO.Path.GetExtension(FileUpload1.FileName).ToLower().Substring(1))); //保存至服务器 FileUpload1.SaveAs(wordPath); object fileName1 = wordPath; Microsoft.Office.Interop.Word.Document doc = (Microsoft.Office.Interop.Word.Document)docsType.InvokeMember("Open", System.Reflection.BindingFlags.InvokeMethod, null, docs, new Object[] { fileName1, true, true }); // 转换格式,另存为html Type docType = doc.GetType(); string filename = fo.GetNewFileName() + ".html"; string fpath = fo.GetConvertDirectory(); string path = (System.Web.HttpContext.Current.Server.MapPath(fpath)); Directory.CreateDirectory(path); //被转换的html文档保存的位置 object saveFileName = path + filename; docType.InvokeMember("SaveAs", System.Reflection.BindingFlags.InvokeMethod, null, doc, new object[] { saveFileName, Microsoft.Office.Interop.Word.WdSaveFormat.wdFormatFilteredHTML }); // 退出 Word wordType.InvokeMember("Quit", System.Reflection.BindingFlags.InvokeMethod, null, word, null); //返回文件名 return (fpath + filename); } catch (Exception ex) { return ex.ToString(); } } /// <summary> /// /// </summary> /// <param name="filePath">上传后文件的路径</param> /// <returns></returns> public static string PPTToHtlm(FileUpload FileUpload1) { try { FilesOperate fo = new FilesOperate(); //定义服务器doc存储地址 string wordPath = System.Web.HttpContext.Current.Server.MapPath(fo.GetOriginalFullName(System.IO.Path.GetExtension(FileUpload1.FileName).ToLower().Substring(1))); //保存至服务器 FileUpload1.SaveAs(wordPath); Microsoft.Office.Interop.PowerPoint.Application ppApp = new Microsoft.Office.Interop.PowerPoint.Application(); string filename = fo.GetNewFileName() + ".html"; string fpath = fo.GetConvertDirectory(); string path = (System.Web.HttpContext.Current.Server.MapPath(fpath)); Directory.CreateDirectory(path); string saveFileName = path + filename; Microsoft.Office.Interop.PowerPoint.Presentation prsPres = ppApp.Presentations.Open(wordPath, Microsoft.Office.Core.MsoTriState.msoTrue, Microsoft.Office.Core.MsoTriState.msoFalse, Microsoft.Office.Core.MsoTriState.msoFalse); //被转换的html文档保存的位置 prsPres.SaveAs(saveFileName, Microsoft.Office.Interop.PowerPoint.PpSaveAsFileType.ppSaveAsHTML, Microsoft.Office.Core.MsoTriState.msoTrue); prsPres.Close(); ppApp.Quit(); return (fpath + filename); } catch (Exception ex) { return ex.ToString(); } } /// <summary> /// /// </summary> /// <param name="filePath">上传后文件的路径</param> /// <returns></returns> public static string ExcelToHtml(FileUpload FileUpload1) { try { FilesOperate fo = new FilesOperate(); //定义服务器doc存储地址 string wordPath = System.Web.HttpContext.Current.Server.MapPath(fo.GetOriginalFullName(System.IO.Path.GetExtension(FileUpload1.FileName).ToLower().Substring(1))); //保存至服务器 FileUpload1.SaveAs(wordPath); string filename = fo.GetNewFileName() + ".html"; string fpath = fo.GetConvertDirectory(); string path = (System.Web.HttpContext.Current.Server.MapPath(fpath)); Directory.CreateDirectory(path); Directory.CreateDirectory(path); //被转换的html文档保存的位置 object saveFileName = path + filename.Replace(":", "-"); Microsoft.Office.Interop.Excel.Application app = new Microsoft.Office.Interop.Excel.Application(); app.Visible = false; object o = System.Reflection.Missing.Value; _Workbook xls = app.Workbooks.Open(wordPath, o, true, o, o, o, o, o, o, o, o, o, o, o, o); object fileName = saveFileName; object format = Microsoft.Office.Interop.Excel.XlFileFormat.xlHtml;//Html xls.SaveAs(fileName, format, o, o, o, o, XlSaveAsAccessMode.xlExclusive, o, o, o, o, o); app.Quit(); return fpath + filename.Replace(":", "-"); } catch (Exception ex) { return ex.ToString(); } } }
还有一个类是获取文件名及路径的,那个很简单,自己搞搞就出来