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 ...
随机推荐
- EventBus使用详解(二)——EventBus使用进阶
一.概述 前一篇给大家装简单演示了EventBus的onEventMainThread()函数的接收,其实EventBus还有另外有个不同的函数,他们分别是: 1.onEvent2.onEventMa ...
- 关于 Oracle 的数据导入导出及 Sql Loader (sqlldr) 的用法
在 Oracle 数据库中,我们通常在不同数据库的表间记录进行复制或迁移时会用以下几种方法: 1. A 表的记录导出为一条条分号隔开的 insert 语句,然后执行插入到 B 表中2. 建立数据库间的 ...
- sd 卡驱动--基于高通平台
点击打开链接 内容来自以下博客: http://blog.csdn.net/qianjin0703/article/details/5918041 Linux设备驱动子系统第二弹 - SD卡 (有介绍 ...
- Java开发中经典的小实例-(字符串倒序输出)
public class Test12 { public static void main(String[] args) { // TODO Auto-generated meth ...
- How to install .deb file in Ubuntu
if you have a .deb file: You can install it using sudo dpkg -i /path/to/deb/file followed by sudo ap ...
- 《BI那点儿事》运用标准计分和离差——分析三国超一流统帅综合实力排名 绝对客观,数据说话
数据分析基础概念:标准计分: 1.无论作为变量的满分为几分,其标准计分的平均数势必为0,而其标准差势必为1.2.无论作为变量的单位是什么,其标准计分的平均数势必为0,而其标准差势必为1.公式为: 离差 ...
- 关于JS的数据类型的一些见解
关于js里的数据类型这块,说下个人对它的一些见地 js中的数据类型可以归类两类, 简单数据类型:string,number,boolean,null,undefined 复杂数据类型:object 其 ...
- 浏览器何时发送一个Option请求
Http Options Method 简而言之,OPTIONS请求方法的主要用途有两个: 1.获取服务器支持的HTTP请求方法: 2.用来检查服务器的性能. CORS(跨域资源共享) CORS是一种 ...
- GC overhead limit exceeded填坑心得
我遇到这样的问题,本地部署时抛出异常java.lang.OutOfMemoryError:GC overhead limit exceeded导致服务起不来,查看日志发现加载了太多资源到内存,本地的性 ...
- 基于线程池和连接池的Http请求
背景:最新项目需求调用http接口,所以打算使用最新的httpClient客户端写一个工具类,写好了以后在实际应用过程中遇到了一些问题,因为数据量还算 大,每次处理大概要处理600-700次请求,平均 ...