现在的位置: 首页 > 综合 > 正文

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

2012年06月03日 ⁄ 综合 ⁄ 共 5330字 ⁄ 字号 评论关闭

页面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", "<script>alert('导入成功!');window.location.href='Default.aspx';</script>");
        }
        else
        {
            Page.ClientScript.RegisterStartupScript(Page.GetType(), "insertFailure", "<script>alert('导入失败!请重试');</script>");
        }
    }
    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();
        }
    }
}

抱歉!评论已关闭.