Asp.Net异步导入Excel
故事:用户在页面上传一个excel文件,程序把excel里的内容入库。
技术方案:保存文件在服务器,jquey Ajax 异步读取文件中的记录到数据库,在页面实时刷新导入情况
页面前端
- <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="ImportUsers.aspx.cs" Inherits="Community.WebUI.zsclient.ImportUsers" %>
- <!DOCTYPE html>
- <html xmlns="http://www.w3.org/1999/xhtml">
- <head runat="server">
- <title></title>
- <script type="text/javascript" src="js/jquery.min.js"></script>
- <script type="text/javascript">
- function importUserOnce(f, r) {
- $.ajax({
- url: "ImportUsers.aspx/ImportUserOnce", type: "POST", contentType: "application/json;charset=utf-8", data: "{ 'f': '" + f + "' ,'r':'" + r + "'}", dataType: "json", cache: false,
- success: function (msg) {
- var m = msg.d.split(',');
- var rowNumber = m[0];
- var rowCount = m[1];
- $("#<%=txtResult.ClientID%>").append(m[2]);
- if (rowNumber != rowCount) {
- $("#spanMsg").text("正在导入用户,已导入"+rowNumber+"用户,根据用户多少可能需要一段时间,请您耐心等候……");
- importUserOnce(f, rowNumber);
- }
- else {
- $("#<%=btnSubmitExcel.ClientID%>").removeAttr("disabled");
- $("#spanMsg").text("完成,总用户数"+rowCount);
- }
- },
- error: function (request, err,ex) {
- $("#spanMsg").text(err);
- $("#<%=btnSubmitExcel.ClientID%>").removeAttr("disabled");
- }
- })
- return;
- }
- </script>
- </head>
- <body>
- <form id="form1" runat="server">
- <div>
- <table style="margin-left: auto; margin-right: auto;">
- <tr>
- <th>从Excel导入用户</th>
- </tr>
- <tr>
- <td>
- <asp:FileUpload ID="FileUpload1" runat="server" /><asp:Button ID="btnSubmitExcel" runat="server" Text="确定" OnClick="btnSubmitExcel_Click" />
- <input runat="server" id="txtFName" type="hidden" />
- <span id="spanMsg"></span>
- </td>
- </tr>
- </table>
- <div style="width: 800px; height: 600px; margin-left: auto; margin-right: auto;">
- <div id="txtResult" runat="server" style="width: 800px; height: 600px; overflow: scroll; border: 1px solid #ccc;">
- </div>
- </div>
- </div>
- </form>
- <script type="text/javascript">
- var fvalue = "";
- var int = self.setInterval("clock()", 50)
- function clock() {
- fvalue = $("#<%=txtFName.ClientID%>").val();
- if (fvalue != "") {
- int = window.clearInterval(int);
- importUserOnce(fvalue, 0);
- $("#<%=btnSubmitExcel.ClientID%>").attr("disabled", "disabled");
- $("#spanMsg").text("正在导入用户,根据用户多少可能需要一段时间,请您耐心等候……");
- }
- }
- </script>
- </body>
- </html>
后台代码
- [WebMethod]
- public static string ImportUserOnce(string f, string r)
- {
- string fileName = AppDomain.CurrentDomain.BaseDirectory + "/zsclient/" + f;
- if (!System.IO.File.Exists(fileName))
- {
- return fileName + "0,0,不存在";
- }
- int rowIndex = ;
- if (!int.TryParse(r, out rowIndex) || rowIndex < )
- {
- return "0,0,rowIndex格式错误";
- }
- FileStream stream = File.OpenRead(fileName);
- IWorkbook workbook;
- if (fileName.EndsWith("xls"))
- {
- workbook = new HSSFWorkbook(stream);//从流内容创建Workbook对象
- }
- else
- {
- workbook = new XSSFWorkbook(stream);//从流内容创建Workbook对象
- }
- ISheet sheet = workbook.GetSheetAt();//获取第一个工作表
- int rowCount = sheet.LastRowNum;
- string strStatus = "";
- if (rowIndex <= rowCount)
- { int userNum = ;
- while (rowIndex < rowCount && userNum < )
- {
- if (sheet.GetRow(rowIndex).GetCell() == null || sheet.GetRow(rowIndex).GetCell() == null)
- {
- rowIndex++;
- userNum++;
- continue;
- }
- UserInfo objUser = new UserInfo()
- {
- Username = sheet.GetRow(rowIndex).GetCell().ToString();
- Password = sheet.GetRow(rowIndex).GetCell().ToString(),
- };
- UserCreateStatus userCreateStatus = CreateUser(ref objUser);
- if (userCreateStatus != UserCreateStatus.Success)
- {
- switch (userCreateStatus)
- {
- case UserCreateStatus.InvalidPassword:
- strStatus += "用户" + strName + "密码不符合要求,密码长度6-20位\r\n<br/>";
- break;
- case UserCreateStatus.UserAlreadyRegistered:
- strStatus += "用户名" + strName + "已存在\r\n<br/>";
- break;
- case UserCreateStatus.UsernameAlreadyExists:
- strStatus += "用户名" + strName + "已存在\r\n<br/>";
- break;
- case UserCreateStatus.InvalidUserName:
- strStatus += "用户名" + strName + "不符合要求,4-20位字母或数字\r\n<br/>";
- break;
- default:
- strStatus += UserController.GetUserCreateStatus(userCreateStatus);
- break;
- }
- }
- else
- {
- strStatus += strName + "导入成功\r\n<br/>";
- }
- userNum++;
- rowIndex++;
- }
- }
- return rowIndex.ToString() + "," + rowCount.ToString() + "," + strStatus;
- }
读取excel文件采用NPOI
using NPOI.HSSF.UserModel;
using NPOI.SS.UserModel;
using NPOI.XSSF.UserModel;
提供一个OLEDB方法
- private static DataSet GetDataFromExcel(string fileName)
- {
- string connStr;
- if (fileName.EndsWith(".xls"))
- connStr = "Provider=Microsoft.Jet.OLEDB.4.0;" + "Data Source=" + fileName + ";" + ";Extended Properties=\"Excel 8.0;HDR=YES;IMEX=1\"";
- else
- connStr = "Provider=Microsoft.ACE.OLEDB.12.0;" + "Data Source=" + fileName + ";" + ";Extended Properties=\"Excel 12.0;HDR=YES;IMEX=1\"";
- string sql_F = "Select * FROM [{0}]";
- OleDbConnection conn = null;
- OleDbDataAdapter da = null;
- DataTable dtSheetName = null;
- DataSet ds = new DataSet();
- try
- {
- // 初始化连接,并打开
- conn = new OleDbConnection(connStr);
- conn.Open();
- // 获取数据源的表定义元数据
- string SheetName = "";
- dtSheetName = conn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, new object[] { null, null, null, "TABLE" });
- // 初始化适配器
- da = new OleDbDataAdapter();
- for (int i = ; i < dtSheetName.Rows.Count; i++)
- {
- SheetName = (string)dtSheetName.Rows[i]["TABLE_NAME"];
- if (SheetName.Contains("$") && !SheetName.Replace("'", "").EndsWith("$"))
- {
- continue;
- }
- da.SelectCommand = new OleDbCommand(String.Format(sql_F, SheetName), conn);
- DataSet dsItem = new DataSet();
- da.Fill(dsItem, SheetName);
- ds.Tables.Add(dsItem.Tables[].Copy());
- }
- }
- catch (Exception ex)
- {
- }
- finally
- {
- // 关闭连接
- if (conn.State == ConnectionState.Open)
- {
- conn.Close();
- da.Dispose();
- conn.Dispose();
- }
- }
- return ds;
- }
Asp.Net异步导入Excel的更多相关文章
- JavaScript日历控件开发 C# 读取 appconfig文件配置数据库连接字符串,和配置文件 List<T>.ForEach 调用异步方法的意外 ef 增加或者更新的习惯思维 asp.net core导入excel 一个二级联动
JavaScript日历控件开发 概述 在开篇之前,先附上日历的代码地址和演示地址,代码是本文要分析的代码,演示效果是本文要实现的效果代码地址:https://github.com/aspwebc ...
- Asp.Net Core 导入Excel数据到Sqlite数据库并重新导出到Excel
Asp.Net Core 导入Excel数据到Sqlite数据库并重新导出到Excel 在博文"在Asp.Net Core 使用 Sqlite 数据库"中创建了ASP.NET Co ...
- ASP.NET MVC导入excel到数据库
MVC导入excel和webform其实没多大区别,以下为代码: 视图StationImport.cshtml的代码: @{ ViewBag.Title = "StationImport&q ...
- POI异步导入Excel兼容xsl和xlsx
项目架构:spring+struts2+hibernate4+oracle 需求:用户导入excel文件,导入到相应的数据表中,要求提供导入模板,支持xls和xlsx文件 思路分析: 1.提供一个下载 ...
- asp.net core导入excel
接昨天的导出 导入excel内容 对比昨天导出的内容增加了一行实体属性名称作为标题行,这样到转换为实体的时候才能找到对应的属性. 导入代码 public IActionResult InportExc ...
- MVC异步 导入excel文件
View页面 js文件.封装到一个js文件里面 (function ($) { //可以忽略 var defaultSettings = { url: "http://upload.zhtx ...
- ASP.NET MVC 导入Excel文件
一:view部分 <form method="post" enctype="multipart/form-data" action="/Posi ...
- ASP.NET MVC 导入Excel文件(完整版)
View视图部分: <form method="post" enctype="multipart/form-data" action="/Pos ...
- ASP.NET导入Excel到SQL数据库
protected void btnChange_Click(object sender, EventArgs e) { UserInfoClass tClass = (UserInfoClass)S ...
随机推荐
- Viking Village维京村落demo中的粒子距离消隐
Custom/DistanceFade shader 粒子雾似乎可以使用.尝试给面片套用该效果,但由于有顶点变形,效果不太好,要做些改动
- CyclicBarrier和CountDownLatch的差别
CyclicBarrier和CountDownLatch都用多个线程之间的同步,共同点:同时有N个线程在 CyclicBarrier(CountDownLatch) 等待上等待时,CyclicBarr ...
- js与jquery的用法
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />后面加上 ...
- CentOS安装Nvidia显卡驱动提示Nouveau正在使用的问题
如题,在安装Nvidia官方提供的驱动时,提示Nouveau正在被使用,需要停用后才能继续安装,在网上搜了不少方法,各种尝试后均无效. 最后通过设置内核启动参数给屏蔽了,方法如下: 切换到root用户 ...
- 9----Lua中的面向对象
什么是面向对象? 使用对象.类.继承.封装.消息等基本概念来进行程序设计 面向对象最重要的两个概念就是:对象和类 对象是系统中用来描述客观事物的一个实体,它是构成系统的一个基本单位 一个对象由一组属性 ...
- Criterion & DetachedCriteria
今天笔记主要是记录笔记,以及代码: criteria: 创建查询接口:createCriteria(class) 查询条件接口:add(各种条件); Restrictions 提供了设置参数的各种接口 ...
- python 发送邮件实例
留言板回复作者邮件提醒 -----------2016-5-11 15:03:58-- source:python发送邮件实例
- Codeforces Round #263 (Div. 1)
B 树形dp 组合的思想. Z队长的思路. dp[i][1]表示以i为跟结点的子树向上贡献1个的方案,dp[i][0]表示以i为跟结点的子树向上贡献0个的方案. 如果当前为叶子节点,dp[i][0] ...
- php总结 --- 10. xml操作
xml 和array互换 /** * 数组编码为XML * @param array $data 数据 * @return mixed 编码后数据 */ function xmlencode($dat ...
- Go文件操作
UNIX 的一个基础设计就是"万物皆文件"(everything is a file).我们不必知道一个文件到底映射成什么,操作系统的设备驱动抽象成文件.操作系统为设备提供了文件格 ...