博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[Asp.net]常见word,excel,ppt,pdf在线预览方案,有图有真相,总有一款适合你!...
阅读量:5874 次
发布时间:2019-06-19

本文共 18536 字,大约阅读时间需要 61 分钟。

引言

之前项目需要,查找了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 Office2HtmlHelper10     {11         /// 12         /// Word转成Html13         /// 14         /// 要转换的文档的路径15         /// 转换成html的保存路径16         /// 转换成html的文件名字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         /// 34         /// Excel转成Html35         /// 36         /// 要转换的文档的路径37         /// 转换成html的保存路径38         /// 转换成html的文件名字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         /// 55         /// ppt转成Html56         /// 57         /// 要转换的文档的路径58         /// 转换成html的保存路径59         /// 转换成html的文件名字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  4  5  6  7     
8 9 10 11
12
13
14
15
16
17
18 19
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.Page11     {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     ///  12     /// Office2Pdf 将Office文档转化为pdf 13     ///  14     public class Office2PDFHelper 15     { 16         public Office2PDFHelper() 17         { 18             // 19             // TODO: 在此处添加构造函数逻辑 20             // 21         } 22         ///  23         /// Word转换成pdf 24         ///  25         /// 源文件路径 26         /// 目标文件路径 27         /// 
true=转换成功
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 /// 94 /// 把Excel文件转换成PDF格式文件 95 /// 96 /// 源文件路径 97 /// 目标文件路径 98 ///
true=转换成功
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 try107 {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 catch117 {118 result = false;119 }120 finally121 {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 /// 140 /// 把PowerPoint文件转换成PDF格式文件 141 /// 142 ///源文件路径 143 ///目标文件路径 144 ///
true=转换成功
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 try153 {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 catch159 {160 result = false;161 }162 finally163 {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.Page11     {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  4  5  6  7 
8 9 10 11
12
13
14
15
16
17
18 19
Office2PDF.aspx

测试结果:

 

此方案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.OfficePreview10 {11     public partial class Office2Swf : System.Web.UI.Page12     {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         /// 36         /// office 转swf37         /// 38         /// 要转换的office文档路径39         /// 转换后swf的路径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:

链接: 密码:gupg

参考文章:

转载于:https://www.cnblogs.com/wolf-sun/p/3569960.html

你可能感兴趣的文章
http请求方法
查看>>
[SHELL] LAMP一键安装脚本设计(v2.1)
查看>>
Java静态代理和动态代理
查看>>
javaMail
查看>>
UITableView的重用
查看>>
swift属性观察者机智
查看>>
在ASP.NET中面向对象的编程思想
查看>>
【网摘】 浅谈HTTP中GET与POST的区别
查看>>
What we find changes who we become.
查看>>
从 A/Looper: Could not create epoll instance. errno=24 错误浅谈解决各种 bug 的思路
查看>>
表单+文件上传+音频+iframe
查看>>
页码显示工具包
查看>>
【Machine Learning】监督学习、非监督学习及强化学习对比
查看>>
CRT工具远程登陆Google Cloud远程ssh登录方法
查看>>
C指针(一)
查看>>
应用程序范围的键值对
查看>>
小型考试系统
查看>>
匿名函数的简单理解和应用
查看>>
C - Catch That Cow
查看>>
SSH抛出org.apache.ibatis.exceptions.PersistenceException: 异常
查看>>