菜鸟笔记—将Excel表格内数据导入到session的控制器方法

关于导入Excel表格内数据的控制器方法我还没有吃透,只是现在的进度太慢只能有多少心得写多少心得了,它的思路就是:1.设定好Excel表格的模板文件;2.从页面获取到需要读取的文件;3.将文件转换为二进制数组;再将二进制数组转换为内存流;4.利用NPOI把内存流中的数据读取成Excel;5. 获取第一张工作表,判断工作表中是否存在数据(也不是只有第一张工作表才行)。

添加一个新建的文件夹,在文件夹当中新建一个可以作为模板文件的Excel表格文件,再写一个简单的(可能吧?)控制器方法,它可以获取到这个Excel表格模板的路径,判断Excel表格模板是否存在,若是存在Excel表格的模板,将模板文件返回到页面并打开(也可以说是下载)Excel表格模板的,然后在View(页面)中完成一个可以使用该控制器方法的Js函数,以这个函数为点击事件,以此完成一个具有下载Excel表格模板功能的页面按钮。如此点击下载按钮即可下载一份Excel表格的模板文件。(该文件用于规范需要导入的数据,这段下载模板的代码相对来说没有那么重要。)

从页面获取到需要读取的文件作为参数,提取出后缀名(或者说文件拓展名),将提取出的文件后缀名声明为一个字符串类型的变量。判断后缀名是否为“xls”或“XlS”,以此判断页面传过来的文件是否为Excel表格,例如:

string fileExtension = System.IO.Path.GetExtension(file.FileName); 
if (".xls".Equals(fileExtension) || ".XLS".Equals(fileExtension))
{

}
Else
{
      returnJson.State = false;
      returnJson.Text = "文件类型错误,请上传Excel文件!";
}
“System.IO.Path”能够简写为“Path”,它可以对包含文件或目录路径信息的 System.String 实例执行操作。
“GetExtension”返回指定的路径字符串中的拓展名,但是想使用它需要引入一个Visual
Studio 2015自带的“IO”即:using System.IO;能利用快速操作将其引入。

将文件转换为二进制数组;再将二进制数组转换为内存流。先声明一个变量用于存放二进制数组,再将已经被判断成立的文件利用“InputStream.Read”这个方法将文件从零一直到最后所有的数据转换为二进制数组存入变量,再将这个变量转换为内存流存入session。代码如下:

byte[] fileBytes = new byte[file.ContentLength];
file.InputStream.Read(fileBytes, 0,
file.ContentLength);
MemoryStream excelFileStream = new MemoryStream(fileBytes);

打开解决方法管理器在引用当中添加一个名为“NPOI”的的插件(应用程序拓展)。利用在NPOI下的SS.UserModel的IWorkbook建立一个新的工作簿,用来放入内存流(似乎是声明一个变量并赋值的形式将内存流转换为工作簿),利用IWorkbook的一个属性来
判断工作簿是否有工作表。

NPOI.SS.UserModel.IWorkbook workbook = new NPOI.HSSF.UserModel.HSSFWorkbook0(excelFileStream);
if(workbook.NumberOfSheets > 0)
{

}
else
{
	returnJson.State = false;
       	returnJson.Text = "工作簿中没有数据表";
}

如果以上判断都成立那么来到第五步:先获取到第一个工作表,利用插件NPOI中的“ISheet”的属性“PhysicalNumberOfRows”判断是否存在数据,因为是第一张工作表中有需要导入的数据,所以导入的是第一张工作表,而不是只能导入第一张。

NPOI.SS.UserModel.ISheet sheet = workbook.GetSheetAt(0); //这个参数0个人认为是一个索引
if (sheet.PhysicalNumberOfRows > 0)//PhysicalNumberOfRows获取的是实际存在的物理行数,也就是不包括那些空行(隔行)的情况。
{ 

}
else
{
	returnJson.State = false;
	returnJson.Text = "数据表为空";
}

引用Visual Studio
2015自带的“Data” ,创建一个 “DataTable”的对象用来保存数据,利用NPOI给变量赋值来获取标题行,再声明一个变量利用
“IRow”的属性:“LastCellNum”来给这个变量赋值获取到表格列数,再利用“IRow”的属性“LastRowNum”来获取实际的表格行数(暂时用不到),利用for循环添加标题行中各个单元格的数据,将获取到的标题的数据放入这个“DataTable”,来创建标题行。想要读取Excel中的数据同样要利用for循环来获取实际存在的所有数据(除了标题行),先创建一个新的for循环来获取数据,在循环体中创建一个“DataTadle”行,如果行内数据不为空,就利用for循环遍历行内所有的单元格,查看单元格是否为空(应该吧),如果不为空,将新行添加到这个“DataTable”中。

Row的部分属性
FirstRowNum; 获取第一个实际行的下标
LastRowNum; 获取最后一个实际行的下标
FirstCellNum; 获取某行第一个单元格下标
tCellNum; 获取某行的列数

DataTable dtExcel = new DataTable();
NPOI.SS.UserModel.IRow rowHeader = sheet.GetRow(0);
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 + 1; 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);
}

接下来就是利用关键字“foreach”遍历这个变量“row”,在循环中将数据放入一个自定义的一个表格对象,按照作为模板文件的Excel表格文件的标题次序获取ID和名称,将每一条数据都添加到对象列表中,如果没有出现错误那么将数据保存到session中;

//声明变量,记录成功和失败的条数
int ImportSuccess = 0;
int ImportFail = 0;
List<数据表> 变量1= (from 自定义表名in 实例化数据库. 数据表
		select 自定义表名).ToList();

foreach (DataRow row in dtExcel.Rows){ 
	自定义表格 变量2= new 自定义表格()
	try{
		变量2. 变量2名称= row["名称"].ToString().Trim();
		变量2. 变量2ID= 数据表变量.Where(m => m.变量名称== student. 对象名称).SingleOrDefault().数据表ID
		listStudentVo.Add(变量2); 
		ImportSuccess++;
	}
	catch (Exception)
	{
		returnJson.State = false;
		returnJson.Text = "数据处理出错";
		ImportFail++;
	}
	Session["ImportExcel"] = listStudentVo;
	returnJson.State = true;
	returnJson.Text = "Excel表格中一共有" +
	dtExcel.Rows.Count + "条数据,其中" +ImportSuccess + "条匹配成功,有" + ImportFail + "条匹配失败";


发布了26 篇原创文章 · 获赞 4 · 访问量 3613

猜你喜欢

转载自blog.csdn.net/weixin_44545673/article/details/89630697