2013-06-28 16 views
4

我想使用C#代碼獲取上傳的Excel文件的表名。該文件可能是.xls或.xlsx格式。我用的代碼如下:如何使用C#獲取上傳的Excel文件的sheetname?

protected void btnGenerateCSV_Click(object sender, EventArgs e) 
{    
    string sourceFile = ExcelFileUpload.PostedFile.FileName; 
    string worksheetName = ??? (How to get the first sheetname of the uploaded file)     
    string strConn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + sourceFile + ";Extended Properties=\"Excel 8.0;HDR=Yes;IMEX=1\""; 

    if (sourceFile.Contains(".xlsx")) 
    strConn = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + sourceFile + ";Extended Properties=\"Excel 12.0;HDR=Yes;IMEX=1\""; 

    try 
    { 
     conn = new OleDbConnection(strConn); 
     conn.Open(); 

     cmd = new OleDbCommand("SELECT * FROM [" + worksheetName + "$]", conn); 
     cmd.CommandType = CommandType.Text; 
     wrtr = new StreamWriter(targetFile); 

     da = new OleDbDataAdapter(cmd); 
     DataTable dt = new DataTable(); 
     da.Fill(dt); 

     for (int x = 0; x < dt.Rows.Count; x++) 
      { 
       string rowString = ""; 
       for (int y = 0; y < dt.Columns.Count; y++) 
       { 
        rowString += "\"" + dt.Rows[x][y].ToString() + "\","; 
       } 
       wrtr.WriteLine(rowString); 
      } 
    } 
    catch (Exception exp) 
    { 
    } 
    finally 
    { 
     if (conn.State == ConnectionState.Open) 
     conn.Close(); 
     conn.Dispose(); 
     cmd.Dispose(); 
     da.Dispose(); 
     wrtr.Close(); 
     wrtr.Dispose(); 
    } 
} 

string worksheetName = ???(如何獲得上傳文件的第一SHEETNAME)

有人請大家幫幫忙...

回答

5

我使用它來獲取片從.xlsx文件,並遍歷所有名稱的名稱由一個

OleDbConnection connection = new OleDbConnection(@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + filename + ";Extended Properties='Excel 12.0 xml;HDR=YES;'"); 
         connection.Open(); 
         DataTable Sheets = connection.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null); 

      foreach (DataRow dr in Sheets.Rows) 
        { 
         string sht = dr[2].ToString().Replace("'", ""); 
         OleDbDataAdapter dataAdapter = new OleDbDataAdapter("select * from [" + sht + "]", connection); 
    } 
+0

感謝您的回覆,但我只是得到一個空字符串。請幫忙。 –

+0

@prabuR是數據表空的?你可以顯示你試過的代碼 – Karthik

+0

conn = new OleDbConnection(strConn); conn.Open(); DataTable Sheets = conn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables,null); (DataRow dr在Sheets.Rows中) { worksheetName = dr [0] .ToString(); } cmd = new OleDbCommand(「SELECT * FROM [」+ worksheetName +「$]」,conn); –

1
DataTable Sheets = oleConnection.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null); 

for(int i=0;i<Sheets.Rows.Count;i++) 
{ 
    string worksheets= Sheets.Rows[i]["TABLE_NAME"].ToString(); 
    string sqlQuery = String.Format("SELECT * FROM [{0}]", worksheets); 
} 
+0

請添加一些評論,關於這是怎麼回事。 – Swiss

+0

該代碼將excel模式提取到數據表中並迭代查找表名。 karthik作爲使用整數索引來訪問工作表名稱,並且我使用了更精確的列名[「TABLE_NAME」] – bombaatdev

0

讀表一個如果Excel太大,這段代碼會浪費很多時間(conn.open())。使用Openxml會更好(使用更少的時間),但是如果Excel是打開的---使用openxml讀取將會有異常,但oldbhelper不會有任何異常。我的英語是游泳池,對不起.-----中國男孩

+0

請問您可以提供關於如何操作的代碼? – kkuilla

0

我使用微軟的excel庫Microsoft.Office.Interop.Excel。然後,您可以使用索引來獲取工作表名稱,如下所示。

 string path = @"C\Desktop\MyExcel.xlsx" //Path for excel 
     using Excel = Microsoft.Office.Interop.Excel; 
     xlAPP = new Excel.Application(); 
     xlAPP.Visible = false; 
     xlWbk = xlAPP.Workbooks.Open(path); 
     string worksheetName = xlWbk.Worksheets.get_Item(1).Name //pass Index here. Reemember that index starts from 1. 
     xlAPP.Quit(); 
     releaseObject(xlWbk); 
     releaseObject(xlAPP); 

    //Always handle unmanaged code. 
    private void releaseObject(object obj) 
    { 
     try 
     { 
      System.Runtime.InteropServices.Marshal.ReleaseComObject(obj); 
      obj = null; 
     } 
     catch (Exception ex) 
     { 
      obj = null; 
      MessageBox.Show("Unable to release the Object " + ex.ToString()); 
     } 
     finally 
     { 
      GC.Collect(); 
     } 
    } 
相關問題