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" οnchange="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 isIE = /msie/i.test(navigator.userAgent) && !window.opera; 
			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('|');
    	}


  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值