Я использую 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 + "$";
Пока ничего не работало.
Ниже приведен снимок экрана моего визуализатора набора данных, когда я выбираю имя листа, в именах которого есть пробелы:
Вам потребуются дополнительные одинарные кавычки sheetName = String.Format("['{0}$']", sheetName);
. Итак, имя вашей таблицы должно выглядеть как ['Customers From Germany$']
Я уже пробовал это сделать и забыл включить это в вопрос изначально. Я уже обновил вопрос. Спасибо
@Afonsoalb в вашем примере $ идет после '
Каковы результаты получения коллекции схем TABLE_NAME?
@UlugbekUmirov Спасибо, что указали на это. Я тоже пробовал и безуспешно. :( Вы пробовали код? У вас работает?
@Afonsoalb у меня работал с именем 'Customers From Germany$'
, то есть без []
.
@ParrishHusband Таблица пуста. Я добавил скриншот моей таблицы данных после вызова "GetOleDbSchemaTable", и он пуст.
Итак, конечная цель - получить все данные из таблицы Excel в DataTable?
@ParrishHusband Нет, я сохраняю только метаданные столбца в таблице данных, а затем, когда я просматриваю эту таблицу, я беру только свойство «column_name», которое я сохранил ранее. Я не храню все данные из таблицы Excel.
@Afonsoalb да, я понимаю, что этот конкретный код делает это, я просто спрашиваю, получает ли большая картина данные из Excel с таким подходом. Или есть какая-то другая причина, по которой вы получаете столбцы?
@UlugbekUmirov Сработало !! Я не могу добавлять скобки, я должен ТОЛЬКО добавлять одинарные кавычки между именем листа. Однако я должен делать это ТОЛЬКО для имен с пробелами, это не работает для имен с отдельными словами. Спасибо. задача решена!
@ParrishHusband О, теперь я понимаю вашу точку зрения. Приложение сначала просит пользователей выбрать, какие столбцы они хотели бы получить для выполнения математических операций. Вот почему я хотел бы на данном этапе иметь только имена столбцов.
У меня похожий код, и я никогда не сталкивался с тем, с чем вы сталкиваетесь. Я делаю такие исправления имен таблиц, предполагая, что имена моих листов передаются в виде массива параметров:
var fixedTableNames = tableNames.Select(t => string.Format
("[{0}{1}]", t, t.EndsWith("$")
? ""
: "$")
).ToArray();
Перемещение комментария сюда.
Вам нужно заключить имя таблицы в одинарные кавычки с пробелами, т.е. вы должны использовать
'Customers From Germany$'
имя таблицы в запросе.
Обратите внимание, что драйверы ACE.OLEDB.12 могут отлично обрабатывать файлы .xls, нет необходимости в условном выражении в вашей ConnectionString, подобном этому