Excel数据导入数据库

开发工具与关键技术:vs mvc
作者:朱某人
撰写时间:2019年5月 29日
在页面上想要把数据存进数据库就是新增,如果要大量的数据一起导入就需要给它定义一个模板,按模板信息填入恰当的数据信息,在导入导出的过程中用到了一个名叫NPOI的插件,在mvc框架中有,所以会用到很多次,但这个插件对Excel的格式只支持后缀是 .xls 的,(现在的Excel是.xlsx的)。
那么我就在本地创建出模板文件,当你要导入数据时先下载这个模板把你要导入的数据填写完整后并正确才能导入数据库。
public ActionResult DownImportTemplate(HttpPostedFileBase file)
{
string filePath = Server.MapPath("~/Document/Template/考生信息导入模板.xls");
if (System.IO.File.Exists(filePath))
{
//获取文件的名称
string strfileName = Path.GetFileName(filePath);
return File(new FileStream(filePath, FileMode.Open), “application/octet-stream”, strfileName);
}
else
{
return Content(“模板文件不存在,请联系系统运维人员。”);}}
这个是引到文件的路径,获取到文件的名称,下一步就是对这个模板进行判断还有一些转化一些形式的。就拿学生的一些个人信息为例。
public ActionResult ImportExcel(HttpPostedFileBase file){
ReturnJson returnJson = new ReturnJson();
try{
//把session中的ImportExcel移除避免残留以前数据
Session.Remove(“ImportExcel”);
//获取文件的后缀
//(1)判断类型是不是: .xls
string fileExtension = Path.GetExtension(file.FileName);
if (".xls".Equals(fileExtension) || “.XLS”.Equals(fileExtension))
{
//声明二进制数组存放文件
byte[] fileBytes = new byte[file.ContentLength];
//将传入的文件转化为二进制的数组存入fileBytes
file.InputStream.Read(fileBytes, 0, file.ContentLength);
//将二进制数组转化为内存流
MemoryStream excelFileStream = new MemoryStream(fileBytes);
//将内存流转化为工作簿
NPOI.SS.UserModel.IWorkbook workbook = new HSSFWorkbook(excelFileStream);

                //(2)工作簿中有工作表
                if (workbook.NumberOfSheets>0)
                {
                    //查询出 学院,专业的信息:用来根据名称获取对应的ID

List<SYS_Academe> dbAcademe = (from tbAcademe in myModels.SYS_Academe select tbAcademe).ToList();
List<SYS_Specialty> dbSpecialty = (from tbSpecialty in myModels.SYS_Specialty
select tbSpecialty).ToList(); //对象列表
List listStudentVo = new List();
//获取第一个工作表
NPOI.SS.UserModel.ISheet sheet = workbook.GetSheetAt(0);
//(3)工作表有数据
//判断工作表中是否有数据
if (sheet.PhysicalNumberOfRows > 0)
{
// 定义datatable
DataTable dtExcel = new DataTable();
//将数据先装到datatable中
//获取标题行— 第二行,索引为1;第一行是说明
NPOI.SS.UserModel.IRow rowHeader = sheet.GetRow(1);
//获取表格列数
int cellCount = rowHeader.LastCellNum;
//获取表格行数
int rowCount = sheet.LastRowNum + 1;
//创建dataTable中的列,循环添加标题行中各个单元格的值
for (int i = rowHeader.FirstCellNum; i < cellCount; i++)
{
//通过遍历行中的每一个单元格,获取标题行各个单元格的数据
DataColumn dtColumn = new DataColumn(rowHeader.GetCell(i).StringCellValue);
//将获取到的标题行的数据放到datatable中;
dtExcel.Columns.Add(dtColumn);
}
//读取Excel中的数据
//(sheet.FirstRowNum) 第一行是说明;第二行是标题;第三行开始才是数据信息
for (int i = (sheet.FirstRowNum) + 2; i < rowCount; i++){
//获取行(1、2、3…)数据
NPOI.SS.UserModel.IRow row = sheet.GetRow(i);//1
//创建DataTable行
DataRow dtRow = dtExcel.NewRow();
if (row != null)
{
//遍历excel中一行的所有单元格
for (int j = row.FirstCellNum; j < cellCount; j++)
{if (row.GetCell(j) != null)
{dtRow[j] = row.GetCell(j).ToString();}}}
//将填入数据的dtRow添入dtExcel
dtExcel.Rows.Add(dtRow);
}
int intSuccess = 0;
int intFail = 0;

                        //(4)数据准确性(学院	专业	年级	班级   表跟表之间的关系)
                        //遍历datatable中的数据
                        foreach (DataRow row in dtExcel.Rows)
                        {
                            //创建studentVo对象保存每一条数据
                            Student student = new Student();
                            try
                            {//获取学院ID 和学院名称
                         student.AcademeName = row["学院"].ToString().Trim();
                    //通过dataTable中的AcademeName到dbAcademe中查找相应的AcademeID

student.AcademeID=dbAcademe.Where(p=>p.AcademeName==student.AcademeName).SingleOrDefault().AcademeID;
//获取专业id和名称
//根据学院ID和专业名称获取相应的专业ID
student.SpecialtyName = row[“专业”].ToString().Trim();
student.SpecialtyID = dbSpecialty.Where(p => p.AcademeID == student.AcademeID && p.SpecialtyName == student.SpecialtyName).SingleOrDefault().SpecialtyID;
//将每一条数据都添加到对象列表中
listStudentVo.Add(student);
intSuccess++;//记录成功的条数}
return Json(returnJson, JsonRequestBehavior.AllowGet);}
这是从工作表中的每行每列数据中找到匹配的信息,然后按照数据库的字段填写进去达到导入的功能效果。
在这里插入图片描述
这一部分就是这样子,最后说一下导入的思路,首先是判断类型是不是.xls类型的Excel,第二获取到读取的文件,将文件转化为二进制数组,又将二进制数组转化成内存流,利用NPOI把内存流中的数据读取成工作簿Excel,但要确定工作簿中有工作表,工作表中也有数据,还有数据的准确性。
导入就到这了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值