MVC架构下,使用NPOI读取.DOCX文档中表格的内容

时间:2023-03-08 17:24:06
MVC架构下,使用NPOI读取.DOCX文档中表格的内容

1、使用NPOI,可以在没有安装office的设备上读wiod、office。
2、本文只能读取.docx后缀的文档。
3、MVC架构中,上传文件只能使用form表单提交,转到控制器后要依次实现文件上传、打开文件、读取文件内容。
4、当读取文档中的表格时,逐行、逐单元格读取。

XCHTML:

 <form id="form1" method="post" action="@Url.Action("Add","MeetRecord")" enctype="multipart/form-data">
     <input type="file" name="files" id="files" onchange="ReadeWordTable(this)" />
     <input type="submit" value="提交" />
 </form>

● Url.Action("Add","MeetRecord")表单提交到MeetRecordControl控制器里面的Add方法。
● type为file的input框里面一定要有name属性,后台在接受文件时,是通过这个name字段接收的,如果不定义name属性,或者name的值与控制器中接收的参数名不一致,会出现问题。
● 因为使用form表单提交,后台只能返回一个页面,因此我在type为file的input框里添加了一个onchange事件,用来验证所选择的文件,是否符合要求。
● 下面的方法就是用来验证文件是否符合要求。

 <script>
 function ReadeWordTable(target) {
 var fileSize = 0;
 var filetypes = [".docx"];
 var filepath = target.value;
 var filemaxsize = 1024 * 2;//2M
 if (filepath) {
 var isnext = false;
 var fileend = filepath.substring(filepath.lastIndexOf("."));
 if (filetypes[0] == fileend) {
 isnext = true;
 }
 if (!isnext) {
 alert("只能上传.docx类型文件!");
 target.value = "";
 return false;
 }
 } else {
 return false;
 }
 if (isIE && !target.files) {
 var filePath = target.value;
 var fileSystem = new ActiveXObject("Scripting.FileSystemObject");
 if (!fileSystem.FileExists(filePath)) {
 alert("附件不存在,请重新输入!");
 return false;
 }
 var file = fileSystem.GetFile(filePath);
 fileSize = file.Size;
 } else {
 fileSize = target.files[0].size;
 }
 var size = fileSize / 1024;
 if (size > filemaxsize) {
 alert("附件大小不能大于" + filemaxsize / 1024 + "M!");
 target.value = "";
 return false;
 }
 if (size <= 0) {
 alert("附件大小不能为0M!");
 target.value = "";
 return false;
 }
 }
 </script>

c#后台实现:

 using System;
 using System.Data;
 using System.IO;
 using System.Text;
 using System.Web;
 using System.Web.Mvc;
 using NPOI.XWPF.UserModel;

 [HttpPost]
 public ActionResult Add(HttpPostedFileWrapper files)
 {
 HttpServerUtility server = System.Web.HttpContext.Current.Server;
 string save_Path = server.MapPath("..\\Word\\");
 string fileName = files.FileName;
 files.SaveAs(save_Path + fileName);
 ViewBag.fileName = ReadWordText(fileName);
 return View();
 }
 ////读取文档里面的表格
 public string ReadWordText(string fileName)
 {
 string filePath = "..\\Word\\" + fileName;
 HttpServerUtility server = System.Web.HttpContext.Current.Server;
 string endPath = server.MapPath(filePath);
 string fileText = string.Empty;
 StringBuilder sbFileText = new StringBuilder();
 #region 打开文档
 XWPFDocument document = null;
 using (FileStream file = new FileStream(endPath, FileMode.Open))
 {
 document = new XWPFDocument(file);

 }
 #endregion
 #region 表格
 foreach (XWPFTable table in document.Tables)
 {
 foreach(XWPFTableRow row in table.Rows)
 {
 foreach (XWPFTableCell cell in row.GetTableCells())
 {
 sbFileText.Append(cell.GetText()+"|");
 }
 }

 }
 #endregion
 return sbFileText.ToString();
 }

● 在后台接收文件时,一定要添加[HttpPost],否则会报错。
● 在Add方法中类型要ActionResult ,传的参数类型应该为HttpPostedFileWrapper 文件名应该与type为file的input的name属性值相同。
● 因为我需要获得文档表格里面的内容,在页面上显示出来,为了方便在前台读取每个表格里面的内容,用‘|’字符将表格里面的内容相互分割开。
● 在页面上使用Razor,进行接受,在对其进行处理,代码如下所示:

 @{string fileName = ViewBag.fileName;
 string[] FileNameArr = null;
 if (fileName != "" && fileName != null)
 {
 FileNameArr = fileName.Split('|');
 }
 }