工作表名称包含空格时,C#GetOleDdSchemaTable从excel获取列

时间:2018-08-24 22:17:36

标签: c# excel oledb

我正在使用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的屏幕截图:

enter image description here

2 个答案:

答案 0 :(得分:1)

我有类似的代码,但从未经历过遇到的问题。假设我的工作表名称作为参数数组传入,我会像这样对表名进行更正:

var fixedTableNames = tableNames.Select(t => string.Format
                            ("[{0}{1}]", t, t.EndsWith("$")
                                ? ""
                                : "$")
                            ).ToArray();

答案 1 :(得分:1)

在此处评论。

您需要在表名周围用单引号引起来,即必须使用

'Customers From Germany$'

查询中的表名。