以前项目须要,查找了office文档在线预览的解决方案,顺便记录一下,方便之后查询。html
直接在浏览器中打开Office文档在页面上的连接。会弹出以下窗口:web
优势:主流浏览器都支持。设计模式
缺点:Office文档连接在浏览器中打开,会有如上图的提示,需用户本身选择打开或者保存功能,若是客户电脑上安装迅雷下载软件,会启动迅雷下载,用户体验很差。浏览器
office文档转html,首先引入com组件中office库,而后在程序集扩展中引入word,excel,ppt的dll。app
而后F6生成,会报以下错误:ide
解决办法:函数
office文档转换html辅助类:工具
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Web; 5 using Microsoft.Office.Core; 6 using Word = Microsoft.Office.Interop.Word; 7 namespace Wolfy.OfficePreview 8 { 9 public class Office2HtmlHelper 10 { 11 /// <summary> 12 /// Word转成Html 13 /// </summary> 14 /// <param name="path">要转换的文档的路径</param> 15 /// <param name="savePath">转换成html的保存路径</param> 16 /// <param name="wordFileName">转换成html的文件名字</param> 17 public static void Word2Html(string path, string savePath, string wordFileName) 18 { 19 20 Word.ApplicationClass word = new Word.ApplicationClass(); 21 Type wordType = word.GetType(); 22 Word.Documents docs = word.Documents; 23 Type docsType = docs.GetType(); 24 Word.Document doc = (Word.Document)docsType.InvokeMember("Open", System.Reflection.BindingFlags.InvokeMethod, null, docs, new Object[] { (object)path, true, true }); 25 Type docType = doc.GetType(); 26 string strSaveFileName = savePath + wordFileName + ".html"; 27 object saveFileName = (object)strSaveFileName; 28 docType.InvokeMember("SaveAs", System.Reflection.BindingFlags.InvokeMethod, null, doc, new object[] { saveFileName, Word.WdSaveFormat.wdFormatFilteredHTML }); 29 docType.InvokeMember("Close", System.Reflection.BindingFlags.InvokeMethod, null, doc, null); 30 wordType.InvokeMember("Quit", System.Reflection.BindingFlags.InvokeMethod, null, word, null); 31 32 } 33 /// <summary> 34 /// Excel转成Html 35 /// </summary> 36 /// <param name="path">要转换的文档的路径</param> 37 /// <param name="savePath">转换成html的保存路径</param> 38 /// <param name="wordFileName">转换成html的文件名字</param> 39 public static void Excel2Html(string path, string savePath, string wordFileName) 40 { 41 string str = string.Empty; 42 Microsoft.Office.Interop.Excel.Application repExcel = new Microsoft.Office.Interop.Excel.Application(); 43 Microsoft.Office.Interop.Excel.Workbook workbook = null; 44 Microsoft.Office.Interop.Excel.Worksheet worksheet = null; 45 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); 46 worksheet = (Microsoft.Office.Interop.Excel.Worksheet)workbook.Worksheets[1]; 47 object htmlFile = savePath + wordFileName + ".html"; 48 object ofmt = Microsoft.Office.Interop.Excel.XlFileFormat.xlHtml; 49 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); 50 object osave = false; 51 workbook.Close(osave, Type.Missing, Type.Missing); 52 repExcel.Quit(); 53 } 54 /// <summary> 55 /// ppt转成Html 56 /// </summary> 57 /// <param name="path">要转换的文档的路径</param> 58 /// <param name="savePath">转换成html的保存路径</param> 59 /// <param name="wordFileName">转换成html的文件名字</param> 60 public static void PPT2Html(string path, string savePath, string wordFileName) 61 { 62 Microsoft.Office.Interop.PowerPoint.Application ppApp = new Microsoft.Office.Interop.PowerPoint.Application(); 63 string strSourceFile = path; 64 string strDestinationFile = savePath + wordFileName + ".html"; 65 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); 66 67 prsPres.SaveAs(strDestinationFile, Microsoft.Office.Interop.PowerPoint.PpSaveAsFileType.ppSaveAsHTML, MsoTriState.msoTrue); 68 prsPres.Close(); 69 ppApp.Quit(); 70 } 71 } 72 }
1 <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Office2Html.aspx.cs" Inherits="Wolfy.OfficePreview.Office2Html" %> 2 3 <!DOCTYPE html> 4 5 <html xmlns="http://www.w3.org/1999/xhtml"> 6 <head runat="server"> 7 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 8 <title></title> 9 </head> 10 <body> 11 <form id="form1" runat="server"> 12 <div> 13 <asp:Button Text="Word转Html" ID="btnWord" runat="server" CommandArgument="docx" OnClick="btnWord_Click" /> 14 <asp:Button ID="btnExcel" Text="Excel转Html" runat="server" CommandArgument="xlsx" OnClick="btnWord_Click" /> 15 <asp:Button ID="btnPPT" Text="PPT转Html" runat="server" CommandArgument="ppt" OnClick="btnWord_Click" /> 16 </div> 17 </form> 18 </body> 19 </html>
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Web; 5 using System.Web.UI; 6 using System.Web.UI.WebControls; 7 8 namespace Wolfy.OfficePreview 9 { 10 public partial class Office2Html : System.Web.UI.Page 11 { 12 protected void Page_Load(object sender, EventArgs e) 13 { 14 15 } 16 protected void btnWord_Click(object sender, EventArgs e) 17 { 18 Button btn = sender as Button; 19 switch (btn.CommandArgument) 20 { 21 case "docx": 22 Office2HtmlHelper.Word2Html(MapPath("/Doc/分析某网站的SEO策略(外链篇).doc"), MapPath("/Html/"), "分析某网站的SEO策略(外链篇)"); 23 break; 24 case "xlsx": 25 Office2HtmlHelper.Excel2Html(MapPath("/Excel/1994-2013北京市历年最低工资标准.xlsx"), MapPath("/Html/"), "1994-2013北京市历年最低工资标准"); 26 break; 27 case "ppt": 28 Office2HtmlHelper.PPT2Html(MapPath("/PPT/23种设计模式详解.ppt"), MapPath("/Html/"), "23种设计模式详解"); 29 break; 30 default: 31 break; 32 } 33 } 34 } 35 }
测试结果:post
这里为了测试特找了含有图片的office文档,浏览正常:测试
要求:机器需安装office,而且office环境是纯净的,所谓纯净就是不能有多个版本,lz曾经在电脑上安装过wps,被害苦了老是报以下错误:
报这个错误,只能哭了,网上的关于00046的解决办法都尝试了,不行。而后不得不从新安装office,而后笑了。最好安装office完整版,由于原来装的不是完整版,不知道有没有这方面的缘由,也没有测试,建议完整版。
office文档转PDF,PDF转swf,使用flexpaper+swftools实如今线浏览。
在操做office2007时,需安装SaveAsPDFandXPS.exe ,安装成功后,如图所示:
只有安装了SaveAsPDFandXPS.exe,程序操做office文档,才有office文档另存为pdf文件。office2010不须要安装了,内置有这个功能。
核心代码:
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Web; 5 using Word = Microsoft.Office.Interop.Word; 6 using Excel = Microsoft.Office.Interop.Excel; 7 using PowerPoint = Microsoft.Office.Interop.PowerPoint; 8 using Microsoft.Office.Core; 9 namespace Wolfy.OfficePreview 10 { 11 /// <summary> 12 /// Office2Pdf 将Office文档转化为pdf 13 /// </summary> 14 public class Office2PDFHelper 15 { 16 public Office2PDFHelper() 17 { 18 // 19 // TODO: 在此处添加构造函数逻辑 20 // 21 } 22 /// <summary> 23 /// Word转换成pdf 24 /// </summary> 25 /// <param name="sourcePath">源文件路径</param> 26 /// <param name="targetPath">目标文件路径</param> 27 /// <returns>true=转换成功</returns> 28 public static bool DOCConvertToPDF(string sourcePath, string targetPath) 29 { 30 bool result = false; 31 Word.WdExportFormat exportFormat = Word.WdExportFormat.wdExportFormatPDF; 32 object paramMissing = Type.Missing; 33 Word.ApplicationClass wordApplication = new Word.ApplicationClass(); 34 Word.Document wordDocument = null; 35 try 36 { 37 object paramSourceDocPath = sourcePath; 38 string paramExportFilePath = targetPath; 39 Word.WdExportFormat paramExportFormat = exportFormat; 40 bool paramOpenAfterExport = false; 41 Word.WdExportOptimizeFor paramExportOptimizeFor = Word.WdExportOptimizeFor.wdExportOptimizeForPrint; 42 Word.WdExportRange paramExportRange = Word.WdExportRange.wdExportAllDocument; 43 int paramStartPage = 0; 44 int paramEndPage = 0; 45 Word.WdExportItem paramExportItem = Word.WdExportItem.wdExportDocumentContent; 46 bool paramIncludeDocProps = true; 47 bool paramKeepIRM = true; 48 Word.WdExportCreateBookmarks paramCreateBookmarks = Word.WdExportCreateBookmarks.wdExportCreateWordBookmarks; 49 bool paramDocStructureTags = true; 50 bool paramBitmapMissingFonts = true; 51 bool paramUseISO19005_1 = false; 52 wordDocument = wordApplication.Documents.Open( 53 ref paramSourceDocPath, ref paramMissing, ref paramMissing, 54 ref paramMissing, ref paramMissing, ref paramMissing, 55 ref paramMissing, ref paramMissing, ref paramMissing, 56 ref paramMissing, ref paramMissing, ref paramMissing, 57 ref paramMissing, ref paramMissing, ref paramMissing, 58 ref paramMissing); 59 if (wordDocument != null) 60 wordDocument.ExportAsFixedFormat(paramExportFilePath, 61 paramExportFormat, paramOpenAfterExport, 62 paramExportOptimizeFor, paramExportRange, paramStartPage, 63 paramEndPage, paramExportItem, paramIncludeDocProps, 64 paramKeepIRM, paramCreateBookmarks, paramDocStructureTags, 65 paramBitmapMissingFonts, paramUseISO19005_1, 66 ref paramMissing); 67 result = true; 68 } 69 catch 70 { 71 result = false; 72 } 73 finally 74 { 75 if (wordDocument != null) 76 { 77 wordDocument.Close(ref paramMissing, ref paramMissing, ref paramMissing); 78 wordDocument = null; 79 } 80 if (wordApplication != null) 81 { 82 wordApplication.Quit(ref paramMissing, ref paramMissing, ref paramMissing); 83 wordApplication = null; 84 } 85 GC.Collect(); 86 GC.WaitForPendingFinalizers(); 87 GC.Collect(); 88 GC.WaitForPendingFinalizers(); 89 } 90 return result; 91 } 92 93 /// <summary> 94 /// 把Excel文件转换成PDF格式文件 95 /// </summary> 96 /// <param name="sourcePath">源文件路径</param> 97 /// <param name="targetPath">目标文件路径</param> 98 /// <returns>true=转换成功</returns> 99 public static bool XLSConvertToPDF(string sourcePath, string targetPath) 100 { 101 bool result = false; 102 Excel.XlFixedFormatType targetType = Excel.XlFixedFormatType.xlTypePDF; 103 object missing = Type.Missing; 104 Excel.ApplicationClass application = null; 105 Excel.Workbook workBook = null; 106 try 107 { 108 application = new Excel.ApplicationClass(); 109 object target = targetPath; 110 object type = targetType; 111 workBook = application.Workbooks.Open(sourcePath, missing, missing, missing, missing, missing, 112 missing, missing, missing, missing, missing, missing, missing, missing, missing); 113 workBook.ExportAsFixedFormat(targetType, target, Excel.XlFixedFormatQuality.xlQualityStandard, true, false, missing, missing, missing, missing); 114 result = true; 115 } 116 catch 117 { 118 result = false; 119 } 120 finally 121 { 122 if (workBook != null) 123 { 124 workBook.Close(true, missing, missing); 125 workBook = null; 126 } 127 if (application != null) 128 { 129 application.Quit(); 130 application = null; 131 } 132 GC.Collect(); 133 GC.WaitForPendingFinalizers(); 134 GC.Collect(); 135 GC.WaitForPendingFinalizers(); 136 } 137 return result; 138 } 139 ///<summary> 140 /// 把PowerPoint文件转换成PDF格式文件 141 ///</summary> 142 ///<param name="sourcePath">源文件路径</param> 143 ///<param name="targetPath">目标文件路径</param> 144 ///<returns>true=转换成功</returns> 145 public static bool PPTConvertToPDF(string sourcePath, string targetPath) 146 { 147 bool result; 148 PowerPoint.PpSaveAsFileType targetFileType = PowerPoint.PpSaveAsFileType.ppSaveAsPDF; 149 object missing = Type.Missing; 150 PowerPoint.ApplicationClass application = null; 151 PowerPoint.Presentation persentation = null; 152 try 153 { 154 application = new PowerPoint.ApplicationClass(); 155 persentation = application.Presentations.Open(sourcePath, MsoTriState.msoTrue, MsoTriState.msoFalse, MsoTriState.msoFalse); persentation.SaveAs(targetPath, targetFileType, Microsoft.Office.Core.MsoTriState.msoTrue); 156 result = true; 157 } 158 catch 159 { 160 result = false; 161 } 162 finally 163 { 164 if (persentation != null) 165 { 166 persentation.Close(); 167 persentation = null; 168 } 169 if (application != null) 170 { 171 application.Quit(); 172 application = null; 173 } 174 GC.Collect(); 175 GC.WaitForPendingFinalizers(); 176 GC.Collect(); 177 GC.WaitForPendingFinalizers(); 178 } 179 return result; 180 } 181 } 182 }
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Web; 5 using System.Web.UI; 6 using System.Web.UI.WebControls; 7 8 namespace Wolfy.OfficePreview 9 { 10 public partial class Office2PDF : System.Web.UI.Page 11 { 12 protected void Page_Load(object sender, EventArgs e) 13 { 14 15 } 16 protected void btnWord_Click(object sender, EventArgs e) 17 { 18 Button btn = sender as Button; 19 switch (btn.CommandArgument) 20 { 21 case "docx": 22 Office2PDFHelper.DOCConvertToPDF(MapPath("/Doc/分析某网站的SEO策略(外链篇).doc"), MapPath("/PDF/分析某网站的SEO策略(外链篇).pdf")); 23 break; 24 case "xlsx": 25 Office2PDFHelper.XLSConvertToPDF(MapPath("/Excel/1994-2013北京市历年最低工资标准.xlsx"), MapPath("/PDF/1994-2013北京市历年最低工资标准.pdf")); 26 break; 27 case "ppt": 28 Office2PDFHelper.PPTConvertToPDF(MapPath("/PPT/23种设计模式详解.ppt"), MapPath("/PDF/23种设计模式详解.pdf")); 29 break; 30 default: 31 break; 32 } 33 } 34 } 35 }
1 <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Office2PDF.aspx.cs" Inherits="Wolfy.OfficePreview.Office2PDF" %> 2 3 <!DOCTYPE html> 4 5 <html xmlns="http://www.w3.org/1999/xhtml"> 6 <head runat="server"> 7 <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> 8 <title></title> 9 </head> 10 <body> 11 <form id="form1" runat="server"> 12 <div> 13 <asp:Button Text="Word转PDF" ID="btnWord" runat="server" CommandArgument="docx" OnClick="btnWord_Click" /> 14 <asp:Button ID="btnExcel" Text="Excel转PDF" runat="server" CommandArgument="xlsx" OnClick="btnWord_Click" /> 15 <asp:Button ID="btnPPT" Text="PPT转PDF" runat="server" CommandArgument="ppt" OnClick="btnWord_Click" /> 16 </div> 17 </form> 18 </body> 19 </html>
测试结果:
此方案office转pdf文件的过程的要求与方案二要求相同。
pdf转换完成后,就能够将pdf转换为swf,使用flexpaper+swftools实如今线浏览了,可参考我以前的一篇文章:
office文档直接转换为swf,使用flexpaper+swftool实如今先浏览。
office直接转换为swf,这里使用flashpaper来实现:
FlashPaper是一个虚拟打印机,可将word文件直接转化成swf格式文件(.doc.xls .txt .pdf等文件均可以正常生成SWF格式)。
这里只贴出核心代码:
1 using System; 2 using System.Collections.Generic; 3 using System.Diagnostics; 4 using System.Linq; 5 using System.Web; 6 using System.Web.UI; 7 using System.Web.UI.WebControls; 8 9 namespace Wolfy.OfficePreview 10 { 11 public partial class Office2Swf : System.Web.UI.Page 12 { 13 protected void Page_Load(object sender, EventArgs e) 14 { 15 16 } 17 protected void btnWord_Click(object sender, EventArgs e) 18 { 19 Button btn = sender as Button; 20 switch (btn.CommandArgument) 21 { 22 case "docx": 23 ConvertOffice2Swf(MapPath("/Doc/分析某网站的SEO策略(外链篇).doc"), MapPath("/SWF/分析某网站的SEO策略(外链篇).swf")); 24 break; 25 case "xlsx": 26 Office2PDFHelper.XLSConvertToPDF(MapPath("/Excel/1994-2013北京市历年最低工资标准.xlsx"), MapPath("/SWF/1994-2013北京市历年最低工资标准.swf")); 27 break; 28 case "ppt": 29 Office2PDFHelper.PPTConvertToPDF(MapPath("/PPT/23种设计模式详解.ppt"), MapPath("/SWF/23种设计模式详解.swf")); 30 break; 31 default: 32 break; 33 } 34 } 35 /// <summary> 36 /// office 转swf 37 /// </summary> 38 /// <param name="officePath">要转换的office文档路径</param> 39 /// <param name="swfPath">转换后swf的路径</param> 40 private void ConvertOffice2Swf(string officePath, string swfPath) 41 { 42 Process process = new Process(); //建立进程对象 43 ProcessStartInfo startInfo = new ProcessStartInfo(); 44 string paperroot = @"C:\Program Files\Macromedia\FlashPaper 2\FlashPrinter.exe";//这里是FlashPrinter的路径 45 string docFile = officePath; 46 string swfFile = swfPath; 47 startInfo.FileName = paperroot; 48 startInfo.Arguments = docFile + " -o " + swfFile; 49 startInfo.UseShellExecute = false; //不使用系统外壳程序启动 50 startInfo.RedirectStandardInput = false; //不重定向输入 51 startInfo.RedirectStandardOutput = false; //重定向输出 52 startInfo.CreateNoWindow = true; //不建立窗口 53 process.StartInfo = startInfo; 54 process.Start(); 55 if (process != null) 56 process.Close(); 57 58 } 59 } 60 }
鉴于测试时,flashpaper在将office文档转换为swf的时候,在使用flexpaper的浏览时,出现转换的内容为空,猜想:flexpaper能打开的swf文件与flashpaper转的swf文件不兼容。最后使用flashpaper将office文档转换为pdf,而后走方案三,pdf转swf的步骤。另外本地测试时,没问题。将项目部署在IIS上,不能浏览,出现卡死的状况,调试发现,文件太大,在office还没彻底转换为pdf的状况下,swftool工具就去寻找pdf文件,出现错误。
IIS上,没法浏览,查询网上解决方案,和权限这块有关,按照步骤设置了,未果,有点遗憾。
使用点聚公司的weboffice控件,测试后发现兼容性较差,放弃。有兴趣的能够研究一下。
office转pdf后,直接浏览器打开,此方案鉴于目前主流浏览器都集成adobe reader功能,可实现直接打开PDF文件。将pdf文件连接可直接打开。
必要条件:本地需安装adobe reader相似软件。
http://blogs.office.com/2013/04/10/office-web-viewer-view-office-documents-in-a-browser/
鉴于项目状况选择一个适合的方案,其中有方案只是曲线救国,可是一样能达到要求。若是您以为对你有所帮助,不妨推荐一下,让更多的人都能看到,谢谢你能看到文章最后。
demo:
连接:https://pan.baidu.com/s/1hqEpx5a 密码:gupg
参考文章:
http://www.cnblogs.com/expectszc/archive/2012/04/04/2432149.html
http://www.cnblogs.com/lexlin/articles/2478027.html
http://www.cnblogs.com/gossip/p/3473024.html
http://www.cnblogs.com/expectszc/archive/2012/04/04/2432149.html