sagarjainhr Ответов: 7

Внешняя таблица находится не в ожидаемом формате.


У меня есть код следующим образом: vb.net

Dim connectionString As String =[String].Format("Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0};Extended Properties=""Excel 8.0;HDR=YES;IMEX=1;""", filepath)
            Using oleDbConn As New OleDbConnection(connectionString)
                oleDbConn.Open()



когда я пытаюсь открыть файл *.xls, он работает нормально, но если я пытаюсь открыть страницу *.xlsx, то он выдает мне ошибку внешняя таблица не находится в ожидаемом формате. Я искал в сети, но не мог разобраться с этим. Пожалуйста кто нибудь помогите мне разобраться это действительно срочно

7 Ответов

Рейтинг:
55

Mantu Singh

Используйте следующий код, так как файлы Excel 2007 vcersion являются Excel 12.0

Dim connectionString As String =[строка].Формат("Поставщик=Майкрософт.Туз.Oledb для.12.0;Источник данных={0};расширенные свойства=""значение Excel 12.0 XML;и режим HDR=да;компания IMEX=1;""", Путь к файлу)


Желаю удачи!!


sagarjainhr

Это не сработало

Рейтинг:
50

bbirajdar

Вам нужны драйверы OLEDB 12, установленные на вашем компьютере.
Установка по этой ссылке

http://www.microsoft.com/en-us/download/details.aspx?id=13255[^]
И код будет таким .

string connectionString = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + excelFileName + ";Extended Properties=\"Excel 12.0;HDR=YES;\"";
            // if you don't want to show the header row (first row) use 'HDR=NO' in the string
            OleDbConnection excelConnection = new OleDbConnection(connectionString);
            excelConnection.Open();
            // Get the data table containg the schema guid.
            DataTable dtWorksheetTables = excelConnection.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null);
            if (dtWorksheetTables == null || dtWorksheetTables.Rows.Count == 0) return null;
            string worksheetName = GetWorksheetName(dtWorksheetTables);
            string strExcelSQL = "SELECT * FROM [" + worksheetName + "]";
            OleDbCommand oleDbCommand = new OleDbCommand(strExcelSQL, excelConnection);
            OleDbDataAdapter dataAdapter = new OleDbDataAdapter(oleDbCommand);
            DataTable excelDataTable = new DataTable();
            dataAdapter.Fill(excelDataTable);
            //Dispose 
            dataAdapter.Dispose();
            oleDbCommand.Dispose();
            excelConnection.Close();
            excelConnection.Dispose();
            GC.Collect();


sagarjainhr

Я установил access database 10 установленный на моей машине все еще выдает ошибку

bbirajdar

Изменить строку связи для

@"Поставщика=Майкрософт.Туз.Oledb для.12.0;Источник данных=" + excelFileName + ";дополнительные свойства=\"значение Excel 12.0;HDR съемка=да;\"";

sagarjainhr

Я использую vb.net платформа, а не C#, поэтому не может использовать косые черты"\", так как это вызывает ошибку.
Если я преобразовать его в vb.net а также использовать ее бросать одну и ту же ошибку

bbirajdar

Не смотрите на \ . Посмотрите на содержимое строки подключения.... Вы используете Excel 8.0.. Вместо этого используйте 12.0.. Вы поняли мою точку зрения или мне следует объяснить ее более подробно?

sagarjainhr

Я попробовал использовать Excel 12.0, но все равно он дает ту же ошибку. Я поражен здесь, и я действительно не понимаю, что делать я пытался с 8 & 12 оба, но все еще не в состоянии я получаю ту же ошибку

bbirajdar

Опубликуйте свой полный код.. Вашего ответа недостаточно, чтобы догадаться, в чем дело...

sagarjainhr

Частная суб importFromExcel(как byval путь к файлу как строку)
Попробуй
Dim tablesNames как DataTable
Dim connectionString As String = [строка].Формат("Поставщик=Майкрософт.Туз.Oledb для.12.0;Источник данных=" &амп; путь &ампер; ";расширенные свойства=""значение Excel 12.0;HDR съемка=да;""")
Использование oleDbConn в качестве нового OleDbConnection(connectionString)
oleDbConn.Открыть()
tablesNames = oleDbConn.GetOleDbSchemaTable(OleDbSchemaGuid.Столы, Ничего)
Если tablesNames - это ничто, то
cmbNames.Предметы.Добавить("-Выберите-")
Еще

cmbNames.Предметы.Четкий()
cmbNames.Предметы.Добавить("-Выберите-")
For i As Integer = 0 To tablesNames.Rows.Отсчет - 1 Шаг +2
Dim tableName As String = tablesNames.Строки(i)("ИМЯ_ТАБЛИЦЫ").Метод toString().Заменить("$", "")
имятаблицы = имя_таблицы.Заменять("'", "")
Если tableName.StartsWith("_") Затем
Еще
cmbNames.Предметы.Добавить(tableName.Отделка())
Конец, Если
Следующий
Конец, Если


Конец Использования
Catch generatedExceptionName как исключение
Ящик для сообщений.Show(generatedExceptionName.Метод toString)


Окончательно
Метод oledbconnection.ReleaseObjectPool()

Конец Попытки
Конец Подводной Лодки

sagarjainhr

это мой код, я хочу получить файл *.xlsx и получить доступ к нему, но я не могу получить доступ к файлу *.xlsx, но я могу получить доступ к файлу *.xls. Поскольку все данные находятся там в *.xlsx, его очень нужно получить доступ к файлу *.xlsx, чем к файлу *.xls
Когда oleDbConn.Open() пытается выполнить его, он выдает ошибку внешняя таблица не находится в ожидаемом формате.

bbirajdar

Код кажется правильным.. Можете ли вы сказать мне номер строки, где эта ошибка выбрасывается ?

sagarjainhr

он говорит, что строка 59-это та же самая строка, где код oleDbConn.Open() пытается выполнить

sagarjainhr

Private Sub btn_FileBrowse_Click(ByVal sender As System.Объект, бывал е как система.EventArgs) обрабатывает btn_FileBrowse.Щелчок

Через ОФД, как новое диалоговое окно openfiledialog()
cmbNames.Предметы.Четкий()
chklboxName.Предметы.Четкий()
ОФД.Заголовок = "Выберите файл"
- Если тбброуз.Текст = "" Тогда
ОФД.InitialDirectory = "Мои Документы:\"
-Иначе
- ОФД.InitialDirectory = tbBrowse.Text
-Конец, Если
ОФД.Фильтр = "файлы Excel (*.файлы XLSX)|*.XLSX-файлы|все файлы (*.*)|*.*"
Если ОФД.ShowDialog() = DialogResult.Тогда ладно
именем = ОФД.имя файла
тбброуз.Текст = имя файла
Попробуй
System.IO.File.Откройте(имя, ИО.Содержит filemode.Откройте, IO.FileAccess.Читать, ИО.Обменник.Читать)
Поймать
Тусклый ответ как MsgBoxResult = MsgBox("пожалуйста, убедитесь, что файл закрыт, прежде чем продолжить", MsgBoxStyle.Информация, "Тревога")
тбброуз.Текст = ""
Конец Попытки
Еще
тбброуз.Текст = ""
Тусклый ответ как MsgBoxResult = MsgBox("файл не выбран, Пожалуйста, выберите файл для продолжения", MsgBoxStyle.Информация, "Тревога")
Ящик для сообщений.Показать("файл не выбран, Пожалуйста, выберите Файл и продолжайте")
Конец, Если
Вызовите importFromExcel(имя файла)
Конец Использования
Конец Подводной Лодки



Частная суб importFromExcel(как byval путь к файлу как строку)
Попробуй
Dim tablesNames как DataTable
'Dim connectionString As String = [String].Формат("Поставщик=Майкрософт.Туз.Oledb для.12.0;Источник данных={0};расширенные свойства=""значение Excel 12.0 XML;и режим HDR=да;компания IMEX=1;""", Путь к файлу)
'Dim connectionString As String = [String].Формат("Поставщик=Майкрософт.Туз.Oledb для.12.0;Источник данных={0};расширенные свойства=""значение Excel 12.0;HDR съемка= "да";""", путь к файлу)
'Dim connectionString As String = [String].Формат("Поставщик=Майкрософт.Туз.Oledb для.12.0;Источник данных={0};расширенные свойства=""значение Excel 12.0;HDR съемка=да;компания IMEX=1;""", Путь к файлу)
Dim connectionString As String = [строка].Формат("Поставщик=Майкрософт.Туз.Oledb для.12.0;Источник данных=" &амп; путь &ампер; ";расширенные свойства=""значение Excel 12.0;HDR съемка=да;""")
Использование oleDbConn в качестве нового OleDbConnection(connectionString)
oleDbConn.Открыть()
tablesNames = oleDbConn.GetOleDbSchemaTable(OleDbSchemaGuid.Столы, Ничего)
Если tablesNames - это ничто, то
cmbNames.Предметы.Добавить("-Выберите-")
Еще

cmbNames.Предметы.Четкий()
cmbNames.Предметы.Добавить("-Выберите-")
For i As Integer = 0 To tablesNames.Rows.Отсчет - 1 Шаг +2
Dim tableName As String = tablesNames.Строки(i)("ИМЯ_ТАБЛИЦЫ").Метод toString().Заменить("$", "")
имятаблицы = имя_таблицы.Заменять("'", "")
Если tableName.StartsWith("_") Затем
Еще
cmbNames.Предметы.Добавить(tableName.Отделка())
Конец, Если
Следующий
Конец, Если


Конец Использования
Catch generatedExceptionName как исключение
Ящик для сообщений.Show(generatedExceptionName.Метод toString)


Окончательно
Метод oledbconnection.ReleaseObjectPool()

Конец Попытки
Конец Подводной Лодки

bbirajdar

Окей.. Установите эти драйверы OLEDB http://www.microsoft.com/en-us/download/details.aspx?id=13255

sagarjainhr

Где btn_FileBrowse_Click() fnc просматривает файл и вызывает функцию importFromExcel()
и вот как работает эта функция

bbirajdar

Эта загрузка установит набор компонентов, облегчающих передачу данных между существующими файлами Microsoft Office, такими как файлы Microsoft Office Access 2010 (*.mdb и *.accdb) и файлы Microsoft Office Excel 2010 (*.xls, *. xlsx и *.xlsb), в другие источники данных, такие как Microsoft SQL Server. Также поддерживается подключение к существующим текстовым файлам. Драйверы ODBC и OLEDB устанавливаются разработчиками приложений для использования при разработке своих приложений с подключением к форматам файлов Office.

sagarjainhr

Это тоже не работает....

sagarjainhr

Спасибо за вашу помощь
Теперь он работает нормально. thr не было никаких проблем со строкой подключения это была проблема с просмотром функции файла я просто прокомментировал 1 блок он работает нормально

Member 10684591

я также сталкиваюсь с той же проблемой можете ли вы просто поделиться строкой подключения

Member 12887310

привет не могли бы вы пожалуйста рассказать мне как вы решили эту проблему

Рейтинг:
43

sagarjainhr

Я решил это сам, никаких проблем с соединительной строкой не было, и там все было в порядке. Проблема была в том, что я проверял, открыт ли файл или нет, и я не закрыл этот файл после этого процесса. таким образом, он был использован другим процессом, и строка подключения не смогла получить доступ к листу excel, и это вызвало ошибку.

Пожалуйста, убедитесь, что файл не открыт или не используется каким-либо другим процессом при попытке чтения с файлом *.xlsx, если файл открыт также он отлично работает с файлом *.xls, а не в файле *.xlsx имейте это в виду при доступе к файлу *.xlsx


vikramaditya9

Я также столкнулся с той же проблемой "внешняя таблица не находится в ожидаемом формате".Я использую строку connectionString как &ГТ; параметр connectionString = "поставщика=Майкрософт.Туз.Oledb для.12.0;Источник данных=" + ExcelPath + ";дополнительные свойства=\"значение Excel 12.0;HDR съемка=да;\"";
Пожалуйста, Предложите кому-нибудь какие-нибудь проблемы с connectionstring?

Anshuwa

Поставщик=Майкрософт.Туз.Oledb для.12.0;source=d:\files\file.xlsx данных; расширенные свойства='программы Excel 8.0;HDR съемка=да

WEI LI JASMINE ZEE

ДА. Выбранный файл excel должен быть открыт, и у него не будет проблем со строкой подключения.
Если выбранный файл excel будет закрыт, я получу сообщение об ошибке "внешняя таблица не находится в ожидаемом формате".
Есть ли способ решить эту проблему? С TQ.

Рейтинг:
36

Raimis9

Изменить строку подключения:
http://www.connectionstrings.com/excel-2007[^]


sagarjainhr

Я пробовал с этой ссылкой до сих пор не могу разобраться

Рейтинг:
2

Member 14622077

я также столкнулся с той же проблемой, в которой при чтении данных из excel я получал внешнюю ошибку таблицы.

в основном файл excel, который я пытался прочитать, был сгенерирован кодом. сгенерированные кодом файлы excel не имеют свойства [имя программы] на вкладке Сведения. Из-за чего водитель неправильно себя ведет.

если вы откроете и сохраните файл проблема будет решена или же вы можете сохранить файл перед чтением с помощью приведенного ниже кода будет решена проблема ur

// Инициализация Приложения Excel
Превосходить.Приложение excelApp = новый Excel.Приложение();
// Открыть Существующий Excel
Превосходить.Рабочая тетрадь excelWorkBook = excelApp.Workbooks.Открыть("/путь УР..");


// Сохранить Excel
файл excelworkbook.Сохранить();
// Закрыть Excel
файл excelworkbook.Закрывать();
// Закрыть Приложение Excel
excelApp.Бросить();


Рейтинг:
1

Yusuf.br

Я перепробовал все предложенные здесь варианты, но ни один из них не сработал ... и наконец я обнаружил, что конкретная ячейка содержит более 12 тысяч символов. так что следите и за длиной.


Рейтинг:
0

Member 14876352

В фоновом режиме может быть открыто несколько листов excel/базы данных.... поэтому убедитесь, что у вас есть правильный лист, открытый/закрытый. Я закрыл весь лист переподключенным к базе данных.


Dave Kreskowiak

Спрашивали и отвечали Семь лет назад. В следующий раз прочтите все ответы, прежде чем отвечать самому.