您的位置:首页 > 编程语言 > ASP

ASP.NET 从Excel文件导入数据到数据库(笔记)

2010-11-03 11:47 791 查看
本文同步发布在博客园 http://www.cnblogs.com/zk09/articles/1868304.html

页面HTML代码:

<%@ page language="C#" autoeventwireup="true" codefile="Default.aspx.cs" inherits="_Default" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title>Excel 数据导入 数据库</title>

<script type="text/javascript" src="js/jquery-1.4.2.min.js"></script>

<script type="text/javascript">

$(function(){

$("#"+"<%=btnImport.ClientID %>").click(function(){

var fileName = $("#"+"<%=excelFile.ClientID %>").val();

if(fileName==""){

alert("请选择Excel文件!");

return false;

}

else{

var extension = fileName.substring(fileName.lastIndexOf('.')+1);

if(extension!="xlsx"&&extension!="xls"){

alert("上传的文件不是Excel文件,请重试!");

return false;

}

}

return true;

});

});

</script>

</head>
<body>
<form id="form1" runat="server">
<div>
<fieldset>
<legend>数据导入:</legend>
<table>
<tr>
<td style="width: 182px">
数据Excel:</td>
<td>
<asp:fileupload id="excelFile" runat="server" />
</td>
</tr>
<tr>
<td colspan="2">
<asp:button id="btnImport" runat="server" text="导入" onclick="btnImport_Click" />
<input id="btnCancel" type="button" value="取消" onclick='window.location.href="Default.aspx"' /></td>
</tr>
</table>
</fieldset>
</div>
<div id="errorDiv" runat="server">
<fieldset>
<legend>错误信息:</legend>
<textarea id="errorArea" runat="server" style="width: 722px; height: 88px"></textarea>
</fieldset>
</div>
<div id="confrimDiv" runat="server">
<fieldset>
<legend>导入确认:</legend>
<asp:gridview id="GVConfirm" runat="server" cssclass="grid">

</asp:gridview>
<div id="buttonDiv" runat="server" visible="false">
<asp:button id="btnConfirm" runat="server" text="确定" onclick="btnConfirm_Click" />
<input id="btnNotConfirm" type="button" value="取消" onclick='window.location.href="Default.aspx"' />
</div>
</fieldset>
</div>
</form>
</body>
</html>

C# 代码
using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Text;
using System.Data.OleDb;
using System.IO;

public partial class _Default : System.Web.UI.Page
{

protected void Page_Load(object sender, EventArgs e)
{
this.initPage();
}

/// <summary>
///  通过ViewState保存一个DataTable.用来在现实之后添加到数据库
/// </summary>
public DataTable SamplDataTable
{
get
{
if (ViewState["SamplDataTable"] == null)
return new DataTable();
return (DataTable)ViewState["SamplDataTable"];
}
set
{
ViewState["SamplDataTable"] = value;
}

}
private void initPage()
{
this.errorDiv.Visible = false;
this.confrimDiv.Visible = false;
}
protected void btnImport_Click(object sender, EventArgs e)
{
///取得文件名
string fileName = this.excelFile.FileName;
//绝对路径
string path = "~/Excel/" + fileName;
path = Server.MapPath(path);
try
{
//暂时保存在服务上
this.excelFile.SaveAs(path);
///读取指定路径 Excel 文件中的内容转换成DataTable
DataTable excelDT = ImportToDataSet(path);
//声明错误信息字符串
StringBuilder errorBuiler = new StringBuilder();
///检查 存储在内存中的 Excel DataTable
if (Validate(excelDT, errorBuiler))
{
//如果检查通过,使用ViewState保存DataSet中数据,在保存到数据库的时候用到
SamplDataTable = excelDT;

//页面GridView数据绑定,用来显示从Excel读取出来的数据供用户确认
this.GVConfirm.DataSource = SamplDataTable;
this.GVConfirm.DataBind();
this.confrimDiv.Visible = true;
this.buttonDiv.Visible = true;
}

else
{//如果检测没有通过,输出相关错误信息
this.errorDiv.Visible = true;
this.errorArea.Value = errorBuiler.ToString();
}

}

catch (Exception ex)
{
this.errorDiv.Visible = true;
this.errorArea.Value = ex.Message;
}

finally
{
//关闭,删除 文件
if (File.Exists(path))

File.Delete(path);
}
}

/// <summary>
///  验证指定的Excel规则(列数)
/// </summary>
/// <param name="excelDT"></param>
/// <param name="errorBuiler"></param>
/// <returns></returns>
public bool Validate(DataTable excelDT, StringBuilder errorBuiler)
{
bool result = true;
if (excelDT.Columns.Count != 5)//假设是5列
{
result = false;
int difference = excelDT.Columns.Count - 5;
if (difference > 0)
errorBuiler.AppendLine("要导入的Excel多" + difference.ToString() + "列");
else
errorBuiler.AppendLine("要导入的Excel少" + (-difference).ToString() + "列");
}
else
{
//foreach (DataRow row in excelDT.Rows)
//{
//    if (Exists(row[0].ToString()))
//    {
//        result = false;
//        errorBuiler.AppendLine("内容 " + "'" + row[2].ToString() + "'" + "已存在!");
//    }
//}
}
return result;
}

protected void btnConfirm_Click(object sender, EventArgs e)
{
///将GridView中显示的数据(其实是保存在VIewState中)写入到数据库中
if (AddDataTable(SamplDataTable, 0))
{
Page.ClientScript.RegisterStartupScript(Page.GetType(), "insertSuccess", "");
}
}

private bool AddDataTable(DataTable dt, int p)
{
bool result = true;
string sql = BuilderInsertSql(dt, p);
try
{
//执行sql语句 DbHelper.ExecuteSql();
return true;
}
catch
{
result = false;
}
return result; ;
}
private string BuilderInsertSql(DataTable dt, int p)
{
//遍历DataTable拼接添加字符串
return "";
}
private bool AddDataTable(DataTable SamplDataTable, object p, int p_3)
{
throw new Exception("The method or operation is not implemented.");
}

/// <summary>
/// 读取指定路径的Excel内容到DataTable中
/// </summary>
/// <param name="path"></param>
/// <returns></returns>
public DataTable ImportToDataSet(string path)
{
string strConn = "Provider=Microsoft.Ace.OleDb.12.0;" + "Data Source=" + path + ";" + "Extended Properties='Excel 12.0;HDR=Yes;IMEX=1';";
OleDbConnection conn = new OleDbConnection(strConn);
try
{
DataTable dt = new DataTable();
if (conn.State != ConnectionState.Open)
conn.Open();
string strExcel = "select * from [Sheet1$]";
OleDbDataAdapter adapter = new OleDbDataAdapter(strExcel, conn);
adapter.Fill(dt);
return dt;
}
catch (Exception ex)
{
throw new Exception(ex.Message);
}
finally
{
if (conn.State != ConnectionState.Closed)
conn.Close();
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: