进度条在.net导入Excel时的应用实例
这篇文章主要介绍了进度条在.net导入Excel时的应用,以实例形式讲述了.net导入Excel时根据页面情况显示进度条的实现方法,非常具有实用价值,需要的朋友可以参考下
本文实例讲述了进度条在.net导入Excel时的应用,分享给大家供大家参考。具体实现方法如下:
在程序开发过程中,往往会涉及到将Excel表格导入到数据库中的需求,而当excel表格内容很多的时候,我们往往会很难去捕捉它的执行过程进度和一些错误信息,此时我们便可以通过以下方法去解决这些难题,具体实现过程分析如下:
一、建立一个web应用程序,在程序中首先创建一个html文件命名为ProgressBar,文件内容如下:
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title></title>
<script type="text/javascript">
//开始处理
function BeginTrans(msg) {
WriteText(msg);
}
//设置进度条进度
function SetPorgressBar(msg, pos) {
ProgressBar.style.width = pos + "%";
WriteText(msg + " 已完成" + pos + "%");
}
//处理结束
function EndTrans(msg) {
if (msg == "")
WriteText("完成。");
else
WriteText(msg);
}
//设置时间信息
function SetTimeInfo(msg) {
WriteText(msg);
}
// 更新文本显示信息
function WriteText(str) {
var strTag = '<font face="Verdana, Arial, Helvetica" size="2" color="#ea9b02"><B>' + str + '</B></font>';
document.getElementById("Msg2").innerHTML = strTag;
}
</script>
</head>
<body>
<table align="center" style="height:100%">
<tr style="height:45%"><td></td></tr>
<tr>
<td>
<div id="ProgressBarSide" style="width:300px; color:Silver;border-width:1px; border-style:Solid;">
<div id="ProgressBar" align="center" style="height:20px; width:0%; "></div>
</div>
</td>
<td>
<div id="Msg2" style="height:16px;"></div>
</td>
</tr>
<tr style="height:50%"><td></td></tr>
</table>
</body>
</html>
二、创建一个aspx页面,前后端代码分别如下:
//1.这里为了简便,我只写出了前端页面中的body体部分供参考:
<form id="forms" runat = "server">
<table align="center" style="height:100%">
<tr style="height:45%"><td></td></tr>
<tr>
<td align="center" style="height: 24px; width: 100px;"> Excel文件</td>
<td style="height: 24px">
<asp:FileUpload ID="fuGlossaryXls" runat="server"/>
<asp:Label ID="Label2" runat="server" Font-Bold="True" ForeColor="Red" Text="不能为空"
Visible="False"></asp:Label></td>
<td>
<asp:Button ID="Button1" runat="server" CssClass="mybotton" Text="导入" Width="60px" onclick="Button1_Click"/></td>
</tr>
</table>
</form>
//2.后端部分代码如下:
//这里是激发导入按钮点击事件
protected void Button1_Click(object sender, EventArgs e)
{
string cfilename = this.fuGlossaryXls.FileName;//获取准备导入的文件名称
if (cfilename == "")
{
Label2.Visible = true;
return;
}
else
{
Label2.Visible = false;
}
//////////////显示进度/////////////////////////////////////////////////////////////////////////////
DateTime startTime = System.DateTime.Now;
DateTime endTime = System.DateTime.Now;
// 根据 ProgressBar.htm 显示进度条界面
string templateFileName = Path.Combine(Server.MapPath("."), "ProgressBar.htm");
StreamReader reader = new StreamReader(@templateFileName, System.Text.Encoding.GetEncoding("gb2312"));
string html = reader.ReadToEnd();
reader.Close();
Response.Write(html);
Response.Flush();
System.Threading.Thread.Sleep(1000);
string jsBlock;
// 处理完成
jsBlock = "<script>BeginTrans('正在加载数据,请耐心等待...');</script>";
Response.Write(jsBlock);
Response.Flush();
string fileName = fuGlossaryXls.PostedFile.FileName.Substring(fuGlossaryXls.PostedFile.FileName.LastIndexOf("\\") + 1);//获取准备导入文件的文件名
string suffix = fileName.Substring(fileName.LastIndexOf(".") + 1);//获取准备导入文件的后缀名
System.Threading.Thread.Sleep(200);
int maxrows = 0;//用来记录需要加载的数据总行数
bool err = false;//用来记录加载状态
int errcount = 0;//用来记录加载错误行数
if (fuGlossaryXls.HasFile)//判断当前是否有选取文件
{
if (suffix == "xlsx")
{
DataTable dt = ExcelImport(fileName);
for (int i = 0; i < dt.Rows.Count; i++)
{
maxrows++;
}
//////////拓展////////////////////////////////////////////////////////
//DataView myView = new DataView(dt);
//myView.RowFilter = "name is not null";
//int t = myView.Count;//获取满足RowFilter 条件的数据行
//////////拓展////////////////////////////////////////////////////////
string sqlconnect = "Data Source=.;Initial Catalog=test;User ID=sa;Password=123456;";//本地数据库链接
SqlConnection conn = new SqlConnection(sqlconnect);
SqlTransaction myTrans = null;
try
{
SqlCommand cmd = new SqlCommand(null, conn);
conn.Open();
myTrans = conn.BeginTransaction();
cmd.Transaction = myTrans;
cmd.CommandText = "delete from test";
cmd.ExecuteNonQuery();//首先执行清除表内容操作
for (int j = 0; j < dt.Rows.Count; j++)//循环向数据库中插入excel数据
{
if (string.IsNullOrEmpty(dt.Rows[j][0].ToString()))
{
jsBlock = "<script>EndTrans('第" + j.ToString() + "行数据写入错误。');</script>";
Response.Write(jsBlock);
Response.Flush();
err = true;
errcount++;
}
else
{
cmd.CommandText = string.Format("insert into test values('{0}','{1}','{2}','{3}')", dt.Rows[j][0], dt.Rows[j][1], dt.Rows[j][2], dt.Rows[j][3]);
cmd.ExecuteNonQuery();//逐行向表中插入数据,注意字段的对应
}
System.Threading.Thread.Sleep(1000);
float cposf = 0;
cposf = 100 * (j + 1) / maxrows;
int cpos = (int)cposf;
jsBlock = "<script>SetPorgressBar('已加载到第" + (j + 1).ToString() + "条','" + cpos.ToString() + "');</script>";
Response.Write(jsBlock);
Response.Flush();
}
myTrans.Commit();//提交
}
catch (Exception ex)
{
myTrans.Rollback();//回滚
ClientScript.RegisterStartupScript(this.GetType(), "alert", "<script>alert('" + ex.Message + "');</script>");
}
finally
{
conn.Dispose();
conn.Close();//关闭数据库连接
}
}
else
{
ClientScript.RegisterStartupScript(GetType(), "", "alert('请选择Excel文件!');", true);
}
}
else
{
ClientScript.RegisterStartupScript(GetType(), "", "alert('请选择要导入的Excel!');", true);
}
if (!err)//加载中并没有出现错误
{
// 处理完成
jsBlock = "<script>EndTrans('处理完成。');</script>";
Response.Write(jsBlock);
Response.Flush();
}
else
{
jsBlock = "<script>EndTrans('共有"+maxrows.ToString()+"条数据需要加载,其中 有"+errcount.ToString()+"条数据录入错误!');</script>";
Response.Write(jsBlock);
Response.Flush();
}
System.Threading.Thread.Sleep(1000);
endTime = DateTime.Now;//录入完成所用时间
TimeSpan ts1 = new TimeSpan(startTime.Ticks);
TimeSpan ts2 = new TimeSpan(endTime.Ticks);
TimeSpan ts = ts2.Subtract(ts1).Duration(); //取开始时间和结束时间两个时间差的绝对值
String spanTime = ts.Hours.ToString() + "小时" + ts.Minutes.ToString() + "分" + ts.Seconds.ToString() + "秒";
jsBlock = "<script>SetTimeInfo('加载完成,共用时" + spanTime + "');</script>";
Response.Write(jsBlock);
Response.Flush();
}
public DataTable ExcelImport(string fileName) //建立Excel表链接,返回Excel表数据
{
//EXCEL 的连接串
string sConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;" +
"Data Source=C:\\Documents and Settings\\Administrator\\桌面\\" + fileName + ";" +
"Extended Properties='Excel 8.0;IMEX=1';";
//string sConnectionString = "Microsoft.ACE.OLEDB.4.0;" +
//"Data Source=C:\\Documents and Settings\\Administrator\\桌面\\" + fileName + ";" +
//"Extended Properties='Excel 8.0;IMEX=1';";
OleDbConnection objConn = new OleDbConnection(sConnectionString);//建立EXCEL的连接
//说明:程序运行到这里的时候有时会出错“未在本地计算机上注册“Microsoft.ACE.OLEDB.12.0”提供程序”,此时大多数情况下我们只需要去http://download.microsoft.com/download/7/0/3/703ffbcb-dc0c-4e19-b0da-1463960fdcdb/AccessDatabaseEngine.exe下载一个AccessDatabaseEngine.exe安装即可,原因在于你的office没有安装ACCESS组件
objConn.Open();
OleDbCommand objCmdSelect = new OleDbCommand("SELECT * FROM [Sheet1$]", objConn);
OleDbDataAdapter objAdapter1 = new OleDbDataAdapter();
objAdapter1.SelectCommand = objCmdSelect;
DataSet objDataset1 = new DataSet();
objAdapter1.Fill(objDataset1, "XLData");
DataTable dt = objDataset1.Tables[0];
//DataView myView = new DataView(dt);
objConn.Close();//关闭EXCEL的连接
return dt;
}






进度条在.net导入Excel时的应用实例的更多相关文章
- SQL Server 导入excel时“该值违反了该列的完整性约束”错误
SQL Server 导入excel时“该值违反了该列的完整性约束”错误 这个问题看似高大上,仔细分析了一下,ID列怎么会有重复呢? 原来是有很多空行呀!!! 所以导入excel时一定要注意空行的问题 ...
- 圆形进度条的模仿3-DrawArc,DrawCircle,DrawText,自定义属性实例讲解
前面两篇中已经讲过如何使用drawARC,等,画其他的图形的方法的使用也是一样的,只是参数不同, 同时也讲了如何通过xml进行自定义属性,接下来这篇便是通过实例讲解如何实地应用起来, 效果如下,点击开 ...
- 导入Excel后绑定GridView实例
http://blog.csdn.net/loveheronly/article/details/6715552 项目中经常用到导入导出的例子,前面做了导出的例子,现在把导入Excel的数据的例子也把 ...
- java的poi导入excel时解析日期
if (r.getCellType()==Cell.CELL_TYPE_NUMERIC){ if(HSSFDateUtil.isCellDateFormatted(r)){ //用于转化为日期格式 D ...
- java导入excel时遇到的版本问题
java中读取excel文件时对不同的版本提供了不同的读取方法,这就要求我们在读取excel文件时获取excel文件的版本信息从而通过不同的版本去使用不同的读取方式, 在WorkbookFactory ...
- java导入excel时处理日期格式(已验证ok)
在Excel中的日期格式,比如2009-12-24将其转化为数字格式时变成了40171,在用java处理的时候,读取的也将是40171.如果使用POI处理Excel中的日期类型的单元格时,如果仅仅是判 ...
- 用OleDb导入Excel时提示驱动错误问题解决办法
导入格式为xls的excel文件,发生了错误 未处理System.Data.OleDb.OleDbException HResult=-2147467259 Message=外部数据库驱动程序 (1) ...
- POI导入excel时读取excel数据的真实行数
有很多时候会出现空的数据导致行数被识别多的情况 // 获取Excel表的真实行数 int getExcelRealRow(Sheet sheet) { boolean flag = false; fo ...
- 数据导入Excel时,出现ole error 800AC472这个错误,怎么解决。
我也出现过这个问题 在生成报表的时候不要动EXCEL中的任何单元格 让它完成保存就可以了 或者是把office 2003 删除下载一个office 2000就可以解决 据说是版本兼容的问题 不是高手 ...
随机推荐
- Python中的关键字的用法
Python有哪些关键字 -Python常用的关键字 and, del, from, not, while, as, elif, global, or, with, assert, else, if, ...
- Yahoo关于性能优化的N条军规
一. Yahoo的军规条例: 谨记:80%-90%的终端响应时间是花费在下载页面中的图片,样式表,脚本,flash等:详细的解释来这里查:http://developer.yahoo.com/perf ...
- JDBC:数据库操作:事务
事务特征:原子性,一致性,独立性,持久性. 要想操作事务,必须按照以下步骤完成. 1,取消掉自动提交(SET AUTOCOMMIT=0):每次执行数据库更新的时候实际上发出SQL命令之后就已经提交上去 ...
- DDL语句--改动表
改动表是指改动数据库中已经存在的表的定义.改动表比又一次定义表简单.不须要又一次载入数据.也不会影响正在进行的服务. MySQL中通过ALTER TABLE语句来改动表.改动表包含改动表名.改动字段数 ...
- MySQL-sqlmap常用参数的中文解释
#HiRoot's BlogOptions(选项):--version 显示程序的版本号并退出-h, --help 显示此帮助消息并退出-v VERBOSE 详细级别:0-6(默认为1) Target ...
- oracle 查询 函数练习
/*--以下代码是对emp表进行显示宽度设置col empno for 9999;col ename for a10;col job for a10;col mgr for 9999; col hir ...
- 在SQL Server中调用.NET程序集
需求是这样的,我在.net程序里操作数据时将一些字段数据加密了,这些数据是很多系统共用的,其中一delphi程序也需要用到,并且需要将数据解密,由于我在.net里加密的方式比较特殊,在delphi程序 ...
- Git使用总结 Asp.net生命周期与Http协议 托管代码与非托管代码的区别 通过IEnumerable接口遍历数据 依赖注入与控制反转 C#多线程——优先级 AutoFac容器初步 C#特性详解 C#特性详解 WPF 可触摸移动的ScrollViewer控件 .NET(C#)能开发出什么样的APP?盘点那些通过Smobiler开发的移动应用
一,原理 首先,我们要明白Git是什么,它是一个管理工具或软件,用来管理什么的呢?当然是在软件开发过程中管理软件或者文件的不同版本的工具,一些作家也可以用这个管理自己创作的文本文件,由Linus开发的 ...
- centos 安装cmake 3.3.2
先卸掉本身自带的 cmake 2.8 yum remove cmake cmake版本:3.3.2 安装编译源码所需的工具和库 yum install gcc gcc-c++ ncurses-deve ...
- hash slot(虚拟桶)
在分布式集群中,如何保证相同请求落到相同的机器上,并且后面的集群机器可以尽可能的均分请求,并且当扩容或down机的情况下能对原有集群影响最小. round robin算法:是把数据mod后直接映射到真 ...