2011-12-15 50 views
5

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)

+0

Utilice un método para determinar si el nombre contiene comillas y luego extraiga la cita extra del nombre. –

+0

¿Es esta la manera oficial? – ddarellis

+0

No, es una solución. –

Respuesta

4

Esto debería funcionar

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

si no, trate de escribir manualmente el nombre de la hoja en la cadena asheetname variables - que debería abrir

"SELECT * FROM ["SHEET_NAME"$]" 
+0

//Cmd.CommandText = "Seleccione * de [hoja1 $]"; // No funciona, pero el siguiente funciona para mí, mi nombre de hoja es "Personas normales" Cmd.CommandText = "SELECCIONAR * FROM [" + "Personas normales" + "$]"; – RotatingWheel

0

cuando estaba leyendo el Excel utilizando oledb, mostrando su error tipo favor dar soluciones

'$' no es un nombre válido. Asegúrese de que no incluya caracteres inválidos o signos de puntuación y que no sea demasiado largo.

Cuestiones relacionadas