asp.net实现word、excel、ppt、pdf在线预览

  • 引言

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

    方案一

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

     \

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

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

    方案二

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

    \

     \

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

    \

    解决办法:

    \

    \

    office文档转换html辅助类:

    加载中...
    01.using System;
    02.using System.Collections.Generic;
    03.using System.Linq;
    04.using System.Web;
    05.using Microsoft.Office.Core;
    06.using Word = Microsoft.Office.Interop.Word;
    07.namespace Wolfy.OfficePreview
    08.{
    09.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.}
    73. 
    74.Office2HtmlHelper
    Office2HtmlHelper 加载中...
    01.<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Office2Html.aspx.cs" Inherits="Wolfy.OfficePreview.Office2Html" %>
    02. 
    03.<!DOCTYPE html>
    04. 
    06.<head runat="server">
    07.<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    08.<title></title>
    09.</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>
    20. 
    21.Office2Html.aspx
    Office2Html.aspx
    01.using System;
    02.using System.Collections.Generic;
    03.using System.Linq;
    04.using System.Web;
    05.using System.Web.UI;
    06.using System.Web.UI.WebControls;
    07. 
    08.namespace Wolfy.OfficePreview
    09.{
    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不需要安装了,内置有这个功能。

     核心代码:


    加载中...
    001.using System;
    002.using System.Collections.Generic;
    003.using System.Linq;
    004.using System.Web;
    005.using Word = Microsoft.Office.Interop.Word;
    006.using Excel = Microsoft.Office.Interop.Excel;
    007.using PowerPoint = Microsoft.Office.Interop.PowerPoint;
    008.using Microsoft.Office.Core;
    009.namespace Wolfy.OfficePreview
    010.{
    011./// <summary>
    012./// Office2Pdf 将Office文档转化为pdf
    013./// </summary>
    014.public class Office2PDFHelper
    015.{
    016.public Office2PDFHelper()
    017.{
    018.//
    019.// TODO: 在此处添加构造函数逻辑
    020.//
    021.}
    022./// <summary>
    023./// Word转换成pdf
    024./// </summary>
    025./// <param name="sourcePath">源文件路径</param>
    026./// <param name="targetPath">目标文件路径</param>
    027./// <returns>true=转换成功</returns>
    028.public static bool DOCConvertToPDF(string sourcePath, string targetPath)
    029.{
    030.bool result = false;
    031.Word.WdExportFormat exportFormat = Word.WdExportFormat.wdExportFormatPDF;
    032.object paramMissing = Type.Missing;
    033.Word.ApplicationClass wordApplication = new Word.ApplicationClass();
    034.Word.Document wordDocument = null;
    035.try
    036.{
    037.object paramSourceDocPath = sourcePath;
    038.string paramExportFilePath = targetPath;
    039.Word.WdExportFormat paramExportFormat = exportFormat;
    040.bool paramOpenAfterExport = false;
    041.Word.WdExportOptimizeFor paramExportOptimizeFor = Word.WdExportOptimizeFor.wdExportOptimizeForPrint;
    042.Word.WdExportRange paramExportRange = Word.WdExportRange.wdExportAllDocument;
    043.int paramStartPage = 0;
    044.int paramEndPage = 0;
    045.Word.WdExportItem paramExportItem = Word.WdExportItem.wdExportDocumentContent;
    046.bool paramIncludeDocProps = true;
    047.bool paramKeepIRM = true;
    048.Word.WdExportCreateBookmarks paramCreateBookmarks = Word.WdExportCreateBookmarks.wdExportCreateWordBookmarks;
    049.bool paramDocStructureTags = true;
    050.bool paramBitmapMissingFonts = true;
    051.bool paramUseISO19005_1 = false;
    052.wordDocument = wordApplication.Documents.Open(
    053.ref paramSourceDocPath, ref paramMissing, ref paramMissing,
    054.ref paramMissing, ref paramMissing, ref paramMissing,
    055.ref paramMissing, ref paramMissing, ref paramMissing,
    056.ref paramMissing, ref paramMissing, ref paramMissing,
    057.ref paramMissing, ref paramMissing, ref paramMissing,
    058.ref paramMissing);
    059.if (wordDocument != null)
    060.wordDocument.ExportAsFixedFormat(paramExportFilePath,
    061.paramExportFormat, paramOpenAfterExport,
    062.paramExportOptimizeFor, paramExportRange, paramStartPage,
    063.paramEndPage, paramExportItem, paramIncludeDocProps,
    064.paramKeepIRM, paramCreateBookmarks, paramDocStructureTags,
    065.paramBitmapMissingFonts, paramUseISO19005_1,
    066.ref paramMissing);
    067.result = true;
    068.}
    069.catch
    070.{
    071.result = false;
    072.}
    073.finally
    074.{
    075.if (wordDocument != null)
    076.{
    077.wordDocument.Close(ref paramMissing, ref paramMissing, ref paramMissing);
    078.wordDocument = null;
    079.}
    080.if (wordApplication != null)
    081.{
    082.wordApplication.Quit(ref paramMissing, ref paramMissing, ref paramMissing);
    083.wordApplication = null;
    084.}
    085.GC.Collect();
    086.GC.WaitForPendingFinalizers();
    087.GC.Collect();
    088.GC.WaitForPendingFinalizers();
    089.}
    090.return result;
    091.}
    092. 
    093./// <summary>
    094./// 把Excel文件转换成PDF格式文件 
    095./// </summary>
    096./// <param name="sourcePath">源文件路径</param>
    097./// <param name="targetPath">目标文件路径</param>
    098./// <returns>true=转换成功</returns>
    099.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.}
    183. 
    184.Office2PDFHelper
    Office2PDFHelper 加载中...
    01.using System;
    02.using System.Collections.Generic;
    03.using System.Linq;
    04.using System.Web;
    05.using System.Web.UI;
    06.using System.Web.UI.WebControls;
    07. 
    08.namespace Wolfy.OfficePreview
    09.{
    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.}
    36. 
    37.Office2PDF
    Office2PDF 加载中...
    01.<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Office2PDF.aspx.cs" Inherits="Wolfy.OfficePreview.Office2PDF" %>
    02. 
    03.<!DOCTYPE html>
    04. 
    06.<head runat="server">
    07.<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    08.<title></title>
    09.</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>
    20. 
    21.Office2PDF.aspx
    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格式)。

    这里只贴出核心代码:

    01.using System;
    02.using System.Collections.Generic;
    03.using System.Diagnostics;
    04.using System.Linq;
    05.using System.Web;
    06.using System.Web.UI;
    07.using System.Web.UI.WebControls;
    08. 
    09.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\<a href="http://www.it165.net/design/wfl/" target="_blank" class="keylink">Flash</a>Paper 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类似软件。

阅读原文
阅读更多

没有更多推荐了,返回首页