故事:用户在页面上传一个excel文件,程序把excel里的内容入库。

技术方案:保存文件在服务器,jquey Ajax 异步读取文件中的记录到数据库,在页面实时刷新导入情况

页面前端

  1. <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="ImportUsers.aspx.cs" Inherits="Community.WebUI.zsclient.ImportUsers" %>
  2.  
  3. <!DOCTYPE html>
  4.  
  5. <html xmlns="http://www.w3.org/1999/xhtml">
  6. <head runat="server">
  7. <title></title>
  8. <script type="text/javascript" src="js/jquery.min.js"></script>
  9. <script type="text/javascript">
  10. function importUserOnce(f, r) {
  11. $.ajax({
  12. url: "ImportUsers.aspx/ImportUserOnce", type: "POST", contentType: "application/json;charset=utf-8", data: "{ 'f': '" + f + "' ,'r':'" + r + "'}", dataType: "json", cache: false,
  13. success: function (msg) {
  14. var m = msg.d.split(',');
  15. var rowNumber = m[0];
  16. var rowCount = m[1];
  17. $("#<%=txtResult.ClientID%>").append(m[2]);
  18. if (rowNumber != rowCount) {
  19. $("#spanMsg").text("正在导入用户,已导入"+rowNumber+"用户,根据用户多少可能需要一段时间,请您耐心等候……");
  20. importUserOnce(f, rowNumber);
  21. }
  22. else {
  23. $("#<%=btnSubmitExcel.ClientID%>").removeAttr("disabled");
  24. $("#spanMsg").text("完成,总用户数"+rowCount);
  25. }
  26. },
  27. error: function (request, err,ex) {
  28. $("#spanMsg").text(err);
  29. $("#<%=btnSubmitExcel.ClientID%>").removeAttr("disabled");
  30. }
  31. })
  32. return;
  33. }
  34. </script>
  35. </head>
  36. <body>
  37. <form id="form1" runat="server">
  38. <div>
  39.  
  40. <table style="margin-left: auto; margin-right: auto;">
  41. <tr>
  42. <th>从Excel导入用户</th>
  43. </tr>
  44. <tr>
  45. <td>
  46. <asp:FileUpload ID="FileUpload1" runat="server" /><asp:Button ID="btnSubmitExcel" runat="server" Text="确定" OnClick="btnSubmitExcel_Click" />
  47. <input runat="server" id="txtFName" type="hidden" />
  48. <span id="spanMsg"></span>
  49. </td>
  50. </tr>
  51. </table>
  52. <div style="width: 800px; height: 600px; margin-left: auto; margin-right: auto;">
  53. <div id="txtResult" runat="server" style="width: 800px; height: 600px; overflow: scroll; border: 1px solid #ccc;">
  54. </div>
  55. </div>
  56.  
  57. </div>
  58. </form>
  59. <script type="text/javascript">
  60. var fvalue = "";
  61. var int = self.setInterval("clock()", 50)
  62. function clock() {
  63. fvalue = $("#<%=txtFName.ClientID%>").val();
  64. if (fvalue != "") {
  65. int = window.clearInterval(int);
  66. importUserOnce(fvalue, 0);
  67. $("#<%=btnSubmitExcel.ClientID%>").attr("disabled", "disabled");
  68. $("#spanMsg").text("正在导入用户,根据用户多少可能需要一段时间,请您耐心等候……");
  69. }
  70. }
  71. </script>
  72. </body>
  73. </html>

后台代码

  1. [WebMethod]
  2. public static string ImportUserOnce(string f, string r)
  3. {
  4. string fileName = AppDomain.CurrentDomain.BaseDirectory + "/zsclient/" + f;
  5. if (!System.IO.File.Exists(fileName))
  6. {
  7. return fileName + "0,0,不存在";
  8. }
  9. int rowIndex = ;
  10. if (!int.TryParse(r, out rowIndex) || rowIndex < )
  11. {
  12. return "0,0,rowIndex格式错误";
  13. }
  14.  
  15. FileStream stream = File.OpenRead(fileName);
  16. IWorkbook workbook;
  17. if (fileName.EndsWith("xls"))
  18. {
  19.   workbook = new HSSFWorkbook(stream);//从流内容创建Workbook对象
  20. }
  21. else
  22. {
  23. workbook = new XSSFWorkbook(stream);//从流内容创建Workbook对象
  24. }
  25. ISheet sheet = workbook.GetSheetAt();//获取第一个工作表
  26. int rowCount = sheet.LastRowNum;
  27.  
  28. string strStatus = "";
  29. if (rowIndex <= rowCount)
  30. { int userNum = ;
  31.  
  32. while (rowIndex < rowCount && userNum < )
  33. {
  34. if (sheet.GetRow(rowIndex).GetCell() == null || sheet.GetRow(rowIndex).GetCell() == null)
  35. {
  36. rowIndex++;
  37. userNum++;
  38. continue;
  39. }
  40. UserInfo objUser = new UserInfo()
  41. {
  42. Username = sheet.GetRow(rowIndex).GetCell().ToString();
  43. Password = sheet.GetRow(rowIndex).GetCell().ToString(),
  44.  
  45. };
  46. UserCreateStatus userCreateStatus = CreateUser(ref objUser);
  47. if (userCreateStatus != UserCreateStatus.Success)
  48. {
  49.  
  50. switch (userCreateStatus)
  51. {
  52. case UserCreateStatus.InvalidPassword:
  53. strStatus += "用户" + strName + "密码不符合要求,密码长度6-20位\r\n<br/>";
  54. break;
  55. case UserCreateStatus.UserAlreadyRegistered:
  56. strStatus += "用户名" + strName + "已存在\r\n<br/>";
  57. break;
  58. case UserCreateStatus.UsernameAlreadyExists:
  59. strStatus += "用户名" + strName + "已存在\r\n<br/>";
  60. break;
  61. case UserCreateStatus.InvalidUserName:
  62. strStatus += "用户名" + strName + "不符合要求,4-20位字母或数字\r\n<br/>";
  63. break;
  64. default:
  65. strStatus += UserController.GetUserCreateStatus(userCreateStatus);
  66. break;
  67. }
  68. }
  69. else
  70. {
  71. strStatus += strName + "导入成功\r\n<br/>";
  72. }
  73. userNum++;
  74. rowIndex++;
  75. }
  76. }
  77. return rowIndex.ToString() + "," + rowCount.ToString() + "," + strStatus;
  78. }

读取excel文件采用NPOI

using NPOI.HSSF.UserModel;
using NPOI.SS.UserModel;
using NPOI.XSSF.UserModel;

提供一个OLEDB方法

  1. private static DataSet GetDataFromExcel(string fileName)
  2. {
  3. string connStr;
  4. if (fileName.EndsWith(".xls"))
  5. connStr = "Provider=Microsoft.Jet.OLEDB.4.0;" + "Data Source=" + fileName + ";" + ";Extended Properties=\"Excel 8.0;HDR=YES;IMEX=1\"";
  6. else
  7. connStr = "Provider=Microsoft.ACE.OLEDB.12.0;" + "Data Source=" + fileName + ";" + ";Extended Properties=\"Excel 12.0;HDR=YES;IMEX=1\"";
  8.  
  9. string sql_F = "Select * FROM [{0}]";
  10.  
  11. OleDbConnection conn = null;
  12. OleDbDataAdapter da = null;
  13. DataTable dtSheetName = null;
  14.  
  15. DataSet ds = new DataSet();
  16. try
  17. {
  18. // 初始化连接,并打开
  19. conn = new OleDbConnection(connStr);
  20. conn.Open();
  21.  
  22. // 获取数据源的表定义元数据
  23. string SheetName = "";
  24. dtSheetName = conn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, new object[] { null, null, null, "TABLE" });
  25.  
  26. // 初始化适配器
  27. da = new OleDbDataAdapter();
  28. for (int i = ; i < dtSheetName.Rows.Count; i++)
  29. {
  30. SheetName = (string)dtSheetName.Rows[i]["TABLE_NAME"];
  31.  
  32. if (SheetName.Contains("$") && !SheetName.Replace("'", "").EndsWith("$"))
  33. {
  34. continue;
  35. }
  36.  
  37. da.SelectCommand = new OleDbCommand(String.Format(sql_F, SheetName), conn);
  38. DataSet dsItem = new DataSet();
  39. da.Fill(dsItem, SheetName);
  40.  
  41. ds.Tables.Add(dsItem.Tables[].Copy());
  42. }
  43. }
  44. catch (Exception ex)
  45. {
  46.  
  47. }
  48. finally
  49. {
  50. // 关闭连接
  51. if (conn.State == ConnectionState.Open)
  52. {
  53. conn.Close();
  54. da.Dispose();
  55. conn.Dispose();
  56. }
  57. }
  58. return ds;
  59. }

Asp.Net异步导入Excel的更多相关文章

  1. JavaScript日历控件开发 C# 读取 appconfig文件配置数据库连接字符串,和配置文件 List<T>.ForEach 调用异步方法的意外 ef 增加或者更新的习惯思维 asp.net core导入excel 一个二级联动

    JavaScript日历控件开发   概述 在开篇之前,先附上日历的代码地址和演示地址,代码是本文要分析的代码,演示效果是本文要实现的效果代码地址:https://github.com/aspwebc ...

  2. Asp.Net Core 导入Excel数据到Sqlite数据库并重新导出到Excel

    Asp.Net Core 导入Excel数据到Sqlite数据库并重新导出到Excel 在博文"在Asp.Net Core 使用 Sqlite 数据库"中创建了ASP.NET Co ...

  3. ASP.NET MVC导入excel到数据库

    MVC导入excel和webform其实没多大区别,以下为代码: 视图StationImport.cshtml的代码: @{ ViewBag.Title = "StationImport&q ...

  4. POI异步导入Excel兼容xsl和xlsx

    项目架构:spring+struts2+hibernate4+oracle 需求:用户导入excel文件,导入到相应的数据表中,要求提供导入模板,支持xls和xlsx文件 思路分析: 1.提供一个下载 ...

  5. asp.net core导入excel

    接昨天的导出 导入excel内容 对比昨天导出的内容增加了一行实体属性名称作为标题行,这样到转换为实体的时候才能找到对应的属性. 导入代码 public IActionResult InportExc ...

  6. MVC异步 导入excel文件

    View页面 js文件.封装到一个js文件里面 (function ($) { //可以忽略 var defaultSettings = { url: "http://upload.zhtx ...

  7. ASP.NET MVC 导入Excel文件

    一:view部分 <form method="post" enctype="multipart/form-data" action="/Posi ...

  8. ASP.NET MVC 导入Excel文件(完整版)

    View视图部分: <form method="post" enctype="multipart/form-data" action="/Pos ...

  9. ASP.NET导入Excel到SQL数据库

    protected void btnChange_Click(object sender, EventArgs e) { UserInfoClass tClass = (UserInfoClass)S ...

随机推荐

  1. Viking Village维京村落demo中的粒子距离消隐

    Custom/DistanceFade shader 粒子雾似乎可以使用.尝试给面片套用该效果,但由于有顶点变形,效果不太好,要做些改动

  2. CyclicBarrier和CountDownLatch的差别

    CyclicBarrier和CountDownLatch都用多个线程之间的同步,共同点:同时有N个线程在 CyclicBarrier(CountDownLatch) 等待上等待时,CyclicBarr ...

  3. js与jquery的用法

    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />后面加上 ...

  4. CentOS安装Nvidia显卡驱动提示Nouveau正在使用的问题

    如题,在安装Nvidia官方提供的驱动时,提示Nouveau正在被使用,需要停用后才能继续安装,在网上搜了不少方法,各种尝试后均无效. 最后通过设置内核启动参数给屏蔽了,方法如下: 切换到root用户 ...

  5. 9----Lua中的面向对象

    什么是面向对象? 使用对象.类.继承.封装.消息等基本概念来进行程序设计 面向对象最重要的两个概念就是:对象和类 对象是系统中用来描述客观事物的一个实体,它是构成系统的一个基本单位 一个对象由一组属性 ...

  6. Criterion & DetachedCriteria

    今天笔记主要是记录笔记,以及代码: criteria: 创建查询接口:createCriteria(class) 查询条件接口:add(各种条件); Restrictions 提供了设置参数的各种接口 ...

  7. python 发送邮件实例

    留言板回复作者邮件提醒 -----------2016-5-11 15:03:58-- source:python发送邮件实例

  8. Codeforces Round #263 (Div. 1)

    B 树形dp 组合的思想. Z队长的思路. dp[i][1]表示以i为跟结点的子树向上贡献1个的方案,dp[i][0]表示以i为跟结点的子树向上贡献0个的方案. 如果当前为叶子节点,dp[i][0] ...

  9. php总结 --- 10. xml操作

    xml 和array互换 /** * 数组编码为XML * @param array $data 数据 * @return mixed 编码后数据 */ function xmlencode($dat ...

  10. Go文件操作

    UNIX 的一个基础设计就是"万物皆文件"(everything is a file).我们不必知道一个文件到底映射成什么,操作系统的设备驱动抽象成文件.操作系统为设备提供了文件格 ...