[Asp.net]常见word,excel,ppt,pdf在线预览方案,有图有真相,总有一款适合你!

引言

之前项目需要,查找了office文档在线预览的解决方案,顺便记录一下,方便以后查询。

方案一

直接在浏览器中打开Office文档在页面上的链接。会弹出如下窗口:

 

优点:主流浏览器都支持。

缺点:Office文档链接在浏览器中打开,会有如上图的提示,需用户自己选择打开或者保存功能,如果客户电脑上安装迅雷下载软件,会启动迅雷下载,用户体验不好。

方案二

office文档转html,首先引入com组件中office库,然后在程序集扩展中引入word,excel,ppt的dll。

 

然后F6生成,会报如下错误:

解决办法:

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 }
Office2HtmlHelper
 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://blogs.office.com/2013/04/10/office-web-viewer-view-office-documents-in-a-browser/

方案八

web在线打印,打印阅览,打印维护,打印设计

总结

鉴于项目情况选择一个适合的方案,其中有方案只是曲线救国,但是同样能达到要求。如果您觉得对你有所帮助,不妨推荐一下,让更多的人都能看到,谢谢你能看到文章最后。

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

posted @ 2014-02-27 08:58  wolfy  阅读(47297)  评论(142编辑  收藏  举报