mvc5+ef+ adminlte教程16-1:两张表进行汇总、对比分析(以欠费清单管理为例
我感觉有时用得很多的是两张表的比对。
比如表1,XX,XXX,XXX几个人的数据清单。
表2,是另一个时间段的清单,
对比两张表的金额变化减少有多少,
对比两张表数量减少有多少。
就是包含 和不包含 。
两个表都需要手动导入。
一、在Model下新建两个模型。Arrearsone和Arrearstwo,
两个的内容和字段全部一样。
[Display(Name = "ID")]
public string Id { get; set; }
[Display(Name = "序号")]
public int SerialNumber{ get; set; }
[Display(Name = "用户名")]
public string UserName { get; set; }
[Display(Name = "号码")]
public string Number { get; set; }
[Display(Name = "账号ID")]
public string AccountId { get; set; }
[Display(Name = "联系电话")]
public string ContactNumber{ get; set; }
[Display(Name = "产品")]
public string Product { get; set; }
[Display(Name = "套餐")]
public string Package { get; set; }
[Display(Name = "金额")]
public double AmountMoney{ get; set; }
[Display(Name = "账龄")]
public int Aging { get; set; }
[Display(Name = "地址")]
public string Address { get; set; }
[Display(Name = "付费类型")]
public string PayType { get; set; }
[Display(Name = "责任部门")]
public string ResponsibleDePart { get; set; }
[Display(Name = "责任人")]
public string ResponsiblePeople { get; set; }
[Display(Name = "备注")]
public string Bei { get; set; }
然后在DAL下面的上下文中增加内容
public DbSet<Arrears2> Arrears2s { get; set; }
public DbSet<Arrears1> Arrears1s { get; set; }
记得要生成解决方案哟。然后first code.
(1)Enable-Migrations
(2)Enable-Migrations -ContextTypeName jsdhh2.DAL.OaDALContent
(3)update-database :注意下面的表的名字不是这个NewArrearones,NewArrearTwos

2.为了方便,我直接生成了NewArrearones的控制器。 下面图中的MODEL也是错的,当时删除了这个重新建 的。

3.修改index()界面,增加两个导入按钮,分别用于导入NewArrearones和NewArreartwos
下面的代码没有帖,因为暂时只用上导入,分析是否超级用户,这个功能用得多,所以用户管理中,必须有一个角色是Super,有点累,但为了学习方便。
@if (Session["role"].ToString()=="Super") { @Html.ActionLink("导入Arrears1", "ImportArrears", "", new { @class = "btn btn-success" })
}
4.新建 ImportArrears方法和视图
//导入的界面操作
public ActionResult ImportArrears()
{
return View();
}
5.新建视图,主要有二个导入。
在这一步的时候,有高手建议ID用string类型,用GUID来生成,因我一直用INT,会导致主键 不停的增加。
我改了上面的id为string,所以不会。我搞了几个小时。唉。
<h2>请选择相应的导入</h2>
<div class="col-md-12">
<div class="nav-tabs-custom">
<ul class="nav nav-tabs">
<li class=""><a href="#activity" data-toggle="tab" aria-expanded="false">导入Arrears1</a></li>
<li class="active"><a href="#timeline" data-toggle="tab" aria-expanded="true">导入Arrears2</a></li>
<li class=""><a href="#settings" data-toggle="tab" aria-expanded="false">模板下载</a></li>
</ul>
<div class="tab-content">
<div class="tab-pane" id="activity">
@using (Html.BeginForm("LeadingOne", "NewArrearones", 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">上传1</button>
<button type="reset" class="btn btn-default">清除</button>
}
</div>
<!-- /.tab-pane -->
<div class="tab-pane active" id="timeline">
<!-- The timeline -->
@using (Html.BeginForm("LeadingTwo", "NewArrearones", FormMethod.Post, new { enctype = "multipart/form-data", id = "form_Upload" }))
{
@Html.AntiForgeryToken() //防止跨站请求伪造(CSRF:Cross-site request forgery)攻击
<input id="input-42" name="input41[]" type="file" multiple class="file-loading">
<hr>
<button type="submit" class="btn btn-primary">上传2</button>
<button type="reset" class="btn btn-default">清除</button>
}
</div>
<!-- /.tab-pane -->
<div class="tab-pane" id="settings">
<a href="~/Content/Excle/mp-arrearsone.xls">Arrears1表格下载</a>
</div>
<!-- /.tab-pane -->
</div>
<!-- /.tab-content -->
</div>
<!-- /.nav-tabs-custom -->
</div>
@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>
<script>
$(document).on('ready', function () {
$("#input-42").fileinput({
maxFileCount: 10,
maxFileSize: 1000,
allowedPreviewTypes: ['other'],
allowedFileExtensions: ['xlsx', 'xls']
});
});
</script>
}
效果:滑动门效果。

6.导入的两个方法
测试全部正常。
//导入Arrears1的方法
public ActionResult LeadingOne()
{
//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<NewArrearone> xx = db.NewArrearones.ToList();
db.NewArrearones.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);
if (row != null)
{
//for (int j = row.FirstCellNum; j < cellCount; j++)
//{
// if (row.GetCell(j) != null)
// dataRow[j] = GetCellValue(row.GetCell(j));
//}
NewArrearone arrears1 = new NewArrearone();
arrears1.Id = Guid.NewGuid().ToString();
arrears1.SerialNumber = Convert.ToInt32(row.GetCell(0).ToString());
arrears1.UserName = row.GetCell(1).ToString();
arrears1.Number = row.GetCell(2).ToString();
arrears1.AccountId = row.GetCell(3).ToString();
arrears1.ContactNumber = row.GetCell(4).ToString();
arrears1.Product = row.GetCell(5).ToString();
arrears1.Package = row.GetCell(6).ToString();
arrears1.AmountMoney = Convert.ToDouble(row.GetCell(7).ToString());
arrears1.TotalMoney = Convert.ToDouble(row.GetCell(8).ToString());
arrears1.Aging = Convert.ToInt32(row.GetCell(9).ToString());
arrears1.Address = row.GetCell(10).ToString();
arrears1.PayType = row.GetCell(11).ToString();
arrears1.ResponsibleDePart = row.GetCell(12).ToString();
arrears1.ResponsiblePeople = row.GetCell(13).ToString();
arrears1.Bei = row.GetCell(14).ToString();
db.NewArrearones.Add(arrears1);
}
}
db.SaveChanges();
//删除上传的文件
System.IO.File.Delete(savePath);
return RedirectToAction("Index", "NewArrearones");
}
return View();
}
// //导入Arrears2的方法
public ActionResult LeadingTwo()
{
//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<NewArreartwo> xx = db.NewArreartwos.ToList();
db.NewArreartwos.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);
if (row != null)
{
//for (int j = row.FirstCellNum; j < cellCount; j++)
//{
// if (row.GetCell(j) != null)
// dataRow[j] = GetCellValue(row.GetCell(j));
//}
NewArreartwo arrears1 = new NewArreartwo();
arrears1.Id = Guid.NewGuid().ToString();
arrears1.SerialNumber = Convert.ToInt32(row.GetCell(0).ToString());
arrears1.UserName = row.GetCell(1).ToString();
arrears1.Number = row.GetCell(2).ToString();
arrears1.AccountId = row.GetCell(3).ToString();
arrears1.ContactNumber = row.GetCell(4).ToString();
arrears1.Product = row.GetCell(5).ToString();
arrears1.Package = row.GetCell(6).ToString();
arrears1.AmountMoney = Convert.ToDouble(row.GetCell(7).ToString());
arrears1.TotalMoney = Convert.ToDouble(row.GetCell(8).ToString());
arrears1.Aging = Convert.ToInt32(row.GetCell(9).ToString());
arrears1.Address = row.GetCell(10).ToString();
arrears1.PayType = row.GetCell(11).ToString();
arrears1.ResponsibleDePart = row.GetCell(12).ToString();
arrears1.ResponsiblePeople = row.GetCell(13).ToString();
arrears1.Bei = row.GetCell(14).ToString();
db.NewArreartwos.Add(arrears1);
}
}
db.SaveChanges();
//删除上传的文件
System.IO.File.Delete(savePath);
return RedirectToAction("Index", "NewArrearones");
}
return View();
}
7.我想在这个页面,显示汇总信息,要是点哪一个汇总的链接,他就跑到另一个社图。ArreasList
// GET: 欠费用户清单
public async Task<ActionResult> ArreasList()
{
return View(await db.NewArrearones.ToListAsync());
}
8.添加视图,暂不增加方法。
9.在index页面,增加两个按钮,已前期加了的,一个是导出所有的月初总数据,一个导出最新的欠费数
但最新的这个需要和总表比对,原因很简单,只有月初分配任务,后期只有表中数作比较。
@Html.ActionLink("导出月初数Excle", "ToExlceArrearone", "", new { @class = "btn btn-primary" }) @Html.ActionLink("导出最新数Excle", "ToExlceArreartwo", "", new { @class = "btn btn-warning" })
@if (Session["role"].ToString() == "Super")
{ @Html.ActionLink("导入Arrears1", "ImportArrears", "", new { @class = "btn btn-success" })
}
两个方法
//导出的方法Npoi
public FileResult ToExlceArrearone()
{
//创建Excel文件的对象
HSSFWorkbook book = new HSSFWorkbook();
//添加一个sheet
ISheet sheet1 = book.CreateSheet("Sheet1");
//获取list数据,这里直接获取所有的newarreasones表中数据
List<NewArrearone> listRainInfo = db.NewArrearones.ToList();
//给sheet1添加第一行的头部标题
NPOI.SS.UserModel.IRow row1 = sheet1.CreateRow(0);
//从第2列开始写,第一列是guid.ID
row1.CreateCell(1).SetCellValue("序号");
row1.CreateCell(2).SetCellValue("用户名");
row1.CreateCell(3).SetCellValue("号码");
row1.CreateCell(4).SetCellValue("账号ID");
row1.CreateCell(5).SetCellValue("联系电话");
row1.CreateCell(6).SetCellValue("产品");
row1.CreateCell(7).SetCellValue("套餐");
row1.CreateCell(8).SetCellValue("当月金额");
row1.CreateCell(9).SetCellValue("总金额");
row1.CreateCell(10).SetCellValue("账龄");
row1.CreateCell(11).SetCellValue("地址");
row1.CreateCell(12).SetCellValue("付费类型");
row1.CreateCell(13).SetCellValue("责任部门");
row1.CreateCell(14).SetCellValue("责任人");
row1.CreateCell(15).SetCellValue("备注哟");
//将数据逐步写入sheet1各个行
for (int i = 0; i < listRainInfo.Count; i++)
{
NPOI.SS.UserModel.IRow rowtemp = sheet1.CreateRow(i + 1);
//也从第二列开始写
rowtemp.CreateCell(1).SetCellValue(listRainInfo[i].SerialNumber.ToString());
rowtemp.CreateCell(2).SetCellValue(listRainInfo[i].UserName.ToString());
rowtemp.CreateCell(3).SetCellValue(listRainInfo[i].Number.ToString());
rowtemp.CreateCell(4).SetCellValue(listRainInfo[i].AccountId.ToString());
rowtemp.CreateCell(5).SetCellValue(listRainInfo[i].ContactNumber.ToString());
rowtemp.CreateCell(6).SetCellValue(listRainInfo[i].Product.ToString());
rowtemp.CreateCell(7).SetCellValue(listRainInfo[i].Package.ToString());
rowtemp.CreateCell(8).SetCellValue(listRainInfo[i].AmountMoney);
rowtemp.CreateCell(9).SetCellValue(listRainInfo[i].TotalMoney);
rowtemp.CreateCell(10).SetCellValue(listRainInfo[i].Aging);
rowtemp.CreateCell(11).SetCellValue(listRainInfo[i].Address.ToString());
rowtemp.CreateCell(12).SetCellValue(listRainInfo[i].PayType.ToString());
rowtemp.CreateCell(13).SetCellValue(listRainInfo[i].ResponsibleDePart.ToString());
rowtemp.CreateCell(14).SetCellValue(listRainInfo[i].ResponsiblePeople.ToString());
rowtemp.CreateCell(15).SetCellValue(listRainInfo[i].Bei.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");
}
//导出的方法Npoi
public FileResult ToExlceArreartwo()
{
//创建Excel文件的对象
HSSFWorkbook book = new HSSFWorkbook();
//添加一个sheet
ISheet sheet1 = book.CreateSheet("Sheet1");
//获取list数据,因是最新欠费表,可能需要关联责任人与责任部门,主要原因是只有月初才分配清单。以后只是对比,所以字段全是表1。
var bijiao = (from m in db.NewArrearones
join mr in db.NewArreartwos
on m.Number equals mr.Number
select m).ToList();
List<NewArrearone> listRainInfo = bijiao;
//给sheet1添加第一行的头部标题
NPOI.SS.UserModel.IRow row1 = sheet1.CreateRow(0);
//从第2列开始写,第一列是guid.ID
row1.CreateCell(1).SetCellValue("序号");
row1.CreateCell(2).SetCellValue("用户名");
row1.CreateCell(3).SetCellValue("号码");
row1.CreateCell(4).SetCellValue("账号ID");
row1.CreateCell(5).SetCellValue("联系电话");
row1.CreateCell(6).SetCellValue("产品");
row1.CreateCell(7).SetCellValue("套餐");
row1.CreateCell(8).SetCellValue("当月金额");
row1.CreateCell(9).SetCellValue("总金额");
row1.CreateCell(10).SetCellValue("账龄");
row1.CreateCell(11).SetCellValue("地址");
row1.CreateCell(12).SetCellValue("付费类型");
row1.CreateCell(13).SetCellValue("责任部门");
row1.CreateCell(14).SetCellValue("责任人");
row1.CreateCell(15).SetCellValue("备注哟");
//将数据逐步写入sheet1各个行
for (int i = 0; i < listRainInfo.Count; i++)
{
NPOI.SS.UserModel.IRow rowtemp = sheet1.CreateRow(i + 1);
//也从第二列开始写
rowtemp.CreateCell(1).SetCellValue(listRainInfo[i].SerialNumber.ToString());
rowtemp.CreateCell(2).SetCellValue(listRainInfo[i].UserName.ToString());
rowtemp.CreateCell(3).SetCellValue(listRainInfo[i].Number.ToString());
rowtemp.CreateCell(4).SetCellValue(listRainInfo[i].AccountId.ToString());
rowtemp.CreateCell(5).SetCellValue(listRainInfo[i].ContactNumber.ToString());
rowtemp.CreateCell(6).SetCellValue(listRainInfo[i].Product.ToString());
rowtemp.CreateCell(7).SetCellValue(listRainInfo[i].Package.ToString());
rowtemp.CreateCell(8).SetCellValue(listRainInfo[i].AmountMoney);
rowtemp.CreateCell(9).SetCellValue(listRainInfo[i].TotalMoney);
rowtemp.CreateCell(10).SetCellValue(listRainInfo[i].Aging);
rowtemp.CreateCell(11).SetCellValue(listRainInfo[i].Address.ToString());
rowtemp.CreateCell(12).SetCellValue(listRainInfo[i].PayType.ToString());
rowtemp.CreateCell(13).SetCellValue(listRainInfo[i].ResponsibleDePart.ToString());
rowtemp.CreateCell(14).SetCellValue(listRainInfo[i].ResponsiblePeople.ToString());
rowtemp.CreateCell(15).SetCellValue(listRainInfo[i].Bei.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");
}
测试正常。
未完请看下一章。
浙公网安备 33010602011771号