EXCEL批量导入数据MVC
来源:互联网 发布:雅典奥运 女排 知乎 编辑:程序博客网 时间:2024/06/04 19:44
这里简单实现EXCEL的批量导入
直接看代码,里面有注释
后台需要引用dll
这里使用了SqlBulkCopy的写入方法。注意的内容标注在region后面。
直接看代码,里面有注释
前端页面实现
@{ ViewBag.Title = "批量添加数据"; //Layout = null;} .hide { display: none; } td { height: 50px; } .input-group-addon { width: 85px; } .jFiler-item { list-style: none; } jFiler-item-title { display: none; } .jFiler-item-thumb .jFiler-item-info { display: none; } .jFiler-theme-default .jFiler-input { width: 300px; } img { width: 300px; }
using NPOI.HSSF.UserModel;//批量导入的页面Actionpublic ActionResult ExcelAppendData(){ return View();} ////// 导入Excel方法 /// 作者 刘建超:2017年10月16日17:32:11 /// ///[HttpPost] public JsonResult LeadInMethod() { HttpPostedFileBase file = Request.Files["files"]; try { string FileName; string savePath; //添加公有字段,成功后传给前台,便于提示用户:文件导入成功,不能重复导入 string fileFullName; #region 检查文件/存储文件 if (file == null || file.ContentLength <= 0) { return Json(new { result = false, message = "文件不能为空,请先浏览选择需要导入的耗材表Excel文件!" }, JsonRequestBehavior.AllowGet); } else { string filename = Path.GetFileName(file.FileName); int filesize = file.ContentLength;//获取上传文件的大小单位为字节byte string fileEx = System.IO.Path.GetExtension(filename);//获取上传文件的扩展名 string NoFileName = System.IO.Path.GetFileNameWithoutExtension(filename);//获取无扩展名的文件名 int Maxsize = 20 * 1024 * 1024;//定义上传文件的最大空间大小为20M string FileType = ".xls,.xlsx";//定义上传文件的类型字符串 FileName = NoFileName + DateTime.Now.ToString("yyyyMMddhhmmss") + fileEx; if (!FileType.Contains(fileEx)) { return Json(new { result = false, message = "文件类型不对,只能导入xls和xlsx格式的文件" }, JsonRequestBehavior.AllowGet); } if (filesize >= Maxsize) { return Json(new { result = false, message = "上传文件超过20M,不能上传" }, JsonRequestBehavior.AllowGet); } string path = AppDomain.CurrentDomain.BaseDirectory + @"\Files\Excel"; savePath = Path.Combine(path, FileName); fileFullName = filename; #region 文件保存到服务器 if (!Directory.Exists(path)) { Directory.CreateDirectory(path); } file.SaveAs(savePath); #endregion } #endregion #region 将导入的Excel转换成Table 出现问题:不同IIS会出现版本问题,这里注释改成下面的兼容性 //string strConn = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + savePath + ";" + "Extended Properties='Excel 12.0;IMEX=1'"; //OleDbConnection conn = new OleDbConnection(strConn); //conn.Open(); //OleDbDataAdapter myCommand = new OleDbDataAdapter("select * from [Sheet1$];", strConn); //DataSet myDataSet = new DataSet(); //myCommand.Fill(myDataSet, "Sheet1$"); //myCommand.Dispose(); //conn.Close(); //conn.Dispose(); ////将数据表转换成datatable //System.Data.DataTable table = myDataSet.Tables["Sheet1$"].DefaultView.ToTable(); #endregion System.Data.DataTable table = new DataTable(); if (file.FileName.Substring(file.FileName.LastIndexOf(".") + 1).ToLower() == "xlsx") { table = XlsxImport(savePath); } else { table = XlsImport(savePath); } if (table != null && table.Rows.Count > 0) { #region 判断模板正确与否 var falseNum = 0;//判断模板错误的列数 if (table.Columns.Count == 10)//判断列数是否是十个 { HM_ConsumableModel models = new HM_ConsumableModel(); //models.ConsNo = models.ConsName = models.ConsSpecification = models.ConsUnit = models.ConsPrice = models.ConsPayPrice = models.ConsSupplier; string[] TemplateTitle = { "耗材编号", "耗材名称", "耗材规格", "单位", "应售", "实售", "生产厂家", "拼音码", "五笔码", "自定义码" }; string[] TemplateTitlel = { "ConsNo", "ConsName", "ConsSpecification", "ConsUnit", "ConsPrice", "ConsPayPrice", "ConsSupplier", "PYCode", "WBCode", "CustomCode" }; for (int k = 0; k < table.Columns.Count; k++) { if (TemplateTitle[k] != table.Columns[k].ColumnName.ToString().Trim())//判断标题是否相同 { falseNum++; } else { table.Columns[k].ColumnName = TemplateTitlel[k];//更换标题 } } } else { falseNum++; } #endregion #region 数据处理 if (falseNum == 0) { #region 删除空行数据(耗材名称,耗材规格和单位都为空的时候删除此行数据) List arrayRows = new List ();//存放要删除的行 for (int i = 0; i < table.Rows.Count; i++) { if (table.Rows[i][1].ToString() == "" && table.Rows[i][2].ToString() == "" && table.Rows[i][3].ToString() == "") { arrayRows.Add(i); } } if (arrayRows.Count > 0) { for (int i = 0; i < arrayRows.Count; i++) { table.Rows.RemoveAt(i);//移除索引的行 } } #endregion var tableRowsNum = table.Rows.Count;//初始行数 table.Columns.Add("IsValid", typeof(int));//加一列:有效 table.Columns.Add("HpId", typeof(int));//加一列:医院ID table.Columns.Add("EpUid", typeof(Int64)); //加一列:企业用户ID var hpID = Convert.ToInt32(currentLogin.HpId); var epuID = currentLogin.EpUid; //var hpID = 160; //var epuID = 1; #region 给table循环添加列和列的值 for (int i = 0; i < tableRowsNum; i++) { table.Rows[i]["IsValid"] = 1; table.Rows[i]["HpId"] = hpID; table.Rows[i]["EpUid"] = epuID; } #endregion #region BulkCopy SqlBulkCopyByDatatable(DBConfig.CustomerManage.HM_Consumable, table); #endregion return Json(new { result = true, message = "成功导入" + tableRowsNum + "条数据!", fileFullName = fileFullName }, JsonRequestBehavior.AllowGet); } else { return Json(new { result = true, message = "模板错误请重新上传!" }, JsonRequestBehavior.AllowGet); } #endregion } else { return Json(new { result = false, message = "模板无数据!" }, JsonRequestBehavior.AllowGet); } } catch (Exception ex) { var values = ex.Message.ToString(); var errorMessage = ""; if (values == "列“ConsNo”不允许 DBNull.Value。") { errorMessage += "导入异常,原因是:耗材编号不能有空,请检查模板数据表!"; } else if (values == "列“ConsPrice”不允许 DBNull.Value。" || values == "列“ConsPayPrice”不允许 DBNull.Value。") { errorMessage += "导入异常,原因是:应售(或实售)不能有空,请检查模板数据表!"; } else if (values == "列“ConsSupplier”不允许 DBNull.Value。") { errorMessage += "导入异常,原因是:生产厂家不能有空,请检查模板数据表!"; } else { errorMessage += values; } return Json(new { result = false, message = errorMessage }, JsonRequestBehavior.AllowGet); } } #endregion /// 读取excel Xlsx /// 默认第一行为标头 /// /// excel文档路径 ///public static DataTable XlsxImport(string strFileName) { DataTable dt = new DataTable(); NPOI.XSSF.UserModel.XSSFWorkbook hssfworkbook; using (FileStream file = new FileStream(strFileName, FileMode.Open, FileAccess.Read)) { hssfworkbook = new NPOI.XSSF.UserModel.XSSFWorkbook(file); } var sheet = hssfworkbook.GetSheetAt(0); System.Collections.IEnumerator rows = sheet.GetRowEnumerator(); var headerRow = sheet.GetRow(0); int cellCount = headerRow.LastCellNum; for (int j = 0; j < cellCount; j++) { var cell = headerRow.GetCell(j); dt.Columns.Add(cell.ToString()); } for (int i = (sheet.FirstRowNum + 1); i <= sheet.LastRowNum; i++) { var row = sheet.GetRow(i); DataRow dataRow = dt.NewRow(); for (int j = row.FirstCellNum; j < cellCount; j++) { if (row.GetCell(j) != null) dataRow[j] = row.GetCell(j).ToString(); } dt.Rows.Add(dataRow); } return dt; } /// 读取excel Xls /// 默认第一行为标头 /// /// excel文档路径 ///public static DataTable XlsImport(string strFileName) { DataTable dt = new DataTable(); HSSFWorkbook hssfworkbook; using (FileStream file = new FileStream(strFileName, FileMode.Open, FileAccess.Read)) { hssfworkbook = new HSSFWorkbook(file); } var sheet = hssfworkbook.GetSheetAt(0); System.Collections.IEnumerator rows = sheet.GetRowEnumerator(); var headerRow = sheet.GetRow(0); int cellCount = headerRow.LastCellNum; for (int j = 0; j < cellCount; j++) { var cell = headerRow.GetCell(j); dt.Columns.Add(cell.ToString()); } for (int i = (sheet.FirstRowNum + 1); i <= sheet.LastRowNum; i++) { var row = sheet.GetRow(i); DataRow dataRow = dt.NewRow(); for (int j = row.FirstCellNum; j < cellCount; j++) { if (row.GetCell(j) != null) dataRow[j] = row.GetCell(j).ToString(); } dt.Rows.Add(dataRow); } return dt; } /// /// SqlBulkCopy批量导入数据 Attention:SqlBulkCopy中列的名称受大小写敏感限制,因此在构造DataTable的时候应请注意列名要与表一致。 /// /// 数据库目标表 /// 源数据 private void SqlBulkCopyByDatatable(string TableName, System.Data.DataTable dt) { using (var dbConnection = SqlDbHelper.CreateConnection()) { var connectionString = ConfigurationManager.ConnectionStrings["SqlConnString"].ConnectionString; using (SqlBulkCopy sqlbulkcopy = new SqlBulkCopy(connectionString, SqlBulkCopyOptions.UseInternalTransaction)) { try { sqlbulkcopy.DestinationTableName = TableName; for (int i = 0; i < dt.Columns.Count; i++) { sqlbulkcopy.ColumnMappings.Add(dt.Columns[i].ColumnName, dt.Columns[i].ColumnName); } sqlbulkcopy.WriteToServer(dt); } catch (System.Exception ex) { throw ex; } } } }
这里使用了SqlBulkCopy的写入方法。注意的内容标注在region后面。
阅读全文
1 0
- EXCEL批量导入数据MVC
- excel批量导入数据
- excel数据批量导入
- excel批量导入数据
- excel批量导入数据
- excel批量导入数据
- excel批量导入数据
- excel数据批量导入
- 批量导入Excel中的数据
- Excel批量数据导入Oracle
- excel模板批量导入数据
- 基于Spring3 MVC实现基于form表单上传Excel文件,批量导入数据!
- MVC小批量数据导出到Excel
- 用QueryTable向excel批量导入数据
- 用ADO向Excel批量导入数据
- 用ADO向Excel批量导入数据
- 实现Excel数据批量导入到Access
- 用ADO向Excel批量导入数据
- 优秀工程师0-UITabBarController
- springboot学习笔记(一) HelloWorld
- 网络文件共享--(一)FTP
- XMLFactory
- Android Studio导入第三方类库的方法
- EXCEL批量导入数据MVC
- C++使用函数式代替泛型迭代器设计接口
- SGU 199. Beautiful People(最长上升子序列nlogn LIS)
- springboot学习笔记(二) Thymeleaf
- 创建一个数据库
- 云平台快速部署与源码编译lamp应用wordpress
- 优秀工程师-UIViewController
- Electron项目打包
- ArrayList应用