C # GetOleDdSchemaTable получить столбцы из Excel, когда имя листа имеет пробелы - PullRequest
0 голосов
/ 25 августа 2018

Я использую 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;
    }

Я уже пытался изменить строку sheetName перед вызовом GetOleDbSchemaTable (ниже приведены два способа, как я пытался), но ни одно из решений не сработало.

1-я попытка - вставить две скобки между именем / также с скобками + одинарные кавычки:

sheetName = String.Format("[{0}$]", sheetName);

sheetName = String.Format("['{0}$']", sheetName);

и 2-я попытка -

 if (sheetName.Contains(' '))
       sheetName = Regex.Match(sheetName, @"(?<=')(.*?)(?=\$')", RegexOptions.None).Value + "$";

Пока ничего не получалось.

Ниже приведен снимок экрана моего визуализатора DataSet, когда я выбираю имя листа, в именах которого есть пробелы:

enter image description here

Ответы [ 2 ]

0 голосов
/ 25 августа 2018

Перемещение комментария сюда.

Вам нужно поставить одинарные кавычки вокруг имени таблицы с пробелами, то есть вы должны использовать

'Customers From Germany$'

имя таблицы в запросе.

0 голосов
/ 25 августа 2018

У меня похожий код, и я никогда не сталкивался с тем, с чем ты сталкиваешься. Я делаю корректировки имен таблиц следующим образом, предполагая, что имена моих листов передаются в виде массива params:

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