Excel导入
首先是前端页面
导入首先需要选择文件,这时会出现第一个易错问题:不同的浏览器保护机制,会将选择文件的路径进行保护,类似"C:\\fakepath\\文件名",这样的文件路径肯定是不能获取正确的文件进行操作。
当然也有一些骚操作进行规避,比如:
1.调整浏览器的浏览器安全设置(亲测费神费力不见得好用,不同电脑使用你得疯)。
2.修改文件夹路径(这个咋说呢,真是个小机灵鬼--直接将保护路径设置成要导入的文件路径)
3.上代码(好用、通用)
HTML
html
<a class="easyui-linkbutton" onclick="select_file()" iconCls="icon-excel">导入</a>
<input type="file" name="file" id="file" onchange="fileUpload();return false;" style="display:none"/>
一个按钮和一个文件输入框。
JS
javascript
function select_file() {
$("#file").trigger("click");
}
function fileUpload() {
if (IsNullOrEmpty($('#file')[0].files[0]))//IsNullOrEmpty 这个方法自己写的 具体的自己判断下
return false;
// 创建formdata对象
var formData = new FormData();
// 给formData对象添加<input>标签,注意与input标签的ID一致
formData.append('file', $('#file')[0].files[0]);
$.ajax({
url: "/**/***", //这里写你的url
type: 'POST',
data: formData,
contentType: false, // 当有文件要上传时,此项是必须的,否则后台无法识别文件流的起始位置
processData: false, // 是否序列化data属性,默认true(注意:false时type必须是post)
dataType: 'json', //这里是返回类型,一般是json,text等
clearForm: true, //提交后是否清空表单数据
success: function (data) { //提交成功后自动执行的处理函数,参数data就是服务器返回的数据。
//成功后自己业务操作 比如加载什么的
},
error: function (data, status, e) { //提交失败自动执行的处理函数。
console.error(e);
}
});
$('#file').val(null);
}
获取文件路径搞定了,接下来将获取到的文件保存到服务器上,再然后将服务器上文件导入系统进行业务上的需求操作。
cs
public ActionResult onloadFile() //导入文件
{
string retStr = "上传成功";
int retCode = 1;
HttpRequest request = System.Web.HttpContext.Current.Request;
HttpFileCollection FileCollect = request.Files;
string path = "";//文件的完整路径
//文件保存目录路径
string imgPathName = DateTime.Now.ToString("yyyyMMdd");//以日期为文件存放的上层文件夹名
string savePath = "upload\\file\\" + imgPathName + "\\";//文件存放的完整路径
savePath = Server.MapPath("~\\") + savePath;
if (!Directory.Exists(savePath)) //定义允许上传的文件扩展名
{
Directory.CreateDirectory(savePath);
}
Hashtable extTable = new Hashtable();
extTable.Add("file", "xls,xlsx");
if (FileCollect.Count > 0)//如果集合的数量大于0,多文件上传情况
{
HttpPostedFile imgFile = FileCollect[0];//用key获取单个文件对HttpPostedFile
string fileName = imgFile.FileName;//获取文件名
string fileExt = Path.GetExtension(fileName).ToLower();//获取文件后缀名
//判断文件类型是否正确
//判断是否为IE浏览器的文件名
int unixSep = fileName.LastIndexOf('/');
int winSep = fileName.LastIndexOf('\\');
int pos = (winSep > unixSep ? winSep : unixSep);
if (pos != -1)
fileName = fileName.Substring(pos + 1);
if (Array.IndexOf(((string)extTable["file"]).Split(','), fileExt.Substring(1).ToLower()) == -1)
{
retStr = "文件类型不正确";
retCode = 2;
}
else
{
string imgPath = savePath + fileName;//构造文件保存路径
imgFile.SaveAs(imgPath);//将上传的东西保存
path = imgPath;
//调用NPOI 方法对Excel进行处理
DataTable dt = new DataTable();
if(fileName.EndsWith("xls"))
dt = NPOIExcelHelper.Import(path);
else if (fileName.EndsWith("xlsx"))
dt = NPOIExcelHelper.ImportFxlsx(path);
//将获取到的数据dt进行操作
//。。。。。。
}
}
var ret = new { code = retCode, message = retStr };
string jsonStr = JsonConvert.SerializeObject(ret);
return Content(jsonStr);
}
后台这边使用了NPOI 对EXCEL文件进行读写操作,详情就懒得写了,后台这边处理的根据自己需求来,主要是个思路。
留下个痕迹方便以后走弯路的时候回头看看。