[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 }
复制代码
复制代码
 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不需要安装了,内置有这个功能。

 核心代码:

 Office2PDFHelper
 Office2PDF
 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 FilesMacromediaFlashPaper 2FlashPrinter.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

  • 博客地址:http://www.cnblogs.com/wolf-sun/ 
    博客版权:如果文中有不妥或者错误的地方还望高手的你指出,以免误人子弟。如果觉得本文对你有所帮助不如【推荐】一下!如果你有更好的建议,不如留言一起讨论,共同进步! 再次感谢您耐心的读完本篇文章。
原文地址:https://www.cnblogs.com/zhurunlai/p/10694629.html