VS导入数据到数据库

导入数据

开发工具:VS 2015,SQL 2014
准备工作:将NPOI引入到项目中

一、 功能实现

初始界面
VS导入数据到数据库_第1张图片
图1 初始界面

1.导入
作用:导入操作主是一个将数据新增到数据库的操作。
说明:点击 图1 中“导入”按钮,然后弹出所要导入数据的基本格式,如图2所示:
VS导入数据到数据库_第2张图片
图2 导入弹出窗体
接着选择文件后缀名为xls的excel文档,然后鼠标点击“导入数据库”按钮,如图3所示
VS导入数据到数据库_第3张图片
图3 导入数据显示

最后提示导入数据的情况,如图4所示:
VS导入数据到数据库_第4张图片
图4 导入结果

二、数据库表关系

VS导入数据到数据库_第5张图片
图5 数据库关系

三、经典代码

由于导入数据中的编号是自动生成,所以首先写一个自动生成编号的函数,代码如下:
  public ActionResult GeneratesPatientnumber()//生成患者编号
        {
            string NewPatientnumber = "";//定义一个新的字符串
            //查询数据库中的卡号 
            var listPatientnumber = (from dbPatientInformation in myModels.S_PatientInformation
                                     orderby dbPatientInformation.Patientnumber   //(以卡号排序)
                                     select dbPatientInformation).ToList();
            if (listPatientnumber.Count > 0)//当数据库中有数据时
            {
                int count = listPatientnumber.Count;//获取查询到的数据的条数
                S_PatientInformation PatientInformationList = listPatientnumber[count - 1];
//获取最后一条数据
                int intCode = Convert.ToInt32(PatientInformationList.CardIDNumber.Substring(4));
//对最后一条数据进行截取长度(截取后面的编号)
                //Substring(1,4)截取字符串,1代表字符串起始位置,4表示截取长度
                intCode++;//新的编号(在原来的编号上加一)
                NewPatientnumber = intCode.ToString();//给定义的字符赋值
                var a = "H";//声明所要给编号拼接的字符
                var b = "Z";//声明所要给编号拼接的字符
                var c = "B";//声明所要给编号拼接的字符
                var d = "H";//声明所要给编号拼接的字符
                
                for (int i = 0; i <10; i++)
                {
                    //循环判断NewPatientnumber的长度是否大于10, 
                   //如果不是就在NewPatientnumber前面加"0",否则NewPatientnumber=NewPatientnumber
                    NewPatientnumber = NewPatientnumber.Length < 10 ? "0" + NewPatientnumber : NewPatientnumber;
                }
                NewPatientnumber = a + b + c + d + NewPatientnumber;//卡号的最终拼接
            }
            else//当数据库中没有数据时 卡号的初始值
            {
                NewPatientnumber = "HZBH0000000001";
            }
            Session["NewPatientnumber"] = NewPatientnumber;//把新的卡号记录在Session中

            return Json(NewPatientnumber, JsonRequestBehavior.AllowGet);
        }


接着是导入操作

public ActionResult ImportExcel(HttpPostedFileBase file)
        {
            string strmsg = "";
            try
            {
                //思路:获取读取的文件,把文件转换为二进制数组,然后转成内存流,利用NPOI把内存流中的数据读取成Excel
                /*导入Excel的步骤:
                 * 一:先判断各种情况的存在
                   情况一:判断上传的Excel类型只能是.xls格式
                   情况二:判断上传的Excel是否存在工作表
                   情况三:判读上传的Excel存在工作表但是是否存在数据
                   二:读取数据
                    第一步:读取表头(一行(索引是0),多列(利用一个for循环,列的最大索引是列的总数-1));
                    第二步:读取数据(多行(从第二行开始(索引是1开始,因为索引0是表头的那一行,行的最大索引是行总数-1,这里一个for循环)),多列(索引还是从0开始,列的最大索引是列的总数-1)))
                     三:判断数据真实性
                     四:把数据跟数据库表的字段对应
                     五:把数据保存到session*/

                //读取路径文件的扩展名(后缀xls)
                string fileExtension = Path.GetExtension(file.FileName);
                if (".xls".Equals(fileExtension) || ".XLS".Equals(fileExtension))//判断读取的文件是.xls文件
                {
                    byte[] fileBytes = new byte[file.ContentLength];//指定数组的长度获取Excel数据的大小
                    file.InputStream.Read(fileBytes, 0, file.ContentLength);//读取文件内容
                                                                            // 转为 内存流
                    MemoryStream excelFileStream = new MemoryStream(fileBytes);

                    //将内存流转为 工作簿
                    IWorkbook workbook = new HSSFWorkbook(excelFileStream);

                    //判断工作簿中的工作表(Sheet)的个数
                    if (workbook.NumberOfSheets > 0)
                    {
                        
                        ////查询信息
                        List dbPatientInformation = (from tbPatientInformation in myModels.S_PatientInformation select tbPatientInformation).ToList();
                        //事先声明表格
                        List lsitPatientInformations = new List();

                        // 获取第一个工作表
                        ISheet sheet = workbook.GetSheetAt(0);
                        //PhysicalNumberOfRows 获取的是物理行数,也就是不包括那些空行(隔行)的情况。
                        //判断 工作表(sheet)中有数据
                        if (sheet.PhysicalNumberOfRows > 0)
                        {
                            //将数据先装到datatable中
                            // 定义datatable
                            DataTable dtExcel = new DataTable();
                            //获取标题行 第一行
                            IRow headerRow = sheet.GetRow(0);
                            //获取一行单元格个数  LastCellNum 获取列数,比最后一列列标大 1
                            int cellCount = headerRow.LastCellNum;
                            //获取数据总行数    LastRowNum  最后一行行标,比行数小 1
                            int rowCount = sheet.LastRowNum + 1;

                            //创建DataTable的列Columns,读取表头
                            for (int i = headerRow.FirstCellNum; i < cellCount; i++)
                            {

                                DataColumn column = new DataColumn(headerRow.GetCell(i).StringCellValue);
                                dtExcel.Columns.Add(column);
                            }

                            //读取Excel中的数据
                            //(sheet.FirstRowNum) 第一行是标题
                            for (int i = (sheet.FirstRowNum + 1); i < rowCount; i++)
                            {
                                IRow row = sheet.GetRow(i);//获取行
                                DataRow dataRow = dtExcel.NewRow();//DataTable创建一行
                                if (row != null)
                                {
                                    //遍历Excel一行的所有单元格
                                    for (int j = row.FirstCellNum; j < cellCount; j++)
                                    {
                                        if (row.GetCell(j) != null)
                                        {
                                            dataRow[j] = row.GetCell(j).ToString();
                                        }
                                    }
                                }
                                //添加行DataRow到DataTable
                                dtExcel.Rows.Add(dataRow);
                            } //遍历datatable 获取数据
                            foreach (DataRow row in dtExcel.Rows)
                            {
                                //创建一个 PatientInformation
                                PatientInformation patientinformation = new PatientInformation();
                                try
                                {

                                    //patientinformation.Patientnumber = row["患者编号"].ToString().Trim();
                                    patientinformation.PatientMC = row["患者名称"].ToString().Trim();
                                    patientinformation.strBirthday = row["出生日期"].ToString();
                                    patientinformation.Sex = row["性别"].ToString().Trim();
                                    patientinformation.CensusRegister = row["户籍"].ToString().Trim();
                                    patientinformation.Patriarch = row["家长"].ToString().Trim();
                                    patientinformation.WorkUnit = row["工作单位"].ToString().Trim();
                                    patientinformation.Illness = row["疾病"].ToString().Trim();
                                    patientinformation.IllnessSecondType = row["疾病亚型"].ToString().Trim();
                                    patientinformation.AffiliatedClub = row["隶属社康"].ToString().Trim();
                                    //patientinformation.CardIDNumber = row["卡片ID号"].ToString().Trim();
                                    //patientinformation.CardNumber = row["卡片编号"].ToString().Trim();
                                    patientinformation.CardState = row["卡片状态"].ToString().Trim();
                                    //patientinformation.Rregistrant = row["登记人"].ToString().Trim();
                                    lsitPatientInformations.Add(patientinformation);
                                }
                                catch (Exception e)
                                {
                                    Console.WriteLine(e);
                                }
                            }
                            //把数据存在session当中做临时保存,这里还没有保存到数据库
                            Session["ImportExcel"] = lsitPatientInformations;
                            strmsg = "success";
                        }
                        else
                        {
                            //工作表中没有数据
                            strmsg = "物理行数为0";
                        }

                    }
                    else
                    {
                        strmsg = "没有工作表";
                    }
                }
                else
                {
                    strmsg = "上传的文件类型不正确";
                }

            }
            catch (Exception e)
            {
                Console.WriteLine(e);
                strmsg = "defeated";
            }
            return Json(strmsg, JsonRequestBehavior.AllowGet);
        }

由于编号是自动生成的,所以在保存的时候需要自动新增编号,并且不能相同,所以利用递归的性质生成最新的编号,以下是保存时所作的操作!
public ActionResult SaveImport()
{
string UserName = Session[“UserName”].ToString();
string returnstr = “failed”;
try
{
int savedCount = 0;//保存成功的条数
int oldCount = 0;//已经存在的数据条数
List patientinformations = new List();
if (Session[“ImportExcel”] != null)
{
patientinformations = Session[“ImportExcel”] as List;
}

            if (patientinformations.Count > 0)
            {
                foreach (PatientInformation patientinformation in patientinformations)
                {
                    int intOld = (
                        from tbPatientInformation in myModels.S_PatientInformation
                        where  tbPatientInformation.PatientMC == patientinformation.PatientMC

                        select tbPatientInformation).Count();
                    //没有重复的
                    if (intOld == 0)
                    {
                        S_PatientInformation SPatientInformation = new S_PatientInformation();
                        //保存患者
                        
                        GeneratesPatientnumber();
                        string Patientnumber = Session["NewPatientnumber"].ToString();

                        GeneratesCardIDNumber();
                        string CardIDNumber = Session["NewPatientnumber"].ToString();

                        GeneratesCardNumber();
                        string CardNumber = Session["NewPatientnumber"].ToString();

                        SPatientInformation.PatientMC = patientinformation.PatientMC.Trim();
                        //SPatientInformation.Patientnumber = patientinformation.Patientnumber.Trim();
                        SPatientInformation.Patientnumber = Patientnumber.Trim();

                        SPatientInformation.Birthday = Convert.ToDateTime( patientinformation.strBirthday.Trim());
                        SPatientInformation.Sex = patientinformation.Sex.Trim();
                        SPatientInformation.CensusRegister = patientinformation.CensusRegister.Trim();
                        SPatientInformation.Illness = patientinformation.Illness.Trim();
                        SPatientInformation.IllnessSecondType = patientinformation.IllnessSecondType.Trim();

                        var RegistrationTime = System.DateTime.Today;
                        SPatientInformation.RegistrationTime = RegistrationTime;
                        SPatientInformation.Rregistrant = UserName;

                        SPatientInformation.AffiliatedClub = patientinformation.AffiliatedClub.Trim();
                        //SPatientInformation.CardIDNumber = patientinformation.CardIDNumber.Trim();
                        SPatientInformation.CardIDNumber = CardIDNumber.Trim();

                        //SPatientInformation.CardNumber = patientinformation.CardNumber.Trim();
                        SPatientInformation.CardNumber = CardNumber.Trim();

                        SPatientInformation.CardState = patientinformation.CardState.Trim();
                        SPatientInformation.Patriarch = patientinformation.Patriarch.Trim();
                        SPatientInformation.WorkUnit = patientinformation.WorkUnit.Trim();
                        //把表对象加到实体模型中
                        myModels.S_PatientInformation.Add(SPatientInformation);
                        //将对象实体插入到数据库中

                        //savedCount += myModels.SaveChanges();
                        savedCount = savedCount + myModels.SaveChanges();
                    }
                    else
                    {
                        oldCount++;
                    }
                    }
                    returnstr = "导入总条数" + patientinformations.Count + "条,患者名称已存在的数据有" + oldCount + "条,实际保存了" + savedCount + "条数据到数据库";
                }
            else
            {
                    returnstr = "没有要保存的";
                }
            }
        catch (Exception e)
        {
            Console.WriteLine(e);
        }
        return Json(returnstr, JsonRequestBehavior.AllowGet);
    }

四、开发总结
好好学习,天天向上。

你可能感兴趣的:(VS导入数据到数据库)