开发工具:VS 2015,SQL 2014
准备工作:将NPOI引入到项目中
1.导入
作用:导入操作主是一个将数据新增到数据库的操作。
说明:点击 图1 中“导入”按钮,然后弹出所要导入数据的基本格式,如图2所示:
图2 导入弹出窗体
接着选择文件后缀名为xls的excel文档,然后鼠标点击“导入数据库”按钮,如图3所示
图3 导入数据显示
由于导入数据中的编号是自动生成,所以首先写一个自动生成编号的函数,代码如下:
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);
}
四、开发总结
好好学习,天天向上。