MVC4.0 上传Excel并存入数据库
这里的这个功能实现在WebForm很好实现,上传阶段简单的一个FileUoLoad控件就搞定了,什么取值,什么上传都是浮云,微软都帮我们封装好了,我们只需要一拖一拽就OK了,但这些在MVC中是不行的!
MVC实现了显示和控制的分离就不可能再使用服务端控件了,所以我们就又回到了原始的表单提交,AJAX异步提交数据什么的,不多说直接上代码,简单的写一下
View:
<form id="form" name="form" enctype="multipart/form-data" method="post" action="/DataInfoAndCal/Cal">
<input type="file" name="fileName" />
<input name="info" type="submit" value="导 入" class="bt_bg" />
</form>
在控制器中接受选中的文件 可以这样子: HttpPostedFileBase fb = Request.Files[0];
string fileName = fb.FileName; //获取到文件名 xx.xls
fb.SaveAs(Server.MapPath("~/App_Data/Excel/Model.xls"));
判断什么的都是浮云就不写上去了
好了上传成功,注意 <input type="file" name="fileName" />这个标签使用 HttpPostedFileBase fb = Request.Files[0];在Chome浏览器下只能够获得文件名称而不能够获得完整路径 这个问题还没解决
好的下一步将Excel转换为DataSet数据集,这个在这里就好WebForm没什么区别了 直接上代码
DataSet dsCal = new DataSet();
dsCal = GetDataSet(fb.FileName);
//下面是方法
#region EXCEL数据转换DataSet
/// <summary>
/// EXCEL数据转换DataSet
/// </summary>
/// <param name="filePath">文件路径</param>
/// <param name="search">表名</param>
/// <returns></returns>
protected DataSet GetDataSet(string filePath)
{
string strConn = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + Server.MapPath("~/App_Data/Excel/Model.xls") + ";Extended Properties='Excel 12.0;HDR=Yes;IMEX=1';";
OleDbConnection objConn = null;
objConn = new OleDbConnection(strConn);
objConn.Open();
DataSet ds = new DataSet();
List<string> List = new List<string> { };
DataTable dtSheetName = objConn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, new object[] { null, null, null, "TABLE" });
foreach (DataRow dr in dtSheetName.Rows)
{
if (dr["Table_Name"].ToString().Contains("$") && !dr[2].ToString().EndsWith("$"))
{
continue;
}
string s = dr["Table_Name"].ToString();
List.Add(s);
}
try
{
for (int i = 0; i < List.Count; i++)
{
ds.Tables.Add(List[i]);
string SheetName = List[i];
string strSql = "select * from [" + SheetName + "]";
OleDbDataAdapter odbcCSVDataAdapter = new OleDbDataAdapter(strSql, objConn);
DataTable dt = ds.Tables[i];
odbcCSVDataAdapter.Fill(dt);
}
objConn.Close();
return ds;
}
catch (Exception ex)
{
return null;
}
}
#endregion
这里面注意取到的Excel的表名的集合可能会有不是$结束的,这是由Excel内部处理导致的 直接筛选下就OK了
顺利的完成Excel的导入上转换 存入数据库等做完再写
番外话:毕业一年来第一次在博客园里面写东西,感觉记录下成长的脚印是件很开心的事情