引言
最近公司项目全部转向前端化,故所有aspx页面业务逻辑尽可能的转到用户控件前台页面完成。以方便每次发布项目时只是替换前端页面不会影响客户体验。
既然转到前台逻辑,那么必须走后台的业务也就单独封装了一个公共一般处理程序,用CMD命令方式生成DLL。项目引用该DLL,每次有更新后台方法生成新的DLL替换原有的,避免影响线上客户。
有了这些需求铺垫,现在故针对Excel导入或者导出做了后台处理方案。
前台js获取ext:FileUploadField控件选中值上传提交至服务器一般处理程序:
var file = App.FileUploadID.getEl().down('input[type=file]').dom.files[0]; if (file == undefined) { Alert("请选择Excel文件!"); } else { var reader = new FileReader(); reader.onload = (function (theFile) { return function (e) { $.ajax({ type: "post", url: "/CommonMethodHandler.ashx", data: "Type=1&reader=" + encodeURIComponent(e.target.result), success: function (result) { Alert(result); } }); }; })(file); reader.readAsDataURL(file); }
js相关涉及到的知识点不做过多解释,如有疑问,自行百度了解。
后台C#代码:
public void TestRequest(HttpContext context) { context.Response.ContentType = "text/plain"; string Type = context.Request.Params["Type"]; string result = ""; switch (Type) { case "1": result = TestExcelImport(context); context.Response.Write(result); break; } } public string TestExcelImport(HttpContext context) { try { string str = context.Request["reader"]; var reader = str.Split(',')[1]; byte[] bytes = Convert.FromBase64String(reader); if (bytes == null) { return "请选择Excel文件"; } else { DataTable dataTable = new DataTable(); using (MemoryStream memoryStream = new MemoryStream(bytes)) { dataTable = ExcelDll.TranslateToTable(memoryStream, 0);//封装DLL,请自行百度内存流转dataTable dataTable.TableName = "TestTempData"; using (SqlBulkCopy sqlbulkcopy = new SqlBulkCopy(xEncrypt.DecryptText('连接字符串'), SqlBulkCopyOptions.UseInternalTransaction)) { try { sqlbulkcopy.DestinationTableName = "TestTempData"; sqlbulkcopy.WriteToServer(dataTable); } catch (System.Exception ex) { throw ex; } } } return "导入成功"; } } catch (Exception ex) { return ex.Message; } }
导入就实现了,导出请参考另外文章《使用Aspose插件对Excel操作》