导入Excel数据

下面是我最近学习的对导入Excel数据的总结
//首先在视图层引入layui插件,加载&&初始化layui模块,初始化导入数据临时表
//这里是加载&&初始化layui模块
layui.use([‘layer’, ‘table’], function () {
layer = layui.layer,
layuiTable = layui.table;
//这里是初始化导入数据临时表
临时表 = layuiTable.render({
elem: “#临时表id”,
//下面信息的名称要和数据表的名称一致,相当于设置了临时表的表头,这里我就只写一个了
cols: [[
{ type: ‘numbers’, title: ‘序号’ },//根据数据的条数给你排序
{ field: ‘对应的数据库里面的名字’, title: ‘表头名字’, align: ‘center’ },
……
]],
page: {
limit: 10,//每页显示数据的条数
limits: [5, 10, 15, 20, 25, 30, 35, 40, 45, 50],//每页条数的选项
},
data: []
});
});
//然后再接着写弹出导入Excel的模态框
function 自定义点击事件名称() {
//然后再重置清空表单
$("#表单id “).resetForm();
//这下面是禁用保存到数据库的按钮,因为你是先放到临时表,避免失误保存到数据库,最后一步才是保存到数据库
$(”#保存到数据库的按钮ID “).prop(“disabled”, true);
//清空临时表相当于刷新的效果,reload是表格数据重载,注意上面要声明tabStudentImport全局变量用来放临时表,就是模态框里面的表,弹出模态框的时候然你看一下你的Excel表格有哪些数据
临时表id.reload({
url: “”,//请求路径为空
data: []//加上这个是因为路径为空,为了防止报错给了个空数据源
});
//这下面是点击背景时不关闭动态模态框,按下esc时不关闭动态模态框,只能点X才能关闭
$(”#模态框id").modal({
backdrop: false,
keyboard: false
});
//弹出模态框
KaTeX parse error: Expected 'EOF', got '#' at position 3: ("#̲模态框id").modal("…("#选择文件的id").val() == “” || $("#选择文件的id “).val() == undefined) {
return;
}
//这里是显示加载层
var layIndex = layer.load();
//然后这里是提交表单,ajaxSubmit()提交表单:我们直接通过form提交的话,提交后当前页面跳转到form的action所指向的页面。然而,很多时候我们并不希望提交表单后页面跳转,那么,我们就可以使用ajaxSubmit(obj)来提交数据,ajaxSubmit(obj)方法是jQuery的一个插件jquery.form.js里面的方法,所以使用此方法需要先引入这个插件
$(”#表单id “).ajaxSubmit(function (Msg) {
layer.close(layIndex);
if (Msg.State) {
//启用保存到数据库的按钮
$(”#保存到数据库的按钮ID ").prop(“disabled”, false);
//表格数据重载
表格id.reload({
url: “控制器写的提取Session中的数据、并进行分页操作的自定义方法名”
});
//执行成功时输出
layer.alert(Msg.Text, { icon: 1, title: “提示” });
}
else{
//清空table
表格.reload({
url: ‘’,
data: []
});
//执行失败时输出
layer.alert(Msg.Text, { icon: 0, title: “提示” });
}
});
}
//然后再接着道控制器写将导入的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表示数据,如图二所示
| 在这里插入图片描述

    {
        List<对象列表 > layuiTableData = new List<对象列表>();
        if (Session["表单"] != null)
        {//如果这个表的数据不等于空
            上面的自定义对象列表名 = Session["ImportExcel"] as List<对象列表 >;
        }
        //计算数据总条数
        int 数据总条数自定义名 = 上面的自定义对象列表名.Count(); 
        List<对象列表> 自定义数据名= 上面的自定义对象列表名
                                  //对对象列表进行降序排序
                                  .OrderByDescending(m => m.对应ID)
                                  .Skip(layuiTablePage.GetStartIndex())
                                  .Take(layuiTablePage.limit)
                                  .ToList();
        //实例化
      LayuiTableData<对象列表> layuiTableData = new LayuiTableData<对象列表>();
        layuiTableData.count = 数据总条数自定义名;
        layuiTableData.data = 自定义数据名;
        return Json(layuiTableData, JsonRequestBehavior.AllowGet);
    }

然后再接着写保存导入的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); }
最后在视图层写保存的点击事件
function 控制器写的保存到数据库的自定义方法名()
{
var layIndex = layer.load();//打开加载层
//请求保存导入的数据的url
$.post(“控制器写的保存方法名”, function (Msg) {
layer.close(layIndex); //关闭加载层
$("#模态框id ").modal(“hide”);//关闭模态框
layer.alert(Msg, { icon: 0, title: “提示” });//输出
然后最后写刷新表格。这样就完成了导入Excel数据
});
}

猜你喜欢

转载自blog.csdn.net/weixin_44540198/article/details/89845639
今日推荐