我正在使用OleDb从Excel电子表格中查询数据。以下代码非常适合其名称不包含空格的工作表(例如:CustomersFromGermany )。但是,对于名称中包含空格的工作表,代码不会返回任何列(例如例如来自德国的客户)。
public List<string> GetColumnNames(string filePath, string sheetName) // modify the parameter to be only the file path and the sheetName
{
List<string> columns = new List<string>();
using (OleDbConnection connection = new OleDbConnection((filePath.TrimEnd().ToLower().EndsWith("x")) ? "Provider=Microsoft.ACE.OLEDB.12.0;Data Source='" + filePath + "';" + "Extended Properties='Excel 12.0 Xml;HDR=YES;'"
: "provider=Microsoft.Jet.OLEDB.4.0;Data Source='" + filePath + "';Extended Properties=Excel 8.0;"))
{
connection.Open();
// Attempts described below - below code snipet.
DataTable dt = connection.GetOleDbSchemaTable(OleDbSchemaGuid.Columns, new object[] { null, null, sheetName, null });
foreach (DataRow drColumn in dt.Rows)
{
string s = Convert.ToString(drColumn["COLUMN_NAME"]);
columns.Add(s);
}
connection.Close();
}
return columns;
}
在调用GetOleDbSchemaTable之前,我已经尝试过修改sheetName字符串(下面是我尝试的两种方式),但是没有一种解决方案有效。
第一次尝试-在名称之间插入两个方括号/也要使用方括号+单引号:
sheetName = String.Format("[{0}$]", sheetName);
sheetName = String.Format("['{0}$']", sheetName);
第二次尝试-
if (sheetName.Contains(' '))
sheetName = Regex.Match(sheetName, @"(?<=')(.*?)(?=\$')", RegexOptions.None).Value + "$";
到目前为止没有任何工作。
下面是当我选择名称为空格的sheetName时我的DataSet Visualiser的屏幕截图:
答案 0 :(得分:1)
我有类似的代码,但从未经历过遇到的问题。假设我的工作表名称作为参数数组传入,我会像这样对表名进行更正:
var fixedTableNames = tableNames.Select(t => string.Format
("[{0}{1}]", t, t.EndsWith("$")
? ""
: "$")
).ToArray();
答案 1 :(得分:1)
在此处评论。
您需要在表名周围用单引号引起来,即必须使用
'Customers From Germany$'
查询中的表名。