[Asp.net]常見word,excel,ppt,pdf在線預覽方案,有圖有真相,總有一款適合你!


引言

之前項目需要,查找了office文檔在線預覽的解決方案,順便記錄一下,方便以后查詢。

方案一

直接在瀏覽器中打開Office文檔在頁面上的鏈接。會彈出如下窗口:

 

優點:主流瀏覽器都支持。

缺點:Office文檔鏈接在瀏覽器中打開,會有如上圖的提示,需用戶自己選擇打開或者保存功能,如果客戶電腦上安裝迅雷下載軟件,會啟動迅雷下載,用戶體驗不好。

方案二

office文檔轉html,首先引入com組件中office庫,然后在程序集擴展中引入word,excel,ppt的dll。

 

 

然后F6生成,會報如下錯誤:

 

解決辦法:

 

 

office文檔轉換html輔助類:

按 Ctrl+C 復制代碼
按 Ctrl+C 復制代碼
 
 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>
 
Office2Html.aspx
 
 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 }
 
Office2PDFHelper
 
 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 }
 
Office2PDF
 
 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>
 
Office2PDF.aspx

測試結果:

 

 

 

此方案office轉pdf文件的過程的要求與方案二要求相同。

pdf轉換完成后,就可以將pdf轉換為swf,使用flexpaper+swftools實現在線瀏覽了,可參考我之前的一篇文章:

FlexPaper+SWFTool+操作類=在線預覽PDF

方案四

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM