Excel的导入与导出
Excel的导入与导出
在Excel中,先有工作表,再有行,再有单元格
导入与导出从感觉上来说就是两个颠倒过来,顺序进行了颠倒;
导出:是把数据库里面的数据写到Excel里面,通过下载的方式返回给我们
导入:要先下载一个模板,然后把里面的数据导入到数据库里面
一:导入Excel的步骤:
-
下载模板(模板由开发人员确定)(文件的格式:.xls)
-
根据模板填写数据
-
用户上传数据 - 导入数据
提醒:(在项目运行的时候,不可以同时打开Excel)
○1:先在页面上面添加布局
Layui支持在表头上面布局Toolbar:会在顶部开启一个工具条
○2:创建一个模态框
在模态框里面放两个按钮,下载和上传
打开模态框
只要是跟下载相关的直接使用windon.open()
○3:去后台写DownImportTemplate()方法
需要新建文件夹(Document),在新建的文件夹里面放入模板
导入模板下载
○4:上传就是文件的上传(原生JS)
上传的点击事件
判断files大于0
[0]:代表的是第一个元素;
再发送数据xhr.send(formData);
指定提交类型和选择要发动的地址,上传文件只能使用POST请求.不能使用get请求;
要确定自己返回的是json格式
然后关闭模态框,刷新表格
○5:导入部分思路:
- 获取上传的文件;
- 把文件转换为二进制数组;
- 二进制数组转成内存流;
- 利用NPOI把内存流中的数据读取Excel;
我们先判断文件的后缀是否合适(.xls),可以忽略大小写
把文件转换为二进制数组;
判断workbook.NumberOfSheets是否大于0.如果大于0就代表存在表,如果小于0就代表没有表,提示用户“上传的Excel中不存在工作簿,请检查”
获取第一个工作表,根据索引去获取
再去判断工作簿中是否存在行(用if(){ }else(){ })
PhysicalNumberOfRows 是物理行的行数,不包含空行;
定义一个DataTable,DataTable需要引用(using System.Data;);
这里还可以获取行数(获取表格的行数要用工作表来获取,获取列要用行来获取);
创建DateTable中的列(直接用for循环)
读取Excel中的数据,继续用for循环,i要等于(sheet.FirstRowNum+2) 第一行是说明行 第二行是标题行,第三行开始才是数据
遍历数据
再用if判断行不等于null
然后再for循环遍历行中列获取数据,再进行判断,然后将一行的数据添加到Datatable;
接下来要再移除空行,直接调用
将dataTable中的数据转换为List<S_User>,这里最多的是判断,还要去数组库中查询所有的数组
最后进行保存,保存用户数组(for循环),然后提交事务
二:导出Excel
数据的导出利用了浏览器的文件下载功能,需要把下载的链接去新窗口打开(windon.open)
先连表查询,然后判断是否有时间段,在查询总行数
再去写方法,方法里面的第一步也是先把导出的数据查询出来
C#不支持直接进行Excel操作,所以我们需要第三方主键,有两种方法
- msoffice Excel(连接其他电脑版本要一致,版本对不上连接不上)
- NPOI(是一个库文件,专门来操作文档)
主要用他的(.xls)功能
先添加引用(NPOI)
要用try(){ }cath(){ }获取一下异常
再创建工作表sheet
修改工作表有两种方式
第一种是直接修改
第二种是先创建工作表,再修改
创建行row,设置表的标题,设置行高
再创建单元格,单元格设置值,设置单元格样式
设置表头,创建一行,索引为1,创建表头的样式(同上)
遍历查询到的数据(for循环创建数据部分行列),设置表格的数据
创建数据的内部部分,然后设置单元格的样式
再给每个单元格添加样式
再用for循环设置列宽为自动适应
二.1使用模板的方式导出Excel
先写好模板,模板里面设置标题,文字的格式,然后直接用代码填充
获取模板的文件路径
判断文件是否存在(if),如果不存在直接提示用户
使用文件打开模板文件(open)
设置标题,如果筛选时间段不为空就拼接上筛选事件段(if());
设置数据单元格的样式,遍历查询出的数据
然后再以流的方式返回