文献种类:专题技术总结文献;
开发工具与关键技术:MVC与 C#
作者: 阮旭安 ;年级: 1903 ;撰写时间:2020 年 月 8 日
文件(Excel)导入/图片上传
开发工具与关键技术:VS MVC(Microsoft Visual Studio) C# DW SQL
作者:阮旭安
撰写时间:2020年8月8日
导入 Excel
一目录:1下载模板 .xls
2.用户根据模板填写数据
3.用户上传数据-导入
----导入部分思路
1.获取上传的文件;
2.把文件转换为二进制数组;(因为所有的文件都是0和1)
3.二进制数组转成内存流;
4.利用NPOI把内存流中的数据读取成Excel
5.使用NPOI读取数据
1.获取上传的文件;
①使用XMLHttpRequest上传文件
②打开指定的URL 文件上传使用POST提交
③先获取模板文件的路径,然后判断模板是否存在,文件存在获取文件名称,并且以流的形式返回文件
如下图:
2.把文件转换为二进制数组;(因为所有的文件都是0和1)
①判断文件后缀名:(StringComparison.CurrentCultureIgnoreCase):忽略大小写(.xls)
②转换成二进制数组需要声明一个和文件大小一致的二进制数组
如:byte[] fileBytes = new byte[excelFile.ContentLength];
excelFile.ContentLength:指定一个文件内容长度一致的二进制数组来存放;
③将上传的文件转换成二进制数组(把流转换到数组里面)
将 InputStream(流) 用Read(fileBytes, 0, fileBytes.Length) 把数据读到二进制的(fileBytes)数组里面去(把流转换到数组里面)
如下图:
3.二进制数组转成内存流;
①再将这个二进制数组转为 内存流(MemoryStream)
如: MemoryStream excelMemoryStream = new MemoryStream(fileBytes);
②再将内存流转为工作簿(HSSFWorkbook)
如:NPOI.SS.UserModel.IWorkbookworkbook=newNPOI.HSSF.UserModel.
HSSFWorkbook(excelMemoryStream);
4.利用NPOI把内存流中的数据读取成Excel
①判断是否存在工作表,然后获取出第一个工作表
如:NPOI.SS.UserModel.ISheet sheet = workbook.GetSheetAt(0);
GetSheetAt(0):根据索引去获取
②判断工作表中是否存在行
PhysicalNumberOfRows:代表物理存在的行,不包含空行
③将数据保存到DataTable中
DataTable是C#中的一个表格数据 它的效果和Excel差不多(格式)
④获取Excel
获取的时候会用到的
FirstCellNum:获取某行第一个单元格下标
LastCellNum:获取某行的列数 !!!!!
FirstRowNum:获取第一个实际行的下标
LastRowNum:获取最后一个实际行的下标
⑤获取列的时候是通过行去获取,获取行的时候通过工作表获取(找各自的依赖对象)
Trim():去空格
5.使用NPOI读取数据
①(sheet.FirstRowNum+2) 为什么是2 (一般)第一行是说明行 第二行是标题行,第三行开 始 参数数据(索引从0开始 )
②去除DataTable空行,先循环完再移除,不要再循环中移除空行,否则非常危险
③bool rowDataIsEmpty = true;//标识是否是空行-默认为空行
Excel插入的图片无法通过NPOI读取,因为图片被编码过,一般导入也不会放图片,图片浮动 在行和列之外
图片(文件)上传
1.在数据库(表-S_User)中添加一个 picture 字段 nvarchar():数据类型
如下图:
2.前台页面:
①绑定 οndblclick="" :双击事件
文件选择控件 隐藏 file:文件类型 accept:筛选文件类型,否则显示所有的文件
accept:筛选文件类型(不是强制),否则显示所有的文件
②FileReader:文件读取器
读取图片文件,用正则表达式过滤文件:
regexImageFilter=/^(?:image/bmp|image/gif|image/jpg|image/jpeg|image/png)
/
i
;
③
文
件
读
取
器
o
n
l
o
a
d
事
件
在
读
文
件
完
成
后
触
发
,
双
击
图
片
触
发
文
件
输
入
框
的
点
击
事
件
,
读
取
照
片
.
再
获
取
文
件
输
入
框
里
面
的
文
件
,
判
断
读
取
的
文
件
是
否
是
需
要
的
文
件
类
型
,
最
后
使
用
文
件
读
取
器
读
取
文
件
,
并
把
文
件
转
为
U
R
L
(
B
a
s
e
64
编
码
)
i
m
a
g
e
R
e
a
d
e
r
.
r
e
a
d
A
s
D
a
t
a
U
R
L
(
f
i
l
e
)
;
因
为
图
片
是
通
过
U
R
L
传
出
来
显
示
(
这
个
u
r
l
和
常
规
理
解
不
一
样
)
④
t
y
p
e
:
返
回
文
件
的
类
型
m
e
t
h
o
d
:
"
p
o
s
t
"
,
文
件
上
传
时
只
能
使
用
p
o
s
t
提
交
,
不
能
使
用
g
e
t
提
交
p
r
o
c
e
s
s
D
a
t
a
:
f
a
l
s
e
,
告
诉
j
Q
u
e
r
y
不
要
去
处
理
发
送
的
数
据
c
o
n
t
e
n
t
T
y
p
e
:
f
a
l
s
e
,
告
诉
j
Q
u
e
r
y
不
要
去
设
置
C
o
n
t
e
n
t
−
T
y
p
e
请
求
头
⑤
/i; ③文件读取器onload事件在读文件完成后触发,双击图片触发文件输入框的点击事件,读取照片.再获取文件输入框里面的文件 ,判断读取的文件是否是需要的文件类型,最后使用文件读取器读取文件,并把文件转为URL(Base64编码)imageReader.readAsDataURL(file); 因为图片是通过URL传出来显示(这个url和常规理解不一样) ④type:返回文件的类型 method: "post",文件上传时只能使用post提交,不能使用get提交 processData: false, 告诉jQuery不要去处理发送的数据 contentType: false, 告诉jQuery不要去设置Content-Type请求头 ⑤
/i;③文件读取器onload事件在读文件完成后触发,双击图片触发文件输入框的点击事件,读取照片.再获取文件输入框里面的文件,判断读取的文件是否是需要的文件类型,最后使用文件读取器读取文件,并把文件转为URL(Base64编码)imageReader.readAsDataURL(file);因为图片是通过URL传出来显示(这个url和常规理解不一样)④type:返回文件的类型method:"post",文件上传时只能使用post提交,不能使用get提交processData:false,告诉jQuery不要去处理发送的数据contentType:false,告诉jQuery不要去设置Content−Type请求头⑤("#userPicture").attr(“src”, “”);//清空图片的预览
$("#frmUser [type=‘reset’]").click();//清空表单
2.后台控制器:
①为什么不放一个二进制类型?
因为图片(文件)占的内存比较大,一般不会直接放到数据库里面去,为了避免数据库体积过 度增长,索引速度变慢,所以把文件保存到硬盘上,然后把文件的名称(路径)保存到数据库.
②保存用户头像(图片)
检查存放用户头像的目录是否存在,没有就创建一个(让它自动创建)
③判断是否上传了图片,获取文件的扩展名称,拼接要保存的文件名称,拼接文件保存的路径,保存上传的文件到硬盘.
③上传成功后记得清空表单