string connString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=localhost;Extended Properties=""Excel 8.0;HDR=Yes;IMEX=2"
Привет. Какова цель IMEX?
string connString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=localhost;Extended Properties=""Excel 8.0;HDR=Yes;IMEX=2"
Привет. Какова цель IMEX?
"Если вы хотите прочитать заголовки столбцов в наборе результатов (используя HDR = NO, хотя есть заголовок), а данные столбца являются числовыми, используйте IMEX = 1, чтобы избежать сбоя.
Чтобы всегда использовать IMEX = 1, это более безопасный способ получения данных для столбцов смешанных данных..."
Обратите внимание, что значение IMEX может быть очень важным, когда вам нужно записать данные в Excel. Быстрый поиск в Интернете на IMEX нашел множество статей о проблемах с различными значениями IMEX
Возникает потенциальная проблема при чтении файлов Excel с помощью OleDbConnection.
Если вы используете
"Extended Properties='Excel 8.0;HDR=NO;IMEX=3;'"
для столбца, подобного следующему, где первые 8 строк имеют 4 (или более) числовые значения, то тип считается числовым, а строковые значения считаются нулевыми.
Обратите внимание, что заголовок здесь не используется в качестве заголовка (HDR = NO), поэтому строка "zipcode" является первой строкой. (Эти почтовые индексы из Швеции, если вы не узнаете их формат.)
1) zipcode
2) 125 45
3) 115 50
4) 18735
5) 11335
6) 13940
7) 181 55
8) 11759
9) 176 74
10) 137 38
Но если ваши данные выглядят так, где только 3 являются числовыми из первых 8 строк
1) zipcode
2) 125 45
3) 115 50
4) 18735
5) 11335
6) 139 40 <-- This one changed so that it is a string
7) 181 55
8) 11759
9) 176 74
10) 137 38
тогда он работает, он читает все, как строки.
Итак, первый случай - проблема. Но есть решение.
Скажем, вы используете
"Extended Properties='Excel 8.0;HDR=YES;IMEX=1;'"
где мы изменили IMEX на 1 и HDR на YES, тогда он будет считывать данные как строки в обоих случаях выше. Но позвольте сказать, что у нас есть такие данные
1) zipcode
2) 12545
3) 11550
4) 18735
5) 11335
6) 13940
7) 18155
8) 11759
9) 17674
10) 137 38
тогда все первые 8 строк данных являются числовыми, а затем снова не выполняются, хотя IMEX = 1.
Вы можете решить эту проблему следующим образом. Измените строку подключения на
"Extended Properties='Excel 8.0;HDR=NO;IMEX=1;'"
Обратите внимание, что мы сохранили IMEX = 1, но изменили HDR на NO.
Теперь строка 1 больше не обрабатывается как заголовок, а "zipcode" - считанные как данные, и поскольку это явно строка, все строки считываются как строки (что работает IMEX = 1).
Существует несколько недостатков этого метода. Оба могут быть решены:
1) Вы не можете ссылаться на столбец по его названию (zipcode), но нужно использовать, например, F7 в зависимости от того, где находится столбец.
Вы можете решить это, выяснив, где находится столбец zipcode (можно сделать программно) и изменить текст SQL соответственно на изменение "zipcode" на, например, "F7".
2) Значение "zipcode" появится в ваших данных.
Это может быть разрешено с помощью F7 < > 'zipcode' в вашем предложении where. Один может подумать, что это будет противодействовать тому, что мы включили zipcode (являющийся строкой), чтобы убедиться, что все строки рассматриваются как строки. После проверки этого оказалось, что предложение where трюк, который исключает "zipcode" , не имеет такого противодействия эффект.
Когда вы читаете файл excel в таблицу данных, таблица данных считывает значения столбца и после 8-10 записей назначает тип данных столбцу. Например, если значения столбца:
11.0
22.0
33.0
44.0
55.0
66.0
77.0
88.0
99.0
а
Таким образом, таблица данных не будет иметь значения abc, поскольку столбцу был присвоен тип данных "Двойной". Чтобы избежать этого, и для чтения полных данных используется IMEX = 1.
Пожалуйста, прокомментируйте дальнейшие вопросы.
Пожалуйста, используйте обобщенную функцию в модуле...
Public Function DeleteBlankRowsfromDataset(ByRef Dtset As DataSet) As Boolean
Try
Dtset.Tables(0).AsEnumerable().Where(Function(row) row.ItemArray.All(Function(field) field Is Nothing Or field Is DBNull.Value Or field.Equals(""))).ToList().ForEach(Sub(row) row.Delete())
Dtset.Tables(0).AcceptChanges()
DeleteBlankRowsfromDataset = True
Catch ex As Exception
MsgBox("Deleting Blank Records in Dataset Failed")
DeleteBlankRowsfromDataset = False
End Try
End Function