开发工具与关键技术: Visual Studio   导入数据 
作者:黎凤焕
撰写时间:2019年4月13日

在学习MVC的过程中,会用到数据的导入,把数据导入到数据库里面去,使用表格数据的时候,往往用到数据的导入。导入数据并不是直接导入数据,首先要构建一个模态框,让用户确认要导入的数据是否是准确的,如果是准确的再导入到数据库里面。如果不构建模态框,让用户直接导入数据就将数据导入到数据库里面,会造成不必要的麻烦,可能会导入了一些不需要的数据进数据库,这样可能会浪费用户的时间。
在导入数据之前,我们要借助模态框来显示导入Excel表格里面的数据,所以要构建一个页面,就是模态框。模态框里面用到一个临时表格,首先要构造表格,该表格用到的是layui里面的表格,layui 里面的表格,我们会用到它的渲染方式,所以要对表格进行渲染,把表格渲染出来。把表格构建好,渲染出来之后,通过导入数据按钮的单击事件把表格显示出来。首先,获取导入按钮,给它一个单击事件,打开模态框,一进模态框的时候,要对表格进行重置。当用到resetForm时,首先要引用插件才可以用,然后把模态框显示出来。当表格没有数据的时候,导入数据库的按钮是被禁用的,当有数据的时候,导入数据库的按钮才不会被禁用,才可以将数据导入到数据库。
$("#formImportExcel").resetForm(); —重置表单

---引用插件

$("#formImportExcel").resetForm();—禁用导入数据库的按钮
当页面上不仅只有一个模态框的时候,可以对这个模态框进行设置,把它的背景颜色去掉,这样做事为了防止两个模态框发生冲突,有的电脑会发生冲突,有的不会,为了防止它们发生冲突,把它的背景颜色去掉。
(背景时不关闭动态模态框,按下esc时不关闭动态模态框)

$("#modImportExaminee").modal({
 backdrop: false,
 keyboard: false
 });


在导入数据之前,要给用户下载一个导入数据的模板,让用户按照模板里面的内容填写完整,加载数据到table里面,提交表单,然后启用保存到数据库的按钮,将数据导入到数据库里面。不同的浏览器的模板下载是不同的。
下载模板思路:
(1) 判断:类型是不是: .xls
string fileExtension = Path.GetExtension(file.FileName);
if (".xls".Equals(fileExtension) || “.XLS”.Equals(fileExtension))
1、获取读取的文件;
2、把文件转换为二进制数组;
3、二进制数组转成内存流;
MemoryStream excelFileStream = new MemoryStream(fileBytes);
4、利用NPOI把内存流中的数据读取成工作簿Excel
将内存流转化为工作簿
NPOI.SS.UserModel.IWorkbook workbook = new HSSFWorkbook(excelFileStream);
(2)工作簿中有工作表
工作簿中有工作表就查询出与表格相对应的信息,用来根据名称获取对应的ID,对对象列表,然后获取第一个工作表。
(3)工作表有数据:判断工作表中是否有数据
(4)数据准确性
定义datatable,将数据先装到datatable中,获取标题行,在获取表格列数和行数,创建dataTable中的列,循环添加标题行中各个单元格的值,通过遍历行中的每一个单元格,获取标题行各个单元格的数据,将获取到的标题行的数据放到datatable中,读取Excel中的数据,获取行(1、2、3…)数据,创建DataTable行,遍历excel中一行的所有单元格,遍历excel中一行的所有单元格。

if(sheet.PhysicalNumberOfRows>0){
 DataTable dtExcel = new DataTable();
 NPOI.SS.UserModel.IRow rowHeader = sheet.GetRow(1);
 int cellCount = rowHeader.LastCellNum;
 int rowCount = sheet.LastRowNum + 1;
 for (int i = rowHeader.FirstCellNum; i < cellCount; i++)
 {
 DataColumn dtColumn = new DataColumn(rowHeader.GetCell(i).StringCellValue);
 dtExcel.Columns.Add(dtColumn);
 }
 for (int i = (sheet.FirstRowNum) + 2; i < rowCount; i++)
 {
 NPOI.SS.UserModel.IRow row = sheet.GetRow(i);
 DataRow dtRow = dtExcel.NewRow();
 If(row!=null)
 {
 for (int j = row.FirstCellNum; j < cellCount; j++)
 {
 if (row.GetCell(j) != null)
 {
 dtRow[j] = row.GetCell(j).ToString();
 }
 }
 }
 dtExcel.Rows.Add(dtRow);
 }
 }


(5)数据都有,然后读取数据。
最后对导入的数据进行保存,记录好保存成功的条数,记录已经存在的数据,还要判断要保存的数据是否为空,如果为空就不可以将数据进行导入,判断导入的数据中是否已经有存在于数据库的数据,如果数据库中有要导入的数据,将不给予导入,最后判断数据有没有导入成功,记录保存成功的条数,提示导入的数据成功多少条,有没有导入失败。