2017-07-17 73 views
0

我正在導入一個excel文件,並試圖讓相同的數據集。問題是,如果列名包含.,例如,如果導入後列名爲Sr. No.,則DataSet中顯示的列名稱爲Sr# No#轉換爲'#'

以下是代碼:

public DataSet ConnectExcel(string filetable) 
{ 
    DataSet ds = new DataSet(TABLE_NAME); 
    string excelConnectionString; 
    string extension = Path.GetExtension(filetable); 

    if (extension == ".xls") 
    { 
     excelConnectionString = String.Format("Provider=Microsoft.Jet.OLEDB.4.0;Data Source={0};Extended Properties=\"Excel 8.0;HDR=YES\"", strCSVFilePath); 
    } 
    else 
    { 
     excelConnectionString = String.Format("Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0};Extended Properties=\"Excel 12.0 xml;HDR=YES;\"", strCSVFilePath); 
    } 

    System.Data.OleDb.OleDbConnection oleDBCon = new System.Data.OleDb.OleDbConnection(excelConnectionString); 

    try 
    { 
     if (oleDBCon.State == ConnectionState.Open) 
     { 
      //lblResult.Text = "file is in open state. Please close the file."; 
     } 
     else 
     { 
      oleDBCon.Open(); 
      DataTable Sheets = oleDBCon.GetOleDbSchemaTable(System.Data.OleDb.OleDbSchemaGuid.Tables, null); 
      foreach (DataRow dr in Sheets.Rows) 
      { 
       string sht = dr[2].ToString().Replace("'", ""); 
       System.Data.OleDb.OleDbDataAdapter dataAdapter = new System.Data.OleDb.OleDbDataAdapter("select * from [" + sht + "]", oleDBCon); 

       try 
       { 
        dataAdapter.Fill(ds); 
        ds.Tables[0].TableName = TABLE_NAME; 
        ds.AcceptChanges(); 
       } 
       catch (Exception e) 
       { 
        MessageBox.Show(e.Message); 
       } 
       finally 
       { 
        dataAdapter.Dispose(); 
       } 
      } 
     } 
    } 
    catch (Exception e) //Error 
    { 
     MessageBox.Show(e.Message); 
    } 
    finally 
    { 
     if (oleDBCon.State == ConnectionState.Open) 
      oleDBCon.Close(); 
     oleDBCon.Dispose(); 
    } 
    return ds; 
} 
+0

刪除數據表中的第一行,如果它是穩定的,那麼您可以將它們替換爲'DataSet'再次? –

+0

您可以通過遍歷每列來替換數據表列名#中的# – satsvelke

+0

@satsvelke爲什麼需要循環每個**列**? –

回答

2

您有幾種選擇這裏。

在您的原始數據中,您可以在您不想轉換的任何值之前加上'

您還可以單擊Excel電子表格中的每一列,並將其數據類型從常規更改爲任何您想要的格式。

您的第三個選擇是在連接字符串中使用IMEX=1

if (extension == ".xls") 
{ 
    excelConnectionString = String.Format("Provider=Microsoft.Jet.OLEDB.4.0;Data Source={0};Extended Properties=\"Excel 8.0;HDR=YES;IMEX=1;\"", strCSVFilePath); 
} 
else 
{ 
    excelConnectionString = String.Format("Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0};Extended Properties=\"Excel 12.0 xml;HDR=YES;IMEX=1;\"", strCSVFilePath); 
} 

如果您仍然有改變,你將不得不改變HDRNO和對待你的標題欄爲字符串以及連接字符串後的問題。在這種情況下,您可以使用第一行中的數據(實際列名稱)替換列名稱,然後使用ds.Tables[0].Rows.RemoveAt(0);

+0

我讓用戶選擇他們想要訪問的文件,並在datagridview上顯示該文件。因此,對文件進行的任何更改以獲得所需的輸出都是不可行的。 'IMEX = 1'沒有幫助。並且將HDR更改爲No將我的第一列作爲我的標題列轉換爲正常的數據單元,這再次不是我想要的。 –

+0

你必須選擇一個或另一個。你總是可以選擇使用'dt.Rows.RemoveAt(0);'來創建標題文本並從數據表中刪除第一行。 –