导入数据到Excel表格控制器内容

开发工具与关键技术:Visual Studio 和  ASP.NET.MVC,
作者:陈鸿鹏
撰写时间:2019年6月4日

//然后再接着将导入的Excel表格的数据保存到session的方法
// HttpPostedFileBase是数据类型
public ActionResult form表单里面action名称(HttpPostedFileBase 参数)
{
ReturnJsonVo returnJson = new ReturnJsonVo();//记录状态
try
{//思路步骤:首先第一步获取读取的文件;第二步把文件转换为二进制数组;第三步二进制数组转成内存流;第四步利用NPOI把内存流中的数据读取成Excel。
NPOI就是在你没有安装office的时候可以读取Excel和word文档。
要用NPOI就需要引用NPOI。引用方法如下:
在这里插入图片描述

右键点击引用,再点击添加引用
在这里插入图片描述
再点击浏览找到NPOI文件勾选上,然后确定就引用成功了。
//把 “form表单里面action名称”从Session中移除避免残留以前数据
Session.Remove(“form表单里面action名称”);
//然后这里是判断页面传过来的文件是否为Excel表格,获取文件的后缀,后缀大写小写都可以,GetExtension是获取的方法,Equals是判断文件后缀和自定义名是否具有相同的值,否则提醒数据异常。
string 自定义名 = System.IO.Path.GetExtension(file.文件名字);
if (“文件后缀”.Equals(自定义名) || “文件后缀”.Equals(自定义名))
{//这里写声明一个二进制数组来接收文件,这里new一个byte类型数组,后面的中括号是指定变量长度,它的长度就是文件内容的长度
byte[]自定义二进制数组名 = new byte[file.ContentLength];
//这里是将传入的文件转化为二进制的数组存入到上面声明的二进制数组里
file.InputStream.Read(自定义二进制数组名, 0, file.ContentLength);
//这里是创建一个内存流来保存二进制数组
MemoryStream 自定义内存流名 = new MemoryStream(自定义二进制数组名);
//这里是利用NPOI创建一个工作簿来保存内存流
NPOI.SS.UserModel.IWorkbook 工作簿= new NPOI.HSSF.UserModel.HSSFWorkbook(自定义内存流名);
//判断工作簿中是否有工作表,Sheet是数据表,大于零说明这个工作簿中就有工作表
if (工作簿.NumberOfSheets > 0)
{
//查询出的信息:用来根据名称获取对应的ID
List<数据库的表> 自定义字段1= (from 自定义字段2 in myModels. 数据库的表
select 自定义字段2).ToList();
//声明对象列表,存放导入的信息
List<自定义封装类 > 自定义名= new List<自定义封装类>();
//这里是利用NPOI获取第一个工作表,0是代表第一个
NPOI.SS.UserModel.ISheet 工作表= 工作簿.GetSheetAt(0);
//这里是判断它的物理行数是否大于0.如果大于0就说明有数据,PhysicalNumberOfRows 获取的是物理行数,也就是不包括那些空行(隔行)的情况。
if (工作表.PhysicalNumberOfRows > 0)
{
// 将数据装到DataTable中
DataTable 自定义表名 = new DataTable();
//获取标题行,通过GetRow获取第一行
NPOI.SS.UserModel.IRow 表头行 =工作表.GetRow(0);
// LastCellNum表示获取某行的列数
int 表格列数 = rowHeader.LastCellNum;
// LastRowNum表示获取最后一个实际行的下标
int 表格行数 = sheet.LastRowNum + 1;
//这里通过一个for循环,创建dataTable中的列,循环添加标题行中各个单元格的数据,FirstCellNum表示获取某行第一个单元格下标。
for (int i = rowHeader.FirstCellNum; i < 表格列数; i++)
{
//遍历表头行中每一个单元格,获取标题行各个单元格的数据,自定义名dtColumn,rowHeader.GetCell(i)是单元格,StringCellValue指的是它单元格的值
DataColumn dtColumn = new DataColumn(rowHeader.GetCell(i).StringCellValue);
//将上面获取到的标题行的数据放到dataTable中
自定义表名.Columns.Add(dtColumn);
}
//读取Excel中的数据
//这里for循环读取Excel中的数据,声明变量i,(sheet.FirstRowNum) 第一行是标题,FirstRowNum是获取第一个实际行的下标
for (int i = sheet.FirstRowNum + 1; i < 表格行数; i++)
{
//这里利用NPOI再创建第二行,获取行数据,这里i等于1
NPOI.SS.UserModel.IRow row = sheet.GetRow(i);
//创建DataTable行,创建的这个row
DataRow 创建的行 = 自定义表名.NewRow();
if (row != null)
{
//遍历循环excel中一行所有的单元格,声明变量j,这里的row等于我现在创建的第二行,FirstCellNum表示获取某行第一个单元格下标,row.FirstCellNum这个就表示第二行的第一个单元格下标
for (int j = row.FirstCellNum; j < 表格列数; j++)
{
//从第一个单元格开始如果它不等于空
if (row.GetCell(j) != null)
{ //从这一行里面获取到的单元格的值然后ToString转化成字符串
创建的行[j] = row.GetCell(j).ToString();
}
}
}
//新行添加到dataTable中
自定义表名.Rows.Add(创建的行);
}
int ImportSuccess = 0;//声明变量记录成功的条数
int ImportFail = 0;//声明变量记录失败的条数
// foreach遍历循环dataTable中的数据
foreach (DataRow row in 自定义表名.Rows)
{
//创建自定义封装类保存每一条数据
自定义封装类 自定义名 = new 自定义封装类();
try {
//获取ID和名称,通过dataTable中的名称到对应表中查找相应的ID,SingleOrDefault:返
回序列中的唯一元素,如果该序列为空,则返回默认值,如果该序列包含多个元素则出发常。
这里就只写一个示例
自定义名.对应名称 = row[“名称”].ToString().Trim();
自定义名.对应ID =对应表.Where(m => m.对应名称 == 自定义名. 对应名称).SingleOrDefault().对应ID;
例:student.AcademeName = row[“略略略”].ToString().Trim();
student.AcademeID = dbAcademe.Where(m => m.AcademeName == student.AcademeName).SingleOrDefault().AcademeID;
//按照上面获取的依次写
自定义名.对应的信息 = row[“名字”].ToString().Trim();
例子: student.StudentName = row[“姓名”].ToString().Trim();
//将每一条数据都添加到对象列表中
对象列表的自定义名.Add(自定义名);
ImportSuccess++;
}
catch (Exception)
{判断语句}}
//将数据保存到session中
Session[“表”] = 对象列表的自定义名;
判断语句}
else
{判断语句}}
else
{判断语句}}
else
{判断语句}}
catch (Exception)
{判断语句}
return Json(returnJson, JsonRequestBehavior.AllowGet); }
然后再接着写提取Session中的数据、并进行分页操作的方法
public ActionResult 自定义方法名(LayuiTablePage layuiTablePage)
// LayuiTablePage是layui table组件分页请求的数据封装,Page表示当前页码,limit表示每页的数据量,GetStartIndex表示分页开始序号,GetEndIndex表示分页结束序号,如图一所示
// LayuiTableData是自定义封装类,count表示总行数,data表示数据,如图二所示
在这里插入图片描述
![在这里插入图片描述](https://img-blog.csdnimg.cn/20190605130949368.png在这里插入图片描述

    {
        List<对象列表 > layuiTableData = new List<对象列表>();
        if (Session["表单"] != null)
        {//如果这个表的数据不等于空
            上面的自定义对象列表名 = Session["ImportExcel"] as List<对象表 >;}
        //计算数据总条数就如同查询一样就不讲le。 

然后再接着写保存导入的Excel表格数据到数据库的方法
public ActionResult 自定义方法名()
{
string strMsg = “”;
try
{
int successCount = 0;//记录保存成功的数据条数
int oldCount = 0;//记录因于数据库已有数据重复而保存失败的数据条数
//保存的数据从Session中拿
List<对象列表 > 自定义名 = new List<对象列表 >();
if (Session[“ImportExcel”] != null)
{
上面的自定义对象列表名 = Session[“ImportExcel”] as List<对象列表 >;
}
foreach (对象列表 局部变量 in 上面的自定义对象列表名)
{
//如果保存到数据库的大于一那么保存成功
if (myModels.SaveChanges() > 0)
{ 判断语句;
catch (Exception)
{判断语句}
return Json(strMsg, JsonRequestBehavior.AllowGet); }页面输出效果图
在这里插入图片描述

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值