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();
}
经测试,完全正确。

浙公网安备 33010602011771号