Я использую 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, когда я выбираю имя листа, в именах которого есть пробелы:
