2011-12-15 11 views
5

Próbuję uzyskać nazwy arkusza Excela za pomocą oledb.Otrzymuję nieprawidłowe nazwy arkuszy z plików Excel za pomocą OleDb. Co jest nie tak?

Moje ciąg połączenia jest:

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

filepath gdzie jest nazwa pliku.

Mój kod to:

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); 
} 

lista z nazwami arkuszy zawiera wszystkie poprawne nazwy arkuszy i niektóre inne nazwy arkuszy. Przykład:

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

I tylko dodać arkusze, które kończą się w $'

Moim problemem jest to, że jeśli nazwa arkusza zawiera pojedynczy cytat, rozumiem z dwoma pojedyncze cytaty.

Przykład: na arkuszu o nazwie asheetname's uzyskać 'asheetname''s$''

Później, gdy próbuję uzyskać źródło danych tego arkusza, otrzymuję wyjątek, że ta karta nie istnieje.

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

a komunikat wyjątek:

{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

Użyj metody, aby określić, czy nazwa zawiera cudzysłowy, a następnie wyodrębnij dodatkowy cytat z nazwy. –

+0

Czy to jest oficjalny sposób? – ddarellis

+0

Nie, jest to obejście problemu. –

Odpowiedz

4

To powinno działać

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

jeśli nie, spróbuj ręcznie wpisując nazwę arkusza w zmiennej łańcuchowej asheetname - go powinien otworzyć.

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

//Cmd.CommandText = "Wybierz * z [sheet1 $]"; // Nie działa, ale dla mnie następujące prace, moja nazwa arkusza to "Zwykli ludzie" Cmd.CommandText = "WYBIERZ * Z [" + "Zwykłych osób" + "$]"; – RotatingWheel

0

Kiedy czytałem Excel przy użyciu OLEDB, pokazując jej rodzaj błędu proszę dać rozwiązania

„$” nie jest poprawną nazwą. Upewnij się, że nie zawiera on nieprawidłowych znaków lub znaków interpunkcyjnych i że nie jest zbyt długi.

Powiązane problemy