引言
之前項目需要,查找了office文檔在線預覽的解決方案,順便記錄一下,方便以后查詢。
方案一
直接在瀏覽器中打開Office文檔在頁面上的鏈接。會彈出如下窗口:
優點:主流瀏覽器都支持。
缺點:Office文檔鏈接在瀏覽器中打開,會有如上圖的提示,需用戶自己選擇打開或者保存功能,如果客戶電腦上安裝迅雷下載軟件,會啟動迅雷下載,用戶體驗不好。
方案二
office文檔轉html,首先引入com組件中office庫,然后在程序集擴展中引入word,excel,ppt的dll。
然后F6生成,會報如下錯誤:
解決辦法:
office文檔轉換html輔助類:
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 }
測試結果:
這里為了測試特找了含有圖片的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://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