【问题标题】:How to get sheetname of the uploaded excel file using C#?如何使用 C# 获取上传的 excel 文件的工作表名称?
【发布时间】:2013-06-28 06:46:50
【问题描述】:

我想使用C# 代码获取上传的 excel 文件的工作表名称。该文件可能采用.xls.xlsx 格式。我使用的代码如下:

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();
    }
}
  • (如何获取上传文件的第一个sheetname) string worksheetName = ??

【问题讨论】:

    标签: c# .net excel file-upload oledb


    【解决方案1】:

    我使用它从.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);
    }
    

    【讨论】:

    • 感谢您的回复,但我得到的只是一个空字符串。请帮忙。
    • @prabuR 数据表是空的吗?你能显示你试过的代码吗
    • conn = new OleDbConnection(strConn); conn.Open(); DataTable Sheets = conn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null); foreach(Sheets.Rows 中的 DataRow dr){ worksheetName = dr[0].ToString(); } cmd = new OleDbCommand("SELECT * FROM [" + worksheetName + "$]", conn);
    • 我上传的 Excel 文件有 1 张
    • 使用 worksheetName = dr[2].ToString();这里2指定列的位置
    【解决方案2】:
    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);
    }
    

    【讨论】:

    • 请添加一些关于这里发生了什么的评论。
    • 代码将 excel 模式提取到数据表中并迭代以查找工作表名称。 karthik 使用整数索引来访问工作表名称,我使用了更精确的列名 [“TABLE_NAME”]
    【解决方案3】:

    如果Excel太大,这段代码会在(conn.open())中浪费很多时间。使用 Openxml 会更好(使用更少的时间),但是如果 Excel 是 Open 的---使用 openxml 读取会有异常,但 oldbhelper wile 没有异常。我的英语是台球,对不起。-----中国男孩

    【讨论】:

    • 能否提供一下代码?
    【解决方案4】:

    我使用 Microsoft excel 库 Microsoft.Office.Interop.Excel。然后您可以使用 index 获取工作表名称,如下所示。

            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();
            }
        }
    

    【讨论】:

      猜你喜欢
      • 2019-04-11
      • 1970-01-01
      • 2018-07-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-19
      • 2013-08-27
      相关资源
      最近更新 更多