数据导入计算

数据的重要意义就不需要我多说了吧,本项目中的数据来源是来自荆艺系统(熟悉物流报关的朋友应该知道)导出的一张Excel,包含了一段时间内整个公司所有销售的全部记录,保密级别那是杠杠的,下面开搞!!

首先在Controllers文件夹下面添加一个控制器 命名DataInfoAndCalController.cs 在他默认action上面右击添加视图,就会在Views文件夹下面创建对应的视图,这样可以避免拼写错误。

这个View个页面很简单,引用了”_Layout.cshtml“页面后只有两个选择年月的下拉框,一个文件域,两个按钮,一个导入一个计算,剩下的就是处理了

数据提交部分给大家参考下

<form onsubmit="return funs();" enctype="multipart/form-data" method="post" action="/DataInfoAndCal/index/">
<div class="table_box">
<table cellpadding="" cellspacing="" border="" style="padding: 10px;" width="100%">
<tr>
<td width="40%" height="" align="right" style="font-size: 14px;">选择导入月份:</td>
<td height="" width="60%"> <select id="selYear" name="selYear" class="input_xz">
<option value=""></option>
<option value="" selected="selected"></option>
<option value=""></option>
</select>
<select id="selMon" name="selMon" class="input_xz">
<option value=""></option>
<option value=""></option>
<option value=""></option>
<option value=""></option>
<option value=""></option>
<option value=""></option>
<option value=""></option>
<option value=""></option>
<option value=""></option>
<option value=""></option>
<option value=""></option>
<option value=""></option>
</select>
</td>
</tr>
<tr>
<td height="" align="right" style="font-size: 14px;">选择导入文件:</td>
<td>
<input id="fileName" type="file" name="fileName" />
</td>
</tr>
<tr>
<td></td>
<td height=""> <input id="info" type="submit" value="导&nbsp;&nbsp;入" class="bt_bg" />&nbsp;&nbsp;
<input id="cal" type="button" value="计&nbsp;&nbsp;算" class="bt_bg" />
</td>
</tr>
</table>
</div>
</form>

数据导入 --View

  function funs() {
var msg = $("#selYear option:selected").val() + '年' + $("#selMon option:selected").val() + '月';
if (confirm("确定要导入'" + msg + "'的数据吗?")) {
return true;
}
return false;
}

JS funs

下面来看Index视图,注意一点 <from>表单里面的html元素的值可以通过相同的id接受到这个标签的Value值,所以我的导入的action

 [HttpPost]
public ActionResult index(string selYear, string selMon)
{
date = selYear + selMon;
GlobalValue.CurrentDate = date;
HttpPostedFileBase fb = Request.Files[];
string fileName = fb.FileName; //获取到文件名 xx.xls
if (!string.IsNullOrEmpty(fileName))
{
string extenSion = Path.GetExtension(fileName); //文件后缀 .xls
if (extenSion.Equals(".xls") || extenSion.Equals(".xlsx"))
{
string suffix = ConfigurationManager.AppSettings["FileNameSuffix"].ToString();
string ExcelName = date + suffix + extenSion;
//一:上传服务器
string pathEndName = string.Empty;
string savePath = string.Empty;
try
{
savePath = ConfigurationManager.AppSettings["FilePath"].ToString();
if (!Directory.Exists(savePath))
{
Directory.CreateDirectory(savePath);
}
//确定要写入的xls文件是否存在 不存在则复制并重新命名
string pathStart = Server.MapPath(@"~/ResourceData/Model.xls");
savePath += "\\" + ExcelName;
try
{
System.IO.File.Copy(pathStart, savePath, true); }
catch (Exception ex)
{
throw ex;
} //将文件流写入指定的文件
fb.SaveAs(savePath);
pathEndName = savePath;
}
catch (Exception ex)
{
throw ex;
} //二:将Excel表格转换为DadaSet数据集
dsCal = GetDataSet(pathEndName);
//将五张基本表存入数据库中
if (FillDataToDB(date, savePath))
{
ViewBag.returnMsg = "数据导入成功!请计算";
}
else
{
ViewBag.returnMsg = "请确认导入Excel表格格式是否规范!";
}
}
else
{
ViewBag.returnMsg = "请选择Excel文件!";
}
}
else
{
ViewBag.returnMsg = "您还没有没有选择要导入的Excel文件!";
} return View();
}

数据导入 Action

具体的 导入方法和逻辑在这里就不再写了,因为以后还要提供下载的功能,所以这里把这个Excel文件上传到了服务器上面了,因为数据两比较大,开始我是考虑的是用Linq To Sql 入库的,但是处理大批量的数据貌似不是很给力,所以最后选择了SqlBulkCopy来批量导入,效率还是不错的,我测过了,过万的数据只要两秒多点,要知道这可是导入金的不同的数据表的,把这一段贴出来鉴赏下

 #region 统一将DataSet中的数据存入数据库
private bool DataSetToDB()
{
bool isSuc = false;
using (SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["GM360_RewardContext"].ToString()))
{
if (conn.State == ConnectionState.Closed)
{
conn.Open();
}
SqlTransaction tran = conn.BeginTransaction();
//同月份是否有数据 有数据则删除
DeleteSameMonthData(date);
SqlBulkCopy sbKc = null;
try
{
for (int i = ; i < dsDate.Tables.Count; i++)
{
sbKc = new SqlBulkCopy(conn, SqlBulkCopyOptions.Default, tran); sbKc.BatchSize = ;
sbKc.DestinationTableName = dsDate.Tables[i].TableName;
if (dsDate.Tables[i].TableName == "AdvanceExtendFees")
{
sbKc.DestinationTableName = "AdvanceExtendFee";
}
int count = dsDate.Tables[i].Columns.Count;
for (int k = ; k < count; k++)
{
sbKc.ColumnMappings.Add(k, k);
}
sbKc.WriteToServer(dsDate.Tables[i]);
}
isSuc = true;
tran.Commit();
}
catch (Exception ex)
{
isSuc = false;
tran.Rollback();
}
finally
{
conn.Dispose();
conn.Close();
}
}
return isSuc;
}
#endregion

批量入库

这里要操作的是一个DataSet,放进了内存里面了 ,所以不用想这个方法里面传参了,删除同月数据是写了个存储过程,运用了EF的Linq To SQL 做删除效率还是蛮可以的。好了数据成功入库

由于这里是Post提交过来的文件,所以有几点需要注意 <form>标签要添加 ” enctype="multipart/form-data" “属性数据才不会乱码,返回页面的时候刷新了页面会造成页面年月重新加载丢失导入条件,所以在这里添加两句

  ViewBag.selYear = (selYear == "") ? "" : selYear;
ViewBag.selMon = (selMon == "") ? "" : selMon;

View页面的最底部添加

  <script type="text/javascript">
var yearReturn = '@ViewBag.selYear';
if (yearReturn != null && yearReturn != '') {
$("#selYear option[value='" + yearReturn + "']").attr("selected", true);
}
else {
var year = '@ViewBag.year';
$("#selYear option[value='" + year + "']").attr("selected", true);
} var monthReturn = '@ViewBag.selMon';
if (monthReturn != null && monthReturn != '') {
$("#selMon option[value='" + monthReturn + "']").attr("selected", true);
}
else {
var month = '@ViewBag.month';
$("#selMon option[value='" + month + "']").attr("selected", true);
}
</script>

这里ViewBag.year 和 ViewBag.month是开始加载页面初始化的,而另外两个则是记录查询条件的

数据导入到这里也算告一段落了 计算要说的比这个还要多就留下下一篇里面说吧,篇幅实在是有限,所以就写了部分我觉得比较核心的,还是不错的哈哈

MVC4.0系统开发新手历程(三)---数据导入计算的更多相关文章

  1. MVC4.0系统开发新手历程1

    MVC4.0系统开发新手历程(一) 接手了一个简单的销售奖金计算的项目,虽然不算大但是业务逻辑比较复杂,还夹杂了很多的特殊情况,毕竟是大公司什么样的人都有,好了不多说切入正题,项目是公司的一个前辈负责 ...

  2. MVC4.0系统开发新手历程(一)

    接手了一个简单的销售奖金计算的项目,虽然不算大但是业务逻辑比较复杂,还夹杂了很多的特殊情况,毕竟是大公司什么样的人都有,好了不多说切入正题,项目是公司的一个前辈负责的,在他做系统架构的时候让我们了解下 ...

  3. MVC4.0系统开发新手历程(四)数据列表查询

    任何系统都不可避免的就是数据的查询展示,我觉得这里最值得一说的就是分部视图以及数据分页了 首先添加控制器 在控制其上面的名字为Index的Action上面右击,添加视图即可添加对应的视图,分部视图呈现 ...

  4. MVC4.0系统开发新手历程(二)

    登录页 首先声明登录页不是我开发完成的 所以就简单的发下供大家参考 思路:由于是奖金系统,里面涉及到Money,所以在验证方面上下了很大的功夫,我看了下 主要的思想是 获取到那几个人会用到这个系统,然 ...

  5. 15、Cocos2dx 3.0游戏开发找小三之Sprite:每一个精灵都是上辈子折翼的天使

    重开发人员的劳动成果,转载的时候请务必注明出处:http://blog.csdn.net/haomengzhu/article/details/30475395 Sprite  Sprite 能够说是 ...

  6. 13、Cocos2dx 3.0游戏开发找小三之3.0中的Director :郝萌主,一统江湖

    重开发人员的劳动成果.转载的时候请务必注明出处:http://blog.csdn.net/haomengzhu/article/details/27706967 游戏中的基本元素 在曾经文章中.我们具 ...

  7. 18、Cocos2dx 3.0游戏开发找小三之cocos2d-x,请问你是怎么调度的咩

    重开发人员的劳动成果,转载的时候请务必注明出处:http://blog.csdn.net/haomengzhu/article/details/30478251 Cocos2d 的一大特色就是提供了事 ...

  8. 4、Cocos2dx 3.0游戏开发找小三之Hello World 分析

    尊重开发人员的劳动成果.转载的时候请务必注明出处:http://blog.csdn.net/haomengzhu/article/details/27186557 Hello World 分析 打开新 ...

  9. 22、Cocos2dx 3.0游戏开发找小三之音乐与音效:假如世界上没有了音乐,你的耳朵会孤单吗?

    重开发人员的劳动成果,转载的时候请务必注明出处:http://blog.csdn.net/haomengzhu/article/details/30485103 假如世界上没有了音乐,在森林里.我们听 ...

随机推荐

  1. C#的checked和unchecked

    C#的 checked关键字用于对整型算术运算和转换显式启用溢出检查. 简单点说,我们在进行数值计算时,运算结果可能会超出该类型能表达的数值范围,因而结果溢出.而这个溢出如果是含有变量的表达式的话,编 ...

  2. POJ 2697 A Board Game (bfs模拟)

    比较水的一道题,在4*4的棋盘上有黑白子,现在有某种移动方式,问能否通过它将棋盘从某个状态移动到另一种状态 只要想好怎么保存hash表来去重,其他就差不多了... #include <iostr ...

  3. 一些使用Android设备调试功能的注意事项(挖职位)

    华为3C Activity切换动画过热. 当显示器是不是大图easy显现OOM(应用最大大于其他手机内容).因此,调试OOM不要当问题用这个手机,否则,很难发现问题. 小米3 不要调用系统的裁图功能. ...

  4. Java基础知识强化56:经典排序之快速排序(QuickSort)

    1. 快速排序的原理: 快速排序(Quicksort)是对冒泡排序的一种改进. 快速排序由C. A. R. Hoare在1962年提出.它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其 ...

  5. java设计模式---原型模式

    原型模式(Prototype):用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象. 原型模式结构图 通俗来说:原型模式就是深拷贝和浅拷贝的实现. 浅拷贝 只实现了值拷贝,对于引用对象还是 ...

  6. 监听tableview的点击事件

    // 监听tablview的点击事件 - (void)addAGesutreRecognizerForYourView { UITapGestureRecognizer *tapGesture = [ ...

  7. Mac下如何不借助第三方工具实现NTFS分区的可写挂载

    问题背景 我想很多使用Mac的同学都会遇到读写NTFS磁盘的问题,因为默认情况下Mac OSX对NTFS磁盘的挂载方式是只读(read-only)的,因此把一个NTFS格式的磁盘插入到Mac上,是只能 ...

  8. HQL查询

    HQL ,Hibernate Query Language ,是Hibernate查询语言,不直接操作数据表,而是操作实体类,根据实体类和对应数据表中的映射关系,查找数据. 下面是hql的基本步骤: ...

  9. FileGeodatabase和PersonalGeodatabase与ArcSDEGeodatabase三种数据库比较.

  10. iOS在UITableViewController里使用UISearchDisplayController报错"[UISearchResultsTableView dequeueReusableCellWithIdentifier:forIndexPath:]"

    出现如下错误: 2016-02-13 22:09:22.318 Test[2757:192106] *** Assertion failure in -[UISearchResultsTableVie ...