2013-06-28 5 views
4

Я хотел бы получить имя листа загруженного файла excel с использованием кода C#. Файл может быть в формате .xls или .xlsx. Кодекс я использовал это следующим образом:Как получить имя листа загруженного файла excel с помощью C#?

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 = conn.GetOleDbSchemaTable (OleDbSchemaGuid.Tables, null); foreach (DataRow dr in Sheets.Rows) { workheetName = dr [0] .ToString(); } cmd = new OleDbCommand ("SELECT * FROM [" + workheetName + "$]", 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 в datatable и выполняет итерацию, чтобы найти имена листов. karthik как используемый целочисленный индекс для доступа к имени листа, и я использовал имя столбца [«TABLE_NAME»], точнее – bombaatdev

0

Если Excel слишком большой, этот код будет тратить много времени в (conn.open()). Использовать Openxml будет лучше (используйте меньше времени), но если Excel открыт - использование openxml для чтения будет иметь исключение, но oldbhelper wile не имеет исключения. Мой английский - это бассейн, извините .----- Китайский мальчик

+0

Не могли бы вы предоставить код о том, как это сделать, пожалуйста? – kkuilla

0

Я использую Microsoft excel library 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(); 
     } 
    }