DBNull в непустой ячейке при чтении файла Excel через OleDB - PullRequest
5 голосов
/ 08 июля 2010

Я использую OleDB для чтения файла Excel. Один из столбцов имеет общий формат и содержит как строки с буквами, так и значения, состоящие только из цифр. Строковые значения извлекаются без проблем, но чистые числовые значения извлекаются как DBNull.

Как решить?

Я использую следующую строку подключения для открытия файла Excel 2003 (xls):

"Provider=Microsoft.Jet.OLEDB.4.0;
 Data Source=C:\\file.xls;
 Extended Properties=\"Excel 8.0;HDR=Yes;IMEX=1\""

Ответы [ 2 ]

6 голосов
/ 08 июля 2010

Я нашел некоторую документацию на веб-сайте Microsoft, которая относится к вашему сценарию. Они рекомендуют преобразовывать все числовые значения в строки.

http://support.microsoft.com/kb/257819

Как указывалось ранее, ADO должен угадать тип данных для каждого столбца в рабочей таблице или диапазоне Excel. (Это не зависит от настроек форматирования ячеек Excel.) Серьезная проблема может возникнуть, если в одном столбце смешаны числовые значения с текстовыми значениями. И Jet, и поставщик ODBC возвращают данные типа большинства, но возвращают значения NULL (пустые) для типа данных меньшинства. Если два типа одинаково смешаны в столбце, поставщик выбирает числовое значение поверх текста.

Например:

* In your eight (8) scanned rows, if the column contains five (5) numeric values and three (3) text values, the provider returns five (5) numbers and three (3) null values.
* In your eight (8) scanned rows, if the column contains three (3) numeric values and five (5) text values, the provider returns three (3) null values and five (5) text values.
* In your eight (8) scanned rows, if the column contains four (4) numeric values and four (4) text values, the provider returns four (4) numbers and four (4) null values.
1 голос
/ 09 декабря 2010

У меня та же проблема, но со строковыми значениями. Числовые значения возвращаются, но строковые значения возвращаются как NULL. Я хочу загрузить числовые значения в виде строковых значений. Столбец может содержать цифры и нечисловые коды (например, 100344567 и PRD001X01).

Драйвер Excel считает, что столбец имеет числовой тип, поскольку значения в первых 8 строках имеют числовой тип.

Даже если я определяю ячейки как текст (формат ячейки), это не работает.

Чтобы заставить драйвер «видеть» столбец как строку, я просто поставил кавычку перед числовым значением ('100344567). Это превращает числовое значение в строку.

Это значение из 8 строк определено в реестре HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Jet \ 4.0 \ Engines \ Excel \ -> TypeGuessRows = 8.

Надеюсь, это поможет.

...