C#导入.xls数据方法汇总二(将上传文件存到DataTable实例对象中)
C#导入.xls数据方法汇总二(将上传文件存到DataTable实例对象中)
创建各数据库实例对象,并创建一个studentVo实体类记录所有的上传数据
//查询出 学院,专业,年级,班级 的信息:用来根据名称获取对应的ID
List<SYS_Academe> dbAcademe = myModel.SYS_Academe.ToList();
List<SYS_Specialty> dbSpecialty = myModel.SYS_Specialty.ToList();
List<SYS_Grade> dbGrade = myModel.SYS_Grade.ToList();
List<SYS_Class> dbClass = myModel.SYS_Class.ToList();
//创建studentVo对象列表-》用于存放导入的学生/用户数据
List<studentVo> listStudentVo = new List<studentVo>();
获取到第一张工资表。并判断工作表是否有数据再进行下面的操作
//获取第一张工作表
ISheet sheet = workbook.GetSheetAt(0);
//判断工作表中是否有数据
//PhysicalNumberOfRows 获取的时物理行数,不包括那些空行(隔行)的情况
if (sheet.PhysicalNumberOfRows > 0){
}else{
returnJson.Text = "工作表为空,请检查!";
}
1、创建一个DataTable对象实例
DataTable()表示内存中数据的一个表
//将数据先装到datatable中
// 定义datatable
DataTable dtExcel = new DataTable();
2、获取上传文件的表头信息
第一行一般为导入数据模板的说明,不算是表头数据
//获取工作表中的第二行(第一行是说明,索引为0)
IRow rowHeader = sheet.GetRow(1);
3、基本使用到的方法如下四个
FirstCellNum:获取某行第一个单元格下标
LastCellNum:获取某行的列数
FirstRowNum:获取第一个实际行的下标
LastRowNum:获取最后一个实际行的下标
4、获取到上传文件的列数和行数
上图有9列3行
//获取表格列数
int cellCount = rowHeader.LastCellNum;
//获取表格行数
int rowCount = sheet.LastRowNum + 1;
获取行数+1的意思就是跳过第二行的表头数据开始算起
5、循环获取到文件的第二行表头并给DataTable设置同样的表头
先要获取到上传文件表头列的名称,再将获取到的名称添加到DataTable作为表头
循环的次数就是获取到的文件列数
//循环添加标题行中各个单元格的值 -- 相当于定义数据库表的字段
for (var i = rowHeader.FirstCellNum; i < cellCount; i++)
{
//创建dataTable中的列
//通过遍历行中的每一个单元格,获取标题行各个单元格的数据
DataColumn dtColumn = new DataColumn(rowHeader.GetCell(i).StringCellValue);
//将获取到的标题行的数据放到datatable中;
dtExcel.Columns.Add(dtColumn);
}
6、获取上传文件的数据内容
循环的次数是;上传数据的行数,不包括说明行和表头行
判断里面有一个isNull布尔变量的主要作用是记录上传的文件文件是否有空的数据,空的为true就不会添加到创建的DataTable里面,从而造成很多的空白数据出来
//查询出 学院,专业,年级,班级 的信息:用来根据名称获取对应的ID
List<SYS_Academe> dbAcademe = myModel.SYS_Academe.ToList();
List<SYS_Specialty> dbSpecialty = myModel.SYS_Specialty.ToList();
List<SYS_Grade> dbGrade = myModel.SYS_Grade.ToList();
List<SYS_Class> dbClass = myModel.SYS_Class.ToList();
//创建studentVo对象列表-》用于存放导入的学生/用户数据
List<studentVo> listStudentVo = new List<studentVo>();
//获取第一张工作表
ISheet sheet = workbook.GetSheetAt(0);
//判断工作表中是否有数据
//PhysicalNumberOfRows 获取的时物理行数,不包括那些空行(隔行)的情况
if (sheet.PhysicalNumberOfRows > 0){
//获取Excel表格中的数据行
//(sheet.FirstRowNum) 第一行是说明;第二行是标题;第三行开始才是数据信息
for (var j = sheet.FirstRowNum + 2; j < rowCount; j++)
{
//获取数据行(3,4,5,6,......)数据
IRow row = sheet.GetRow(j);
//创建DataTable行
DataRow dtRow = dtExcel.NewRow();
if (row != null)
{
// 去空行变量
bool isNull = true;
//遍历行中所有的单元格,填入dtRow中
for (var n = row.FirstCellNum; n < cellCount; n++)
{
if (row.GetCell(n) != null)
{
string cellVal = row.GetCell(n).ToString();
dtRow[n] = cellVal;
//去空行,如果行当中存在不为空的单元格,变量isNull为false,否则为true
if (!string.IsNullOrEmpty(cellVal))
{
isNull = false;
}
}
}
if (!isNull)
{
//将b不为空的数据行dtRow填入dtExcel中
dtExcel.Rows.Add(dtRow);
}
}
}
7、完整的将Excel表格数据放到DataTable中代码
#region 将Excel表格数据放到DataTable中
//将数据先装到datatable中
// 定义datatable
DataTable dtExcel = new DataTable();
//获取工作表中的第二行(第一行是说明,索引为0)
IRow rowHeader = sheet.GetRow(1);
//获取表格列数
int cellCount = rowHeader.LastCellNum;
//获取表格行数
int rowCount = sheet.LastRowNum + 1;
//循环添加标题行中各个单元格的值 -- 相当于定义数据库表的字段
for (var i = rowHeader.FirstCellNum; i < cellCount; i++)
{
//创建dataTable中的列
//通过遍历行中的每一个单元格,获取标题行各个单元格的数据
DataColumn dtColumn = new DataColumn(rowHeader.GetCell(i).StringCellValue);
//将获取到的标题行的数据放到datatable中;
dtExcel.Columns.Add(dtColumn);
}
//获取Excel表格中的数据行
//(sheet.FirstRowNum) 第一行是说明;第二行是标题;第三行开始才是数据信息
for (var j = sheet.FirstRowNum + 2; j < rowCount; j++)
{
//获取数据行(3,4,5,6,......)数据
IRow row = sheet.GetRow(j);
//创建DataTable行
DataRow dtRow = dtExcel.NewRow();
if (row != null)
{
// 去空行变量
bool isNull = true;
//遍历行中所有的单元格,填入dtRow中
for (var n = row.FirstCellNum; n < cellCount; n++)
{
if (row.GetCell(n) != null)
{
string cellVal = row.GetCell(n).ToString();
dtRow[n] = cellVal;
//去空行,如果行当中存在不为空的单元格,变量isNull为false,否则为true
if (!string.IsNullOrEmpty(cellVal))
{
isNull = false;
}
}
}
if (!isNull)
{
//将b不为空的数据行dtRow填入dtExcel中
dtExcel.Rows.Add(dtRow);
}
}
}
#endregion
}
else {
returnJson.Text = "工作表为空,请检查!";
}
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
THE END
二维码