Intento obtener nombres de hojas de Excel, con oledb.Obtengo nombres de hoja inválidos de archivos de Excel usando OleDb. ¿Qué pasa?
Mi cadena de conexión es:
"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" +
filepath +
";Extended Properties=Excel 12.0;";
donde filepath
es un nombre de archivo.
Mi código para esto:
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);
}
la lista con los nombres de todas las hojas contiene los nombres de hoja válidos y algunos otros nombres de hoja. Ejemplo:
"'correctsheetname$'"
"'correctsheetname$'Print_Area"
Sólo agregue hojas que terminan en $'
Mi problema es que si un nombre de hoja contiene una comilla simple, lo entiendo con dos comillas simples.
Ejemplo: de hoja denominada asheetname's
me sale 'asheetname''s$''
Después, cuando trato de conseguir la fuente de datos de esta hoja, me estoy haciendo una excepción que esta hoja no existe.
query = "SELECT * FROM ['asheetname''s$']"
_command = new OleDbCommand(query, _connection);
_dataTable = new DataTable();
_dataReader = _command.ExecuteReader(); <-- Exception is thrown here
Y el mensaje de excepción:
{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)
Utilice un método para determinar si el nombre contiene comillas y luego extraiga la cita extra del nombre. –
¿Es esta la manera oficial? – ddarellis
No, es una solución. –