EXCEL批量导入数据MVC

本文介绍了一种利用NPOI库实现EXCEL批量导入的方法,包括前端页面设计、文件上传处理及后台数据解析等关键步骤,并通过具体示例代码展示了整个流程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这里简单实现EXCEL的批量导入

直接看代码,里面有注释

前端页面实现

@{
    ViewBag.Title = "批量添加数据";
    //Layout = null;
}



  
 href="~/Content/jQuery.filer/css/jquery-filer.css" rel="stylesheet" />
 href="~/Content/jQuery.filer/css/jquery.filer-dragdropbox-theme.css" rel="stylesheet" />

  





  
下载模板

后台需要引用dll

using NPOI.HSSF.UserModel;
//批量导入的页面Action
public 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后面。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值