从Excel单元格引用中获取工作表名称和单元格引用

时间:2015-02-09 06:48:54

标签: c# string excel split

我需要一种智能的方法来拆分Excel单元格引用,以获取工作表名称和单元格引用。通常Excel引用可以采用以下形式:

  • = Sheet1!$ A $ 1 ---> Sheet1,$ A $ 1
  • ='表1'!$ A $ 1 --->第1页,$ A $ 1
  • ='!Sheet 1'!$ A $ 1 ---> !第1页,$ A $ 1
  • ='& Sheet1'!$ A $ 1 ---> & Sheet1,$ A $ 1
  • ='$ Sheet1 $'!$ A $ 1 ---> $ Sheet1 $,$ A $ 1

因为Excel允许在工作表名称中使用特殊字符和空格,这使得难以提取工作表名称和单元格地址。

有更好的方法吗?正则表达式?我有0 exp。

注意:我通过命名范围获取单元格引用,因此我坚持使用我拥有的内容。

3 个答案:

答案 0 :(得分:0)

?Application.Evaluate("INDIRECT(""Sheet1!A1"")").Address(false, false)

?Application.Evaluate("INDIRECT(""Sheet1!A1"")").WorkSheet.Name

其中ApplicationExcel.Application

的实例

答案 1 :(得分:0)

正则表达式可以处理这项工作。

首先,您需要解析简单的工作表名称,例如' Sheet1'。此名称以字母开头,包含除'!'。

以外的所有字符
(\w[^!]*)

其次,您需要解析复杂的工作表名称,用单引号括起来:

'([^']+)'

第三,你需要结合这两个正则表达式:

(\w[^!]*)|'([^']+)'

最后,编写代码:

private static ExtractSheetName(string cell)
{
    var match = Regex.Match(cell, @"(\w[^!]*)|('[^']+)'");
    if (match.Success)
    {
        if (!string.IsNullOrEmpty(match.Groups[1].Value))
            return match.Groups[1].Value;

        if (!string.IsNullOrEmpty(match.Groups[2].Value))
            return match.Groups[2].Values;

    }

    return null;
}

. . .
// Using:
var sheetName = ExptractSheetName(cell);
string cellRef;
if (sheetName == null)
    cellRef = cell;
else
    cellRef = cell.Substring(sheetName.Length + 1);

答案 2 :(得分:0)

试试这个

app.config文件:

 <appSettings>

<add key="connectionstrings" value="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\16-07-2014\BDLS_Backup\TVM - Employee List-New.xls;Extended Properties='Excel 8.0;HDR=Yes;;IMEX=2'"/>
</appSettings>

Program.cs:

string connectionString = ConfigurationSettings.AppSettings["connectionstrings"];
        OleDbConnection oledbConn = new OleDbConnection(connectionString);
        oledbConn.Open();

        OleDbCommand cmd = new OleDbCommand("select * from [Sheet1$]", oledbConn);

        OleDbDataAdapter da = new OleDbDataAdapter(cmd);
        DataSet ds = new DataSet();
        da.MissingSchemaAction = MissingSchemaAction.AddWithKey;
        da.Fill(ds);
        DataTable dt = ds.Tables[0];

foreach (DataRow row in dt.Rows)
{

                   string EmployeeCode = row["EmployeeCode"].ToString();
}

其中[“EmployeeCode”]是sheet1中的列名