Есть ли лучший способ указать "нулевые" значения в Excel? - PullRequest
4 голосов
/ 21 апреля 2011

У меня есть книга Excel 2007, содержащая таблицы данных, которые я импортирую в DataTable объекты с использованием ADO.NET.

В результате некоторых экспериментов мне удалось найти два разных способа указать, что ADO.NET:

должна обрабатывать ячейку как "нулевую".
  1. Ячейка полностью пуста.
  2. Ячейка содержит #N/A.

К сожалению, оба из них проблематичны:

  1. Большинство моих столбцов данных в Excel генерируются с помощью формул, но в Excel невозможно сгенерировать формулу, которая приводит к совершенно пустой ячейке. И только полностью пустая ячейка будет считаться нулевой (пустая строка не будет работать).

  2. Любая формула, которая оценивается как #N/A (либо из-за фактической ошибки поиска, либо из-за использования функции NA()) будет считаться нулевой. Это казалось идеальным решением, пока я не обнаружил, что книга Excel должна быть открыта , чтобы это работало. Как только вы закроете книгу, OLEDB вдруг начнет видеть все эти #N/A как строки. Это приводит к возникновению исключений, таких как следующие, при заполнении DataTable:

    Входная строка была в неправильном формате. Не удалось сохранить <# N / A> в столбце значений. Ожидаемый тип: Int32.

Вопрос: Как я могу указать нулевое значение с помощью формулы Excel без необходимости открывать рабочую книгу при заполнении DataTable? Или что можно сделать, чтобы значения #N/A считались нулевыми, даже когда рабочая книга закрыта?

Если это важно, моя строка подключения строится с использованием следующего метода:

var builder = new OleDbConnectionStringBuilder
{
    Provider = "Microsoft.ACE.OLEDB.12.0",
    DataSource = _workbookPath
};
builder.Add("Extended Properties", "Excel 12.0 Xml;HDR=Yes;IMEX=0");
return builder.ConnectionString;

(_workbookPath - полный путь к книге).

Я пробовал оба IMEX=0 и IMEX=1, но это не имеет значения.

1 Ответ

6 голосов
/ 23 апреля 2011

Вы попали в кирпичную стену, которую испытывают многие очень разочарованные пользователи Excel.К сожалению, Excel как инструмент компании широко распространен и кажется достаточно надежным, к сожалению, поскольку каждая ячейка / столбец / строка имеет свой тип данных, это делает его кошмаром для работы с другими инструментами, такими как MySQL, SQL Server, R, RapidMiner, SPSS исписок можно продолжить.Кажется, что Excel 2007/2010 не очень хорошо поддерживается и тем более при учете 32/64-битных версий, что является скандальным в наше время.

Основная проблема заключается в том, что когда ACE / JetДля доступа к каждому полю в Excel они используют параметр реестра «TypeGuessRows», чтобы определить, сколько строк нужно использовать для оценки типа данных.Значение по умолчанию для «строк для сканирования» составляет 8 строк.Параметр реестра «TypeGuessRows» может указывать целочисленное значение от одной (1) до шестнадцати (16) строк или можно указать ноль (0) для сканирования всех существующих строк.Если вы не можете изменить настройки реестра (например, в 90% офисных сред), это усложняет жизнь, так как предполагаемые строки ограничены первыми 8.

Например, без изменения реестра, еслипервое появление # N / A находится в первых 8 строках, тогда IMEX = 1 вернет ошибку в виде строки "# N / A".Если IMEX = 0, то # N / A вернет 'Null'.

Если первое вхождение # N / A находится за пределами первых 8 строк, то оба IMEX = 0 и IMEX = 1 оба возвращают 'Null'(при условии, что требуемый тип данных числовой).

С изменением реестра (TypeGuessRows = 0) все должно быть в порядке.

Возможно, есть 4 варианта:

  1. Изменить параметр реестра TypeGuessRows = 0

  2. Вывести все возможные варианты типа в первых 8 строках как «фиктивные данные» (например, memo-поля / nchar (max) / ошибки)# Н / Д и т. Д.)

  3. Исправить ВСЕ аномалии типов данных в Excel

  4. Не использовать Excel - серьезно стоит подумать!

Редактировать: Просто поставить загрузчик :) Еще 2 вещи, которые меня действительно раздражают;если первое поле на листе остается пустым в первых 8 строках и вы не можете редактировать настройки реестра, тогда весь лист возвращается как пустой (многие забавные разговоры, говорящие менеджерам, что они дураки для объединения ячеек!).Кроме того, если в Excel 2007/2010 у вас есть отдел, возвращающий лист с> 255 столбцами / полями, то у вас возникнут огромные проблемы, если вам нужен несмежный импорт (например, введите столбец 1 и данные в столбцы 255+)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...