C# GetOleDdSchemaTable получает столбцы из Excel, когда в имени листа есть пробелы

Я использую OleDb для запроса данных из электронной таблицы Excel. Приведенный ниже код отлично работает для листов, в именах которых нет пробелов (например: Клиенты из Германии). Однако для листов, в именах которых есть пробелы, код не возвращает никаких столбцов (например Клиенты из Германии).

 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 + "$";

Пока ничего не работало.

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

C# GetOleDdSchemaTable получает столбцы из Excel, когда в имени листа есть пробелы

Обратите внимание, что драйверы ACE.OLEDB.12 могут отлично обрабатывать файлы .xls, нет необходимости в условном выражении в вашей ConnectionString, подобном этому

Parrish Husband 25.08.2018 00:29

Вам потребуются дополнительные одинарные кавычки sheetName = String.Format("['{0}$']", sheetName);. Итак, имя вашей таблицы должно выглядеть как ['Customers From Germany$']

Ulugbek Umirov 25.08.2018 00:34

Я уже пробовал это сделать и забыл включить это в вопрос изначально. Я уже обновил вопрос. Спасибо

asa 25.08.2018 00:37

@Afonsoalb в вашем примере $ идет после '

Ulugbek Umirov 25.08.2018 00:37

Каковы результаты получения коллекции схем TABLE_NAME?

Parrish Husband 25.08.2018 00:39

@UlugbekUmirov Спасибо, что указали на это. Я тоже пробовал и безуспешно. :( Вы пробовали код? У вас работает?

asa 25.08.2018 00:42

@Afonsoalb у меня работал с именем 'Customers From Germany$', то есть без [].

Ulugbek Umirov 25.08.2018 00:46

@ParrishHusband Таблица пуста. Я добавил скриншот моей таблицы данных после вызова "GetOleDbSchemaTable", и он пуст.

asa 25.08.2018 00:48

Итак, конечная цель - получить все данные из таблицы Excel в DataTable?

Parrish Husband 25.08.2018 00:49

@ParrishHusband Нет, я сохраняю только метаданные столбца в таблице данных, а затем, когда я просматриваю эту таблицу, я беру только свойство «column_name», которое я сохранил ранее. Я не храню все данные из таблицы Excel.

asa 25.08.2018 01:01

@Afonsoalb да, я понимаю, что этот конкретный код делает это, я просто спрашиваю, получает ли большая картина данные из Excel с таким подходом. Или есть какая-то другая причина, по которой вы получаете столбцы?

Parrish Husband 25.08.2018 01:02

@UlugbekUmirov Сработало !! Я не могу добавлять скобки, я должен ТОЛЬКО добавлять одинарные кавычки между именем листа. Однако я должен делать это ТОЛЬКО для имен с пробелами, это не работает для имен с отдельными словами. Спасибо. задача решена!

asa 25.08.2018 01:02

@ParrishHusband О, теперь я понимаю вашу точку зрения. Приложение сначала просит пользователей выбрать, какие столбцы они хотели бы получить для выполнения математических операций. Вот почему я хотел бы на данном этапе иметь только имена столбцов.

asa 25.08.2018 01:06
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
13
321
2

Ответы 2

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

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

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

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

'Customers From Germany$'

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

Другие вопросы по теме