从 Excel 单元格引用中获取 sheet 名称和单元格引用
Get sheet name and cell reference from Excel cell reference
我需要一种巧妙的方法来拆分 Excel 单元格引用,以便获得 sheet 名称和单元格引用。一般Excel引用可以采用以下形式:
- =Sheet1!$A$1 ---> Sheet1, $A$1
- ='Sheet 1'!$A$1 ---> Sheet 1, $A$1
- ='!Sheet 1'!$A$1 ---> !Sheet 1, $A$1
- ='&Sheet1'!$A$1 ---> &Sheet1, $A$1
- ='$Sheet1$'!$A$1 ---> $Sheet1$, $A$1
因为Excel允许在sheet名称中使用特殊字符和空格,这使得提取sheet名称和单元格地址变得困难。
有更好的方法吗?正则表达式?我有 0 exp。
注意:我通过命名范围获取单元格引用,因此我坚持使用现有的内容。
?Application.Evaluate("INDIRECT(""Sheet1!A1"")").Address(false, false)
?Application.Evaluate("INDIRECT(""Sheet1!A1"")").WorkSheet.Name
其中 Application
是 Excel.Application
的实例
正则表达式可以处理这项工作。
首先,您需要解析简单的 sheet 名称,例如 'Sheet1'。此名称以字母开头,包含除“!”之外的任何字符。
(\w[^!]*)
其次,您需要解析复杂的 sheet 名称,用单引号括起来:
'([^']+)'
第三,你需要合并这两个正则表达式:
(\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);
试试这个
app.config 文件:
<appSettings>
<add key="connectionstrings" value="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:-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 中的列名
我需要一种巧妙的方法来拆分 Excel 单元格引用,以便获得 sheet 名称和单元格引用。一般Excel引用可以采用以下形式:
- =Sheet1!$A$1 ---> Sheet1, $A$1
- ='Sheet 1'!$A$1 ---> Sheet 1, $A$1
- ='!Sheet 1'!$A$1 ---> !Sheet 1, $A$1
- ='&Sheet1'!$A$1 ---> &Sheet1, $A$1
- ='$Sheet1$'!$A$1 ---> $Sheet1$, $A$1
因为Excel允许在sheet名称中使用特殊字符和空格,这使得提取sheet名称和单元格地址变得困难。
有更好的方法吗?正则表达式?我有 0 exp。
注意:我通过命名范围获取单元格引用,因此我坚持使用现有的内容。
?Application.Evaluate("INDIRECT(""Sheet1!A1"")").Address(false, false)
?Application.Evaluate("INDIRECT(""Sheet1!A1"")").WorkSheet.Name
其中 Application
是 Excel.Application
正则表达式可以处理这项工作。
首先,您需要解析简单的 sheet 名称,例如 'Sheet1'。此名称以字母开头,包含除“!”之外的任何字符。
(\w[^!]*)
其次,您需要解析复杂的 sheet 名称,用单引号括起来:
'([^']+)'
第三,你需要合并这两个正则表达式:
(\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);
试试这个
app.config 文件:
<appSettings>
<add key="connectionstrings" value="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:-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 中的列名