Я получаю недопустимые имена листов из файлов Excel, используя OleDb. В чем дело? - PullRequest
5 голосов
/ 15 декабря 2011

Я пытаюсь получить имена листов Excel с помощью oledb.

Моя строка подключения:

"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" +
filepath + 
";Extended Properties=Excel 12.0;";

где filepath - имя файла.

Мой код для этого:

List<string> sheetNames = new List<string>();
_excel.Connect(_path);
DataTable dataTable = _excel.ExecuteSchema();
_excel.Disconnect();
foreach (DataRow row in dataTable.Rows)
{
    string sheetName = row["TABLE_NAME"].ToString();
    if(!sheetName.EndsWith("$'")) { continue; }
    sheetNames.Add(sheetName);
 }

список с именами листов содержит все допустимые имена листов и некоторые другие имена листов. Пример:

  • "'correctsheetname$'"
  • "'correctsheetname$'Print_Area"

Я добавляю только те листы, которые заканчиваются на $'

Моя проблема в том, что если имя листа содержит одну кавычку, я получаю его с двумя одинарными кавычками.

Пример: для листа с именем asheetname's я получаю 'asheetname''s$''

Впоследствии, когда я пытаюсь получить источник данных этого листа, я получаю исключение, что этот лист не существует.

query = "SELECT * FROM ['asheetname''s$']"
_command = new OleDbCommand(query, _connection);
_dataTable = new DataTable();
_dataReader = _command.ExecuteReader();   <-- Exception is thrown here

И сообщение об исключении:

{System.Data.OleDb.OleDbException: ''asheetname''s$'' is not a valid name. Make sure that it does not include invalid characters or punctuation and that it is not too long. at System.Data.OleDb.OleDbCommand.ExecuteCommandTextErrorHandling(OleDbHResult hr) at System.Data.OleDb.OleDbCommand.ExecuteCommandTextForSingleResult(tagDBPARAMS dbParams, Object& executeResult) at System.Data.OleDb.OleDbCommand.ExecuteCommandText(Object& executeResult) at System.Data.OleDb.OleDbCommand.ExecuteCommand(CommandBehavior behavior, Object& executeResult) at System.Data.OleDb.OleDbCommand.ExecuteReaderInternal(CommandBehavior behavior, String method) at System.Data.OleDb.OleDbCommand.ExecuteReader(CommandBehavior behavior) at System.Data.OleDb.OleDbCommand.ExecuteReader() at PrestaImporter.Entity.Excel.ExecuteQuery(String query)

Ответы [ 2 ]

4 голосов
/ 20 декабря 2011

Это должно работать

"SELECT * FROM [" + asheetname + "$]"

Если нет, попробуйте вручную ввести имя листа в строковую переменную asheetname - оно должно открыться.

"SELECT * FROM ["SHEET_NAME"$]"
0 голосов
/ 22 мая 2017

когда я читал в Excel с помощью oledb, он показывает добрую ошибку Пожалуйста, дайте решения

'$' не является допустимым именем. Убедитесь, что он не содержит недопустимых символов или знаков препинания и не слишком длинный.

...