冯 海

一个程序新人菜鸟的日记,希望大家多多关照。QQ:32316131

mvc5+ef+ adminlte教程15:NPOI 导入和导出exlce(以上章的echars图表中的表为例 ) (2017-06-16 19:44)

本来上章是准备用LinqToExcle的,但那家伙,竟然 要求安装OFFICE组件,要不出错。于是果断放弃,使用NPoi

1.下载

 先去官网:http://npoi.codeplex.com/下载

然后右边有一个大大的DOWNLOAD,点击,然后选择最新的版本,我现在能下的是2.2.1版本Npoi

然后解压后,好几个dll文件进行引用。

但我却懒 得这么做,因为我在安装包中竟然能搜到,而且2.3版本。

 

3.实现数据库表的导出

 .在前台加一个导出按钮

		@Html.ActionLink("导出Excle", "ToExlce", "", new { @class = "btn btn-info" })

  

然后后台增加代码

//导出的方法Npoi
		public FileResult ToExlce()
		{
			 

			//创建Excel文件的对象
			HSSFWorkbook book = new  HSSFWorkbook();
			//添加一个sheet
             ISheet sheet1 = book.CreateSheet("Sheet1");
			//获取list数据,我把网上的示范改了,直接用数据表中的数据进行LIST
			List<Echarone> listRainInfo = db.Echarones.ToList();
			//给sheet1添加第一行的头部标题
			NPOI.SS.UserModel.IRow row1 = sheet1.CreateRow(0);
			row1.CreateCell(0).SetCellValue("序号");
			row1.CreateCell(1).SetCellValue("栏目ID");
			row1.CreateCell(2).SetCellValue("主体");
			row1.CreateCell(3).SetCellValue("任务数");
			row1.CreateCell(4).SetCellValue("完成数");
			row1.CreateCell(5).SetCellValue("排序");

			//将数据逐步写入sheet1各个行
			for (int i = 0; i < listRainInfo.Count; i++)
			{
				NPOI.SS.UserModel.IRow rowtemp = sheet1.CreateRow(i + 1);
				rowtemp.CreateCell(0).SetCellValue(listRainInfo[i].Id.ToString());
				rowtemp.CreateCell(1).SetCellValue(listRainInfo[i].EcharColmnId.ToString());
				rowtemp.CreateCell(2).SetCellValue(listRainInfo[i].ObjNmae.ToString());
				rowtemp.CreateCell(3).SetCellValue(listRainInfo[i].TaskDondeOne.ToString());
				rowtemp.CreateCell(4).SetCellValue(listRainInfo[i].TaskDondeTwo.ToString());
				rowtemp.CreateCell(5).SetCellValue(listRainInfo[i].Sort.ToString());
			}

			// 写入到客户端 
			System.IO.MemoryStream ms = new System.IO.MemoryStream();
			book.Write(ms);
			ms.Seek(0, SeekOrigin.Begin);
			return File(ms, "application/vnd.ms-excel", "图表数据.xls");


		}

  然后点击导出

会自动下载EXCE表,打开就是数据库中的数据。

 

成功,上面有个小错误,我当时把排序也写在第4列了,所以导致完成数被排序数所覆盖。

更改好正常。

 三、导入功能

导入就比较麻烦了,经测试只能使用XLS的文件,2007生成的XLSX的要出错。

1.新建一个XLS表,内容和数据库中对应,第一行为字段名,因为我没有写字段名,所以第一行未能成功写入。

 

2.前台。

先在indexlist视图中增加了一个导入按钮,然后点击转入到Import视图和控制器。

在import控制器中,他读出所有的Echareones有中的数据。

最主要是上面有一个bootstrap 样式的fileupdate,就是上传的操作。

(1)先上传文件

(2)上传文件后在后台保存

(3)用npoi读出来。删除原有所有数据,然后每一行为一个MODEL,进行ADD,最后save.change()

@model IEnumerable<jsdhh2.Models.Echarone>

@{
	ViewBag.Title = "Index"; Layout = "~/Views/Shared/_AdminLayout.cshtml";
}
<!-- Content Header (Page header) -->
<section class="content-header">
	<h1>
	导入数据库
		<small>导入电子表格,请注意模板</small>
	</h1>
	<ol class="breadcrumb">
		<li><a href="#"><i class="fa fa-dashboard"></i> Level</a></li>
		<li class="active">Here</li>
	</ol>
</section>
<!--end Content Header (Page header) -->
<section class="content">
	<div class="panel panel-default">
		<div class="panel-heading">
			@Html.ActionLink("新建", "Create", "", new { @class = "btn btn-success" })









	</div>
	<div class="panel-body">
		<!-- button -->
	 
        @using (Html.BeginForm("Browse", "Echarones", FormMethod.Post, new { enctype = "multipart/form-data", id = "form_Upload" }))
		{
          @Html.AntiForgeryToken() //防止跨站请求伪造(CSRF:Cross-site request forgery)攻击
								<input id="input-41" name="input41[]" type="file" multiple class="file-loading">
								<hr>
								<button type="submit" class="btn btn-primary">上传</button>
								<button type="reset" class="btn btn-default">清除</button>



		}

		<h2></h2>
		<table class="table">
			<tr>
				<th>
					栏目ID
				</th>
				<th>
					主体名
				</th>
				<th>
					任务
				</th>
				<th>
					完成
				</th>
				<th>
					排序
				</th>

				<th></th>
			</tr>

			@foreach (var item in Model)
			{
				<tr>
					<td>
						@Html.DisplayFor(modelItem => item.EcharColmnId)
					</td>
					<td>
						@Html.DisplayFor(modelItem => item.ObjNmae)
					</td>
					<td>
						@Html.DisplayFor(modelItem => item.TaskDondeOne)
					</td>
					<td>
						@Html.DisplayFor(modelItem => item.TaskDondeTwo)
					</td>
					<td>
						@Html.DisplayFor(modelItem => item.Sort)
					</td>
					<td>
						@Html.ActionLink("修改", "Edit", new { id = item.Id }) |

						@Html.ActionLink("删除", "Delete", new { id = item.Id })
					</td>
				</tr>
			}

		</table>







</div>




</section>
@section scripts{
<link href="~/Content/bootstrap-fileinput/css/fileinput.css" rel="stylesheet" />
<script src="~/Content/bootstrap-fileinput/js/fileinput.js"></script>
	<script>
		$(document).on('ready', function () {
			$("#input-41").fileinput({
				maxFileCount: 10,
				maxFileSize: 1000,
				allowedPreviewTypes: ['other'],
				allowedFileExtensions: ['xlsx','xls']
			});
		});
</script>

}

  

2.后台方法。

//显示所有的图表中的数据
		public async Task<ActionResult> IndexList()
		{
			return View(await db.Echarones.ToListAsync());
		}

 上面是IndexList()

正同是重点

//导入的操作
		public ActionResult Import()
		{

			return View( db.Echarones);
		}
		//上传方法
		public ActionResult Browse()
		{
			//int saveCount = 0; //定义变量

			//if (ModelState.IsValid && !string.IsNullOrEmpty(id))
			//{}

		     var files = Request.Files;
			if (files.Count > 0)
			{
				var file = files[0];
				string strFileSavePath = Request.MapPath("~/Content/Excle");  //定义上传目标地址
				string strFileExtention = Path.GetExtension(file.FileName);
				if (!Directory.Exists(strFileSavePath))
				{
					Directory.CreateDirectory(strFileSavePath);
				}

				var dt = DateTime.Now;
				string str = dt.ToString("yyyyMMddHHmmss");
				var savePath = strFileSavePath + "/" + str + strFileExtention; //拼接保存文件路径
				file.SaveAs(strFileSavePath + "/" + str + strFileExtention);   //保存文件
			
				//导入的代码
				HSSFWorkbook hssfworkbook;
				try
				{
					 //读出表中数据
					using (FileStream filesw = new FileStream(savePath, FileMode.Open, FileAccess.Read))
					{
						hssfworkbook = new HSSFWorkbook(filesw);
					}
					//删除所有的数据,就是清空表原有数据
					List<Echarone> xx = db.Echarones.ToList();
					db.Echarones.RemoveRange(xx);
				}
				catch (Exception e)
				{
					throw e;
				}
				 ISheet sheet = hssfworkbook.GetSheetAt(0) ;
				 //DataTable table = new DataTable();
				 IRow headerRow = sheet.GetRow(0);//第一行为标题行
				int cellCount = headerRow.LastCellNum; //LastCellNum = PhysicalNumberOfCells
				int rowCount = sheet.LastRowNum;//LastRowNum = PhysicalNumberOfRows - 1
									//handling header.
					for (int i = (sheet.FirstRowNum + 1); i <= rowCount; i++)
                {
                    IRow row = sheet.GetRow(i);
                    //DataRow dataRow = table.NewRow();
                    if (row != null)
                    {
						//for (int j = row.FirstCellNum; j < cellCount; j++)
						//{
						//    if (row.GetCell(j) != null)
						//        dataRow[j] = GetCellValue(row.GetCell(j));
						//}
						Echarone echarones = new Echarone();
						echarones.EcharColmnId = row.GetCell(1).ToString();
						echarones.ObjNmae = row.GetCell(2).ToString();
						
						echarones.TaskDondeOne = System.Convert.ToDouble(row.GetCell(3).ToString());
						echarones.TaskDondeTwo = System.Convert.ToDouble(row.GetCell(4).ToString());
						echarones.Sort = Convert.ToInt32(row.GetCell(5).ToString());
						db.Echarones.Add(echarones);
				}              
                }
			    
				db.SaveChanges();

		  ///删除上传的表格文件
				System.IO.File.Delete(savePath);
				 
				return RedirectToAction("Import", "Echarones");


			}


			return View();
		}

  

 经测试,完全正确。

 

posted @ 2017-06-17 20:04  秋天来了哟  阅读(474)  评论(0编辑  收藏  举报
认识就是缘份,愿天下人都快乐!
QQ: 32316131
Email: 32316131@qq.com