将Excel数据导入SQL

时间:2015-11-01 17:53:21

标签: c# sql asp.net excel import

我正在使用ASP.net制作一些应用程序,但我有一个问题,问题是用户应该导入excel文件(文件的模式总是一样),但在excel文件中有一个带有一堆名字的单元格,看起来像这样

 ID         Names
  1       Mick Jagger
          Elton John
  2       James Hetfield
          Axl Rose

等等,所以每个单元格有2个或更多名称...到目前为止,我将该excel文件导入DataSet

sqlCMD.Connection.Open();
            using (OleDbConnection excelConnection = new OleDbConnection(excelConnString))
            {
                using (OleDbCommand cmd = new OleDbCommand("Select " + CompanyID + ", * 
                                                            From [Sheet1$]"
                 , excelConnection))
                {
                    OleDbDataAdapter daSheet = 
                    new OleDbDataAdapter(cmd.CommandText, excelConnection);

                    DataTable table;
                    table = new DataTable();
                    daSheet.Fill(table);
                    PreparedData.Tables.Add(table);
                }
            }

因此,在成功导入之后,我将对象列表导入到数据集中,这很棒,但是每个单元格中有两个或更多名称给我带来麻烦,因为在对象值中它是这样编写的&#34 ; Mick Jagger \ n Elton John",所以我试图替换它并将其添加回数据集(我尝试制作新的数据集,但这样做并不好)

        int Rows = PreparedData.Tables[0].Rows.Count;
        int Columns = PreparedData.Tables[0].Columns.Count;

        for (int i = 0; i < Rows; i++)
        {
            for (int s = 0; s < Columns; s++)
            {
                if (s == 4 || s == 5 || s == 6 || s == 7)
                {
                    object ValueToReplace;
                    object Replaced;

                    ValueToReplace = PreparedData.Tables[0].Rows[i].ItemArray[s];
                    Replaced = ValueToReplace.ToString().Replace("\n", ";");

                    PreparedData.Tables[0].Rows[i].ItemArray[s] = Replaced;
                }
            }
        }

这一点是,最后我想使用(正在工作)将修改后的数据导入我的SQL表中

     SqlBulkCopy bulkcopy = new SqlBulkCopy(sqlCMD.Connection);
     bulkcopy.DestinationTableName = "Excel_Import";
        try
        {
            bulkcopy.WriteToServer(FixedData);
        }
        catch (Exception e)
        {

        }

那么你可以帮助我并建议我如何修改

PreparedData.Tables[0].Rows[i].ItemArray[s] = Replaced;

1 个答案:

答案 0 :(得分:1)

当您引用ItemArray属性时,.NET Framework会在当前行中构建数据的副本。如果您尝试使用它来设置新值,则可以在副本上设置值而不是原始行数据。

这是Reference souce

ItemArray属性的源代码
    public object[] ItemArray {
        get {
            int record = GetDefaultRecord();
            _table.recordManager.VerifyRecord(record, this);
            object[] values = new object[_columns.Count];
            for (int i = 0; i < values.Length; i++) {
                DataColumn column = _columns[i];
                VerifyValueFromStorage(column, DataRowVersion.Default, column[record]);
                values[i] = column[record];
            }
            return values;
        }

如您所见,每次引用ItemArray属性时,都会创建一个对象数组的新副本并用数据填充。现在,如果更改此数组中的条目,则不会更改DataRow类维护的内部数据。您的更改根本不为DataRow所知。

然而,解决方案非常简单,只需使用

即可
 ValueToReplace = PreparedData.Tables[0].Rows[i][s].ToString();
 PreparedData.Tables[0].Rows[i][s] = ValueToReplace.Replace("\n", ";");