ASP.NET动态数据从Excel导入数据

时间:2015-06-16 11:54:04

标签: asp.net-dynamic-data

我正在使用ASP.NET DynamicData v4.5来允许管理员插入/更新数据库中的记录。

我的要求是, - 允许管理员从EXCEL文件导入表的记录。 该表的源也可以在excel文件中获得。所以我希望管理员从文件中导入数据。

我有什么办法可以在DynamicData中实现这个目标吗?

1 个答案:

答案 0 :(得分:2)

是的,你可以做到,我做过很多次。 动态数据中没有内置功能,但这不是问题,因为它很容易实现。

您使用ASP.NET动态数据(就像我一样)这一事实对此任务并不重要。您可能知道,您可以在动态数据项目中创建常规ASP.NET表单。您还可以使用名为 / DynamicData / CustomPages 的文件夹来自定义动态数据页面。我建议创建一个名为ImportingTool.aspx的新常规ASP.NET表单,您的用户可以将电子表格导入数据库。导入后,他们可以使用其他动态数据页来编辑数据。

以下是您的需求:

1-您需要用户上传文件      asp:fileupload ajaxToolkit:AjaxFileUpload

2-您需要打开该文件,它将如下所示:

public void Import(FileUpload fileUpload)
{
    if (fileUpload.HasFile)
    {
        string FileName = Path.GetFileName(fileUpload.PostedFile.FileName);
        string Extension = Path.GetExtension(fileUpload.PostedFile.FileName);
        string FilePath = HttpRuntime.AppDomainAppPath + "/Uploaded/" + FileName;
        fileUpload.SaveAs(FilePath);
        Import(FilePath, Extension);
    }
}

3-您需要在数据库中导入该文件,它将如下所示:

public Boolean Import(string FilePath, string Extension)
{
    if (String.IsNullOrEmpty(FilePath) || String.IsNullOrEmpty(Extension))
    {
        return false;
    }

    string conStr;
    string conStrNoHDR;
    GetConnectionString(FilePath, Extension, out conStr, out conStrNoHDR);

    OleDbConnection connection = new OleDbConnection(conStr);
    OleDbConnection connectionNoHDR = new OleDbConnection(conStrNoHDR);

    // depending on file extension, you might want to use connectionNoHDR 
    Import(connection); 

    connection.Close();
    connectionNoHDR.Close();

}

private static void GetConnectionString(string FilePath, string Extension, out string conStr, out string conStrNoHDR)
{
    conStr = "";
    conStrNoHDR = "";
    switch (Extension)
    {
        case ".xls": //Excel 97-03            
            conStr = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + FilePath + ";Extended Properties=\"Excel 8.0;HDR=YES\"";
            conStrNoHDR = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + FilePath + ";Extended Properties=\"Excel 8.0;HDR=NO\"";
            break;
        case ".xlsx": //Excel 07
            conStr = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + FilePath + ";Extended Properties=Excel 12.0 ";
            conStrNoHDR = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + FilePath + ";Extended Properties=\"Excel 12.0;HDR=NO\"";
            break;
        case ".csv":
            conStr = "Provider=Microsoft.Jet.OleDb.4.0; Data Source=" + Path.GetDirectoryName(FilePath) + ";Extended Properties=\"Text;FMT=Delimited;HDR=NO\"";
            break;        
    }
}

public static void Import(OleDbConnection connection)
{
    String query = "SELECT * From [Report-LANG_VOCALLS$]";
    DataTable dt = ImportUtils.GetData(connection, query);

    string table = "Dialer";

    string conn = ConfigurationManager.ConnectionStrings["Telecom"].ConnectionString;
    SqlBulkCopy bulkCopy = new SqlBulkCopy(conn);     

    bulkCopy.ColumnMappings.Add("Phone", "Phone");
    bulkCopy.ColumnMappings.Add("portfolio", "Portfolio_eng");
    bulkCopy.ColumnMappings.Add("dept", "Department_eng");

    ImportUtils.BulkCopy(dt, table, bulkCopy);

}

public static DataTable GetData(OleDbConnection connection, String query)
{
    DataTable dt = new DataTable();
    OleDbDataAdapter adapter = new OleDbDataAdapter();
    OleDbCommand cmdExcel = new OleDbCommand();
    cmdExcel.CommandText = query;
    cmdExcel.Connection = connection;
    connection.Open();
    adapter.SelectCommand = cmdExcel;
    adapter.Fill(dt);
    Debug.WriteLine(dt.Rows.Count);
    connection.Close();
    return dt;
}