最近在做了一个项目,要求是对Office文档在线预览。下面给大家分享一下我的方法。
1.第一种方法(不建议使用)
我是在网上搜了一个利用COM组件对office文档进行转换,但是此方法必须要装Office办公软件,而且容易与电脑上的WPS冲突,还有一系列的版本问题。我电脑上装的是Office2010,没有装WPS,所以直接可以使用。具体方法如下:
Microsoft Office 14.0 Object Library
Microsoft Word 14.0 Object Library
Microsoft Excel 14.0 Object Library
Microsoft PowerPoint 14.0 Object Library
然后添加一个Office2HtmlHelper类,用于转换文件操作
using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Web; using Microsoft.Office.Core; using Word = Microsoft.Office.Interop.Word; namespace OfficeToHtml.Utils { 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(); } /// <summary> /// ppt转成Html /// </summary> /// <param name="path">要转换的文档的路径</param> /// <param name="savePath">转换成html的保存路径</param> /// <param name="wordFileName">转换成html的文件名字</param> public static void PPT2Html(string path, string savePath, string wordFileName) { Microsoft.Office.Interop.PowerPoint.Application ppApp = new Microsoft.Office.Interop.PowerPoint.Application(); string strSourceFile = path; string strDestinationFile = savePath + wordFileName + ".html"; Microsoft.Office.Interop.PowerPoint.Presentation prsPres = ppApp.Presentations.Open(strSourceFile, Microsoft.Office.Core.MsoTriState.msoTrue, Microsoft.Office.Core.MsoTriState.msoFalse, Microsoft.Office.Core.MsoTriState.msoFalse); prsPres.SaveAs(strDestinationFile, Microsoft.Office.Interop.PowerPoint.PpSaveAsFileType.ppSaveAsHTML, MsoTriState.msoTrue); prsPres.Close(); ppApp.Quit(); } } }
这样在上传文件的时候就可以使用Office2HtmlHelper类进行转换操作了,(控制器代码)
//创建文件夹 string rootFolder = System.Configuration.ConfigurationManager.AppSettings["UploadFileRootPath"]; string fileType = file.FileName.Split('.').Last(); string folderPath = rootFolder + "\\" + UPLOADS + "\\" + DateTime.Now.ToString("yyyy-MM-dd") + "\\"; //文件查看目录 string viewFolderPath = rootFolder + "\\" + HTMLUPLOADS + "\\" + DateTime.Now.ToString("yyyy-MM-dd") + "\\"; if (!Directory.Exists(folderPath)) { Directory.CreateDirectory(folderPath); } if (!Directory.Exists(viewFolderPath)) { Directory.CreateDirectory(viewFolderPath); } string fileName = Guid.NewGuid().ToString(); filePath = folderPath + fileName + "." + fileType; file.SaveAs(filePath); switch (fileType) { case "docx": case "doc": Office2HtmlHelper.Word2Html(filePath, viewFolderPath, fileName); viewPath = viewFolderPath + fileName + "." + "html"; break; case "xlsx": case "xls": Office2HtmlHelper.Excel2Html(filePath, viewFolderPath, fileName); viewPath = viewFolderPath + fileName + "." + "html"; break; case "ppt": case "pptx": Office2HtmlHelper.PPT2Html(filePath, viewFolderPath, fileName); viewPath = viewFolderPath + fileName + "." + "html"; break; default: break; }
但是这样的话就必须要装Office软件才可以调用COM组件了。所以为了避免这种不友好的事情发生,最终选择了使用Aspose动态链接库
使用方法不变,只不过是转换方式变了,相比使用COM组件来说更加简便了一些:
using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Web; //using Microsoft.Office.Core; //using Word = Microsoft.Office.Interop.Word; using Aspose.Cells; using Aspose.Slides.Pptx; namespace CqscSecurityApplication.Utils { 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); Aspose.Words.Document doc = new Aspose.Words.Document(path);//通过path(文件原始源路径)获取文档内容 wordFileName = wordFileName + ".html"; string savePathss = Path.Combine(savePath, wordFileName);//合并转换后html文件路径 doc.Save(savePathss,Aspose.Words.SaveFormat.Html);//转换为html格式 } /// <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(); Workbook workbook=new Workbook(path); wordFileName = wordFileName + ".html"; string savePathss = Path.Combine(savePath, wordFileName); workbook.Save(savePathss, SaveFormat.Html); } /// <summary> /// ppt转成Html /// </summary> /// <param name="path">要转换的文档的路径</param> /// <param name="savePath">转换成html的保存路径</param> /// <param name="wordFileName">转换成html的文件名字</param> public static void PPT2Html(string path, string savePath, string wordFileName) { //Microsoft.Office.Interop.PowerPoint.Application ppApp = new Microsoft.Office.Interop.PowerPoint.Application(); //string strSourceFile = path; //string strDestinationFile = savePath + wordFileName + ".html"; //Microsoft.Office.Interop.PowerPoint.Presentation prsPres = ppApp.Presentations.Open(strSourceFile, Microsoft.Office.Core.MsoTriState.msoTrue, Microsoft.Office.Core.MsoTriState.msoFalse, Microsoft.Office.Core.MsoTriState.msoFalse); //prsPres.SaveAs(strDestinationFile, Microsoft.Office.Interop.PowerPoint.PpSaveAsFileType.ppSaveAsHTML, MsoTriState.msoTrue); //prsPres.Close(); //ppApp.Quit(); PresentationEx pres=new PresentationEx(path); wordFileName = wordFileName + ".html"; string savePathss = Path.Combine(savePath, wordFileName); pres.Save(savePathss, Aspose.Slides.Export.SaveFormat.Html); } } }
总之使用很简单,有遇到同样问题的同学,欢迎交流;