ASP.NET DynamicData Импорт данных из Excel

Я использую ASP.NET DynamicData v4.5, чтобы позволить администратору вставлять / обновлять записи в базе данных.

Мое требование: - Разрешить администратору импортировать записи для таблицы из файла EXCEL. Источник таблицы также может быть доступен в файлах Excel. поэтому я хочу, чтобы администратор импортировал данные из файла.

Есть ли способ добиться этого в DynamicData?


person user2086000    schedule 16.06.2015    source источник


Ответы (1)


Да, ты справишься, я делал это много раз. В Dynamic Data нет встроенной функции для этого, но это не проблема, поскольку ее довольно легко реализовать.

Тот факт, что вы используете динамические данные ASP.NET (как и я), не очень важен для этой задачи. Как вы, наверное, знаете, вы можете создать обычную форму ASP.NET в проекте динамических данных. Вы также можете использовать папку с именем / DynamicData / CustomPages для настройки страницы динамических данных. Я предлагаю создать новую обычную форму ASP.NET под названием ImportingTool.aspx, где ваши пользователи смогут импортировать электронные таблицы в вашу базу данных. После импорта они могут использовать другие страницы динамических данных для редактирования данных.

Вот что вам понадобится:

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;
}
person JP Tétreault    schedule 16.06.2015
comment
Как я могу использовать это динамически? В функции импорта сопоставление столбцов выполняется вручную. есть ли общий способ импортировать данные для всех таблиц с одной страницей? - person user2086000; 17.06.2015
comment
Я предполагаю, что у вас есть следующий вариант использования: пользователь хочет иметь возможность вставлять данные из электронной таблицы вместо того, чтобы вводить их вручную с помощью вашего веб-интерфейса (сгенерированного динамическими данными ASP.NET) ... верно? Если да, то вам не нужно ничего более динамичного, чем это. Действительно, ваша таблица уже существует в вашей базе данных. Вам нужно сопоставить столбцы. - person JP Tétreault; 18.06.2015
comment
Единственная причина сделать эту динамику - если вы хотите СОЗДАТЬ новую таблицу каждый раз при загрузке электронной таблицы, потому что вы не знаете, каким будет ее содержимое / структура. Но если вы это сделаете, я не вижу, как ваша база данных будет оставаться чистой, поскольку пользователи добавляют все больше и больше таблиц ... Если это все еще то, что вы хотите сделать, я никогда этого не делал и вижу несколько проблем (например, обновления метаданных модели), но вот как: stackoverflow.com/questions/23114649/ - person JP Tétreault; 18.06.2015