WHY?为什么要有导入数据?
我觉得,这个问题,完全就是个摆设。。不过还是保持套路的一致性吧。。
导入,我认为依旧是站在用户体验度的角度去思考问题,当用户要往系统里面输入用户信息等时候,面对几百来条数据,让他一个一个往里面输入,无疑让他剁手,面对这样的程序,人们往往望都不望,所以,为了系统的访问量,还是做一个导入吧,导入还是很简单的,请看下面的demo
HOW?如何做导入功能?
请看demo:
下面是我做的一个界面:
点击导入按钮会让下载模板,并且填写要导入的信息,上传文件,导入到数据库中。效果如图:
代码实现:
html:
<script src="../../JS/import.js"></script>
<h2>导入功能demo
这是导入按钮:<input id="import" type="button" value="导入" οnclick="showImportFrm()"/></h2>
<div>
<table id="dg">
</table>
</div>
<div id="importDiv" style="display: none;">
<form id="frmimport" action="/frmInquireGrade/ImportFlowBatch" method="post" enctype="multipart/form-data" style="text-align:center;" >
<div style="margin-bottom: 50px"></div>
<div style="margin-bottom: 40px">
<span>提示:导入前请先下载EXCEL模板 </span><a class="btn-lit" >
<a href="../../Excel/要导入的信息.xlsx"><div style="color:blue ">点击我下载</div></a>
</div>
<div style="margin-bottom: 40px">
<input id="FileUpload" type="file" name="files" data-options="prompt:'Choose a file...'" />
</div>
</form>
</div>
其中,可以在文件中增加自己想让用户下载的模板:
需要注意的是:
模板中的字段要和数据库中的字段一致,否则会报错。
js:
$(function () {
initTable();
});
//界面的初始化显示
window.onload = function load() {
//给表格绑定数据
$('#dg').datagrid({
url: '/frmManageUser/QueryUser',
width: "100%",
striped: true, //行背景交换
fitColumns: false,
idField: 'AssignmentID',
loadMsg: '正在加载用户的信息...',
pagination: true,
singleSelect: false,
pageList: [10, 20, 30, 40, 50],
pageSize: 20,
pageNumber: 1,
queryParams: {
searchName: $("#searchName").val()
},
columns: [[
{ field: 'ck', checkbox: true, align: 'left', width: 50 },
{ field: 'UserId', title: '姓名', width: 500, hidden: true },
{ field: 'UserName', title: '年级', width: 50, editor: 'text' },
{ field: 'PassWord', title: '班级', width: 50, editor: 'text' },
{ field: 'TeamNum', title: '性别', width: 50, editor: 'text' },
]]
});
}
//导入弹出框
function showImportFrm() {
$("#importDiv").css("display", "block");
$("#importDiv").dialog({
width: 400,
height: 200,
title: "批量导入",
buttons: [{
id: 'btnAdd',
text: '添加',
iconCls: 'icon-add',
handler: function () {
doImport();
}
}, {
id: 'btnCancelAdd',
text: '取消',
iconCls: 'icon-cancel',
handler: function () {
$("#importDiv").dialog("close");
}
}]
});
}
//导入功能的js
function doImport() {
var file = ($("#FileUpload").val());
if (file == "") {
$.messager.alert('系统提示', '请选择将要上传的文件!');
return;
} else {
var stuff = file.match(/^(.*)(\.)(.{1,8})$/)[3];
if (stuff != 'xls') {
$.messager.alert('警告', '文件类型不正确,请选择.xls文件!', 'warning');
return;
} else {
$('#frmimport').form('submit', {
url: "/import/ImportFlowBatch",
onSubmit: function () { },
success: function (data) {
if (data = 'true') {
$.messager.show({
title: '提示消息',
msg: '提交成功',
showType: 'show',
});
$('#dg').datagrid('reload'); // 重新载入当前页面数据
$('#importDiv').window('close'); //关闭窗口
}
}
});
}
}
}
controller:
#region 批量导入+ public bool ImportFlowBatch()
/// <summary>
/// 批量导入流程
/// </summary>
/// <returns></returns>
public bool ImportFlowBatch()
//public JsonResult ImportFlowBatch()
{
DataTable table = new DataTable();
HttpPostedFileBase file = Request.Files["files"];
string strFileName;
string strSavePath = "";
string ClientPath = AppDomain.CurrentDomain.BaseDirectory + "ExcelFile\\UploadFile\\";
string strPaperId = "sheet1";
if (file == null || file.ContentLength <= 0)
{
ViewBag.error = "文件不能为空";
return false;
//return Json(ViewBag);
}
else
{
string strFilename = Path.GetFileName(file.FileName);
int intFilesize = file.ContentLength; //获取上传文件的大小(单位是字节)
string fileEx = System.IO.Path.GetExtension(strFilename); //获取上传文件的扩张名
string strNoFileName = System.IO.Path.GetFileNameWithoutExtension(strFilename);//获取上传文件的无扩张名
int Maxsize = 4000 * 1024;//定义上传文件的最大空间大小为4M
string FileType = ".xls,.xlsx"; //定义上传文件类型
strFileName = strNoFileName + DateTime.Now.ToString("yyyyMMddhhmmss") + fileEx;
if (!FileType.Contains(fileEx))
{
ViewBag.error = "文件类型不对,只能导入xls和xlsx格式的文件";
}
if (intFilesize >= Maxsize)
{
ViewBag.error = "上传文件超过4M,不能上传";
}
//需要引用system.IO.
strSavePath = Path.Combine(ClientPath, strFileName);
file.SaveAs(strSavePath);
}
ManageUserBLL bll = new ManageUserBLL();
table = bll.ExcelToDataTable(strSavePath, strPaperId);
//注意,如果某一列需要动态的生成guid的话,可以用下面已经注释的代码写
//table.Columns.Add("RoomID", typeof(string));
table.Columns["期数"].ColumnName = "teamNum";
table.Columns["姓名"].ColumnName = "userName";
table.Columns["权限"].ColumnName = "authority";
//int roomNum=table.Columns.Count;
//for (int i = 0; i < table.Rows.Count; i++) {
// //*******动态添加Guid********
// Guid roomGuid = Guid.NewGuid();
// table.Rows[i]["RoomID"] = roomGuid.ToString();
// //*************************
// //替换
// //1、通过汉字查出对应的guid(房间类型、建筑类型)
// string buildingname = table.Rows[i]["BuildingID"].ToString();
// //根据buildingname查询出对应的buildingid
// buildingname = buildingBll.QueryBuildingIDByName(buildingname); //得到查询的房间信息
// //table.Rows[i]["BuildingID"]=listReturnRoom
// table.Rows[i]["BuildingID"] = buildingname;
// string roomtype = table.Rows[i]["TypeID"].ToString();
// //2、替换
// roomtype = roomTypeBll.QueryRoomTypeIDByName(roomtype);
// table.Rows[i]["TypeID"] = roomtype;
//}
//连接数据库
//MySqlHelper mysqlHelper = new MySqlHelper("server=192.168.22.238;userid=root;password=123;database=basicentity;Character Set=utf8;");
//需要引用using System.Configuration;
//string connStr = ConfigurationManager.ConnectionStrings["connStr"].ConnectionString;
//MySqlHelper mysqlHelper = new MySqlHelper(connStr);
//批量导入数据
int res= MySQLHelper.BulkInsert(table);
if (res > 0)
{
return true;
}
else {
return false;
}
}
#endregion
BLL:
#region +datatabl --ExcelToDataTable-Elsa-2017年1月8日
public DataTable ExcelToDataTable(string strSavePath, string strSheetName)
{
string strConn;
string strFileType = System.IO.Path.GetExtension(strSavePath);
if (string.IsNullOrEmpty(strFileType)) return null;
if (strFileType == ".xls")
strConn = "Provider=Microsoft.Jet.OLEDB.4.0;" + "Data Source=" + strSavePath + ";" + ";Extended Properties=\"Excel 8.0;HDR=YES;IMEX=1\"";
else
strConn = "Provider=Microsoft.ACE.OLEDB.12.0;" + "Data Source=" + strSavePath + ";" + ";Extended Properties=\"Excel 12.0;HDR=YES;IMEX=1\"";
OleDbConnection conn = new OleDbConnection(strConn);
conn.Open();
OleDbDataAdapter myCommand = new OleDbDataAdapter("select * from [" + strSheetName + "$]", strConn);
DataSet myDataSet = new DataSet();
try
{
myCommand.Fill(myDataSet, "t_user");
}
catch
{
throw new Exception("配置文件的Sheet名称配置错误!");
}
finally
{
if (conn.State == ConnectionState.Open)
{
conn.Close();
myCommand.Dispose();
conn.Dispose();
}
}
DataTable table = myDataSet.Tables["t_user"].DefaultView.ToTable();
return table;
}
#endregion
小结:
在做导入的过程中,遇到了很多问题,尤其是数据库字段和模板中的字段不对应的问题,还有数据的可用性问题,比如类型的错误等,不过,正是因为这些错误,才能让人成长,在实践的过程中,不要慌,保持一个良好的心态去做,不急功近,如果做不出来,可以先休息一下,之后效率会更高。