马上加入IBC程序猿 各种源码随意下,各种教程随便看! 注册 每日签到 加入编程讨论群

C#教程 ASP.NET教程 C#视频教程程序源码享受不尽 C#技术求助 ASP.NET技术求助

【源码下载】 社群合作 申请版主 程序开发 【远程协助】 每天乐一乐 每日签到 【承接外包项目】 面试-葵花宝典下载

官方一群:

官方二群:

C# 基于NPOI+Office COM组件 实现20行代码在线预览文档word,excel,pdf

[复制链接]
查看2552 | 回复0 | 2019-8-15 16:49:56 | 显示全部楼层 |阅读模式

由于项目需要,需要一个在线预览office的功能,小编一开始使用的是微软提供的方法,简单快捷,但是不符合小编开辟需求,

就另外用了:将文件转换成html文件然后预览html文件的方法。对微软提供的方法感兴趣的小同伴可以去看一下,够简单直接:word+excle+pdf表格在线浏览

我们来说一下小编使用的方法,这种预览方式基于开源的NPOI+Office COM组件,使用是需要引入这几个动态链接库,总体如下:


C#在线预览文档(word,excel,pdf,txt,png)

  1. 预览方式:将文件转换成html文件然后预览html文件
  2. 预览word文件:需要引入Interop.Microsoft.Office.Interop.Word.dll(Office COM+组件)
  3. 预览Excel文件:需要引入Interop.Microsoft.Office.Interop.Excel.dll(Office COM+组件)
  4. PDF文件直接嵌入到浏览器中进行查看,无需转换(需安装pdf阅读器)(直接使用文件的路径访问即可)
  5. 文本文件直接嵌入到浏览器进行查看,无需转换(直接使用文件的路径访问即可)
  6. 图片文件直接嵌入到浏览器进行查看,无需转换(直接使用文件的路径访问即可)

下面小编就预览word文件和预览excel文件进行学习一下。

准备工作:

1、创建MVC项目,引入NPOI和office Com组件动态链接库,小编使用的是VS2017,

  直接在NuGet里面引入(只演示NPOI的引入,Interop.Microsoft.Office.Interop.Word和Interop.Microsoft.Office.Interop.Excel的引入一样的操作)

165013ga6oa6ggofao2c8r.png

2、在Content文件加下面建立一个excel文件和word文件,里面的内容可以自定义


代码编写:

  后端代码:

  我们准备完成后就开始编写代码进行调试,代码如下,我直接整个控制器粘贴出来。

  1. using Microsoft.Office.Interop.Excel;
  2. using NPOI.SS.UserModel;
  3. using NPOI.XSSF.UserModel;
  4. using System;
  5. using System.Collections.Generic;
  6. using System.Diagnostics;
  7. using System.IO;
  8. using System.Linq;
  9. using System.Web;
  10. using System.Web.Mvc;
  11. namespace WebOnlineWord.Controllers
  12. {
  13. public class HomeController : Controller
  14. {
  15. public ActionResult Index()
  16. {
  17. return View();
  18. }
  19. //C#在线预览文档(word,excel,pdf,txt,png)
  20. //1、预览方式:将文件转换成html文件然后预览html文件
  21. //2、预览word文件:需要引入Interop.Microsoft.Office.Interop.Word.dll(Office COM组件)
  22. //3、预览Excel文件:需要引入Interop.Microsoft.Office.Interop.Excel.dll(Office COM组件)
  23. //4、PDF文件直接嵌入到浏览器中进行查看,无需转换(需安装pdf阅读器)
  24. //5、文本文件直接嵌入到浏览器进行查看,无需转换
  25. //6、图片文件直接嵌入到浏览器进行查看,无需转换
  26. #region Excel预览方法
  27. /// <summary>
  28. /// excel 转换为html
  29. /// </summary>
  30. /// <param name="path">要转换的文档的路径</param>
  31. /// <param name="savePath">转换成的html的保存路径</param>
  32. /// <param name="wordFileName">转换后html文件的名字</param>
  33. public JsonResult ExcelToHtml()
  34. {
  35. ResultJson result = new ResultJson();
  36. string path = Server.MapPath("/Content/excel.xlsx");
  37. string savePath = Server.MapPath("/Content/");
  38. string wordFileName = "ExcelToHtml";
  39. string str = string.Empty;
  40. Microsoft.Office.Interop.Excel.Application repExcel = new Microsoft.Office.Interop.Excel.Application();
  41. Microsoft.Office.Interop.Excel.Workbook workbook = null;
  42. Microsoft.Office.Interop.Excel.Worksheet worksheet = null;
  43. 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);
  44. worksheet = (Microsoft.Office.Interop.Excel.Worksheet)workbook.Worksheets[1];
  45. object htmlFile = savePath + wordFileName + ".html";
  46. string resultUrl = htmlFile.ToString();
  47. object ofmt = Microsoft.Office.Interop.Excel.XlFileFormat.xlHtml;
  48. 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);
  49. object osave = false;
  50. workbook.Close(osave, Type.Missing, Type.Missing);
  51. repExcel.Quit();
  52. result.str = "/Content/" + wordFileName + ".html"; ;
  53. return Json(result, JsonRequestBehavior.AllowGet);
  54. }
  55. #endregion
  56. #region Excel预览方法
  57. /// <summary>
  58. /// word 转换为html
  59. /// </summary>
  60. /// <param name="path">要转换的文档的路径</param>
  61. /// <param name="savePath">转换成的html的保存路径</param>
  62. /// <param name="wordFileName">转换后html文件的名字</param>
  63. public JsonResult WordToHtml()
  64. {
  65. ResultJson result = new ResultJson();
  66. string path = Server.MapPath("/Content/word.docx");
  67. string savePath = Server.MapPath("/Content/");
  68. string wordFileName = "WordToHtml";
  69. Microsoft.Office.Interop.Word.Application word = new Microsoft.Office.Interop.Word.Application();
  70. Type wordType = word.GetType();
  71. Microsoft.Office.Interop.Word.Documents docs = word.Documents;
  72. Type docsType = docs.GetType();
  73. Microsoft.Office.Interop.Word.Document doc = (Microsoft.Office.Interop.Word.Document)docsType.InvokeMember("Open", System.Reflection.BindingFlags.InvokeMethod, null, docs, new Object[] { (object)path, true, true });
  74. Type docType = doc.GetType();
  75. string strSaveFileName = savePath + wordFileName + ".html";
  76. object saveFileName = (object)strSaveFileName;
  77. docType.InvokeMember("SaveAs", System.Reflection.BindingFlags.InvokeMethod, null, doc, new object[] { saveFileName, Microsoft.Office.Interop.Word.WdSaveFormat.wdFormatFilteredHTML });
  78. docType.InvokeMember("Close", System.Reflection.BindingFlags.InvokeMethod, null, doc, null);
  79. wordType.InvokeMember("Quit", System.Reflection.BindingFlags.InvokeMethod, null, word, null);
  80. result.str = "/Content/" + wordFileName + ".html"; ;
  81. return Json(result, JsonRequestBehavior.AllowGet);
  82. }
  83. #endregion
  84. public class ResultJson
  85. {
  86. public bool res { get; set; }
  87. public string info { get; set; }
  88. public string str { get; set; }
  89. }
  90. }
  91. }
复制代码

 前端代码:

  代码如下,我直接整个页面粘贴出来。

  1. @{
  2. ViewBag.Title = "Home Page";
  3. }
  4. <script src="~/Scripts/jquery-3.3.1.min.js"></script>
  5. <script type="text/javascript">
  6. //预览excel
  7. function ExcelToHtml() {
  8. $.ajax({
  9. url: "/Home/ExcelToHtml",
  10. data: "",
  11. type: "POST",
  12. async: false,
  13. dataType: "json",
  14. success: function (data) {
  15. //获得窗口的垂直位置
  16. var iWidth = 1400;
  17. var iHeight = 800;
  18. var iTop = (window.screen.availHeight - 30 - iHeight) / 2;
  19. //获得窗口的水平位置
  20. var iLeft = (window.screen.availWidth - 10 - iWidth) / 2;
  21. window.open(data.str, '_blank', 'height=' + iHeight + ',innerHeight=' + iHeight + ',width=' + iWidth + ',innerWidth=' + iWidth + ',top=' + iTop + ',left=' + iLeft + ',status=no,toolbar=no,menubar=no,location=no,resizable=no,scrollbars=0,titlebar=no');
  22. }
  23. });
  24. }
  25. //预览word
  26. function WordToHtml() {
  27. $.ajax({
  28. url: "/Home/WordToHtml",
  29. data: "",
  30. type: "POST",
  31. async: false,
  32. dataType: "json",
  33. success: function (data) {
  34. //获得窗口的垂直位置
  35. var iWidth = 1400;
  36. var iHeight = 800;
  37. var iTop = (window.screen.availHeight - 30 - iHeight) / 2;
  38. //获得窗口的水平位置
  39. var iLeft = (window.screen.availWidth - 10 - iWidth) / 2;
  40. window.open(data.str, '_blank', 'height=' + iHeight + ',innerHeight=' + iHeight + ',width=' + iWidth + ',innerWidth=' + iWidth + ',top=' + iTop + ',left=' + iLeft + ',status=no,toolbar=no,menubar=no,location=no,resizable=no,scrollbars=0,titlebar=no');
  41. }
  42. });
  43. }
  44. </script>
  45. <div style="margin-top:20px;height:800px">
  46. <input type="button" onclick="ExcelToHtml()" value="预览excel" />
  47. <input type="button" onclick="WordToHtml()" value="预览word" />
  48. </div>
复制代码


效果查看:

  在线预览excel:

    如下,很显然读取到了我们事先准备好的excel。

165014yn2v66vo2vnktjvl.png

  在线预览excel:

    如下,很显然读取到了我们事先准备好的word。

165014p5w6d55run1u07n1.png


总结:

到这里一个简单的在线预览office就完成了,这是一个初始手稿,需要优化后续功能。

感兴趣的朋友可以关注一波,我们下次学习怎么在线编辑,实时保存(每改一下保存一下)和一键保存(编辑完成后点击保存)

原文地址:https://www.cnblogs.com/xiongze520/p/11358585.html

转载请注明出处,谢谢!


来源:https://www.cnblogs.com/xiongze520/p/11358585.html
*滑块验证:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则